首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

MySQL 主从复制 + MySQL Router 部署测试

2023-11-11 来源:椛椭教育网

1、MySQLDB1  192.168.1.41  (MySQL 主节点)

2、MySQLDB2  192.168.1.42  (MySQL从节点)

3、MySQLDB3  192.168.1.43  (MySQL从节点)

4、MySQLRouter  192.168.1.47  (MySQLRouter服务节点)

软件版本说明:

1、操作系统  CentOS6.6_x86_64

2、MySQLServer  5.7.16

3、MySQLRouter  2.0.4

一、部署MySQL主从复制

----------------------- 复制创建及配置主要步骤 -----------------------------------------

1、Master 端启用二进制日志,指定唯一的 server_id

2、Slave 端配置唯一的 server_id

3、Master 端创建复制专用帐号

4、记录 Master 端日志信息并创建镜像

5、配置 Slave 端的连接

-------------------------------------------------------------------------------------------

1、系统平台: CentOS 6.6 (64位)

2、软件版本:mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz

3、为了模拟现实环境情况做如下前提条件假设:

     1)、在搭建Master和Salve1时为一个全新的环境,即主数据库中无任何数据,Master和Slave1均为新环境部署

     2)、在现有复制环境(Master+Slave1)中新增一个Slave2节点,现有复制环境中已有数据存在和修改过程执行

     3)、Master节点的端口为3306,Slave1节点端口为3306,Slave2节点端口为3306

     4)、为了部署方便,安装包使用二进制程序进行部署

-----------------------------------------  部署实现过程  -----------------------------------------------

1、用户及相关目录创建

--MySQLDB1 节点

[root@mysqldb1 ~]# groupadd mysql

[root@mysqldb1 ~]# useradd mysql -g mysql

[root@mysqldb1 ~]# mkdir /mysql

[root@mysqldb1 ~]# mkdir /mytmp

[root@mysqldb1 ~]# passwd mysql

--MySQLDB2 节点

[root@mysqldb2 ~]# groupadd mysql

[root@mysqldb2 ~]# useradd mysql -g mysql

[root@mysqldb2 ~]# mkdir /mysql

[root@mysqldb2 ~]# mkdir /mytmp

[root@mysqldb2 ~]# passwd mysql

--MySQLDB3 节点

[root@mysqldb3 ~]# groupadd mysql

[root@mysqldb3 ~]# useradd mysql -g mysql

[root@mysqldb3 ~]# mkdir /mysql

[root@mysqldb3 ~]# mkdir /mytmp

[root@mysqldb3 ~]# passwd mysql

2、设置用户操作系统资源的限制

--以避免在启动mysql服务是会报:

2017-04-11 17:27:03 3175 [Warning] Buffered warning: Changed limits: max_open_files: 1024 (requested 5000)

2017-04-11 17:27:03 3175 [Warning] Buffered warning: Changed limits: table_open_cache: 431 (requested 2000)

之类的警告信息

[root@mysqla ~]# vi /etc/security/limits.conf

在文件的最后添加如下内容

mysql soft nproc 2047

mysql hard nproc 16384

mysql soft nofile 1024

mysql hard nofile 65535

3、解压上传的二进制安装包程序并复制到目标目录下

--MySQLDB1 节点

[root@mysqldb1 mytmp]# tar -xzvf mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz 

[root@mysqldb1 mytmp]# mv mysql-5.7.16-linux-glibc2.5-x86_64 /mysql/3306

--MySQLDB2 节点

[root@mysqldb2 mytmp]# tar -xzvf mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz 

[root@mysqldb2 mytmp]# mv mysql-5.7.16-linux-glibc2.5-x86_64 /mysql/3306

--MySQLDB3 节点

[root@mysqldb3 mytmp]# tar -xzvf mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz 

[root@mysqldb3 mytmp]# mv mysql-5.7.16-linux-glibc2.5-x86_64 /mysql/3306

4、便于方便管理创建单独的日志文件存放目录

--MySQLDB1 节点

[root@mysqldb1 3306]# mkdir logs

--MySQLDB2 节点

[root@mysqldb2 3306]# mkdir logs

--MySQLDB3 节点

[root@mysqldb3 3306]# mkdir logs

5、目录权限修改

--MySQLDB1 节点

[root@mysdb1 ~]# chown -R mysql:mysql /mysql

--MySQLDB2 节点

[root@mysqldb2 ~]# chown -R mysql:mysql /mysql

--MySQLDB3 节点

[root@mysqldb3 ~]# chown -R mysql:mysql /mysql

6、数据库初始化安装

--MySQLDB1 节点

[root@mysqldb1 ~]# su - mysql

[mysql@mysqldb1 ~]$ cd /mysql/3306

[mysql@mysqldb1 3306]$ ./bin/mysqld  --initialize --user=mysql --basedir=/mysql/3306 --datadir=/mysql/3306/data

--MySQLDB2 节点

[root@mysqldb2 ~]# su - mysql

[mysql@mysqldb2 ~]$ cd /mysql/3306

[mysql@mysqldb2 3306]$ ./bin/mysqld  --initialize --user=mysql --basedir=/mysql/3306 --datadir=/mysql/3306/data

--MySQLDB3 节点

[root@mysqldb3 ~]# su - mysql

[mysql@mysqldb3 ~]$ cd /mysql/3306

[mysql@mysqldb3 3306]$ ./bin/mysqld  --initialize --user=mysql --basedir=/mysql/3306 --datadir=/mysql/3306/data

注:1、数据库初始化的命令与5.6版本有所不同

        2、数据库初始化完后,会自动为 root 用户生成一个密码,记住该密码,

             不过该密码很快很过期,所以需要在配置文件添加 skip-grant-tables 来启动数据库实例

      3、安装aio依赖包: yum  install  libaio*

7、参数文件配置

--MySQLDB1 节点  /mysql/3306/my.cnf

[client]

default_character_set = utf8

port = 3306

socket = /tmp/mysql3306.sock

[mysqld]

basedir = /mysql/3306

datadir = /mysql/3306/data

user = mysql

port = 3306

server_id = 13306

character_set_server = utf8

socket = /tmp/mysql3306.sock

pid-file = /tmp/mysql3306.pid

log-bin = /mysql/3306/logs/bin_log

relay-log = /mysql/3306/logs/relay_log

log-error = /mysql/3306/logs/mysql_error.log

explicit_defaults_for_timestamp = true

expire_logs_days = 10

max_binlog_size = 100M

binlog-do-db = testdb   #复制数据库名称

binlog-ignore-db = mysql

--MySQLDB2 节点 /mysql/3306/my.cnf

[client]

default_character_set = utf8

port = 3306

socket = /tmp/mysql3306.sock

[mysqld]

basedir = /mysql/3306

datadir = /mysql/3306/data

user = mysql

port = 3306

server_id = 23306

character_set_server = utf8

socket = /tmp/mysql3306.sock

pid-file = /tmp/mysql3306.pid

log-bin = /mysql/3306/logs/bin_log

relay-log = /mysql/3306/logs/relay_log

log-error = /mysql/3306/logs/mysql_error.log

explicit_defaults_for_timestamp = true

expire_logs_days = 10

max_binlog_size = 100M

--MySQLDB3 节点 /mysql/3306/my.cnf

[client]

default_character_set = utf8

port = 3306

socket = /tmp/mysql3306.sock

[mysqld]

basedir = /mysql/3306

datadir = /mysql/3306/data

user = mysql

port = 3306

server_id = 33306

character_set_server = utf8

socket = /tmp/mysql3306.sock

pid-file = /tmp/mysql3306.pid

log-bin = /mysql/3306/logs/bin_log

relay-log = /mysql/3306/logs/relay_log

log-error = /mysql/3306/logs/mysql_error.log

explicit_defaults_for_timestamp = true

expire_logs_days = 10

max_binlog_size = 100M

8、清理配置参数文件

在Linux平台下,mysql程序默认会按照以下顺序扫描路径寻找配置文件

/etc/my.cnf

/etc/mysql/my.cnf

SYSCONFDIR/my.cnf   #通过CMake源代码编译时指定的SYSCONFDIR的参数指定的路径

$MYSQL_HOME/my.cnf  #MYSQL_HOME环境变量所在路径,即mysql安装路径(basedir)

~/.my.cnf  #~表示到当更前用户根目录下寻找

通过命令  find  /  -iname  my.cnf  查询配置文件的存在性,仅保留 MYSQL_HOME/my.cnf 配置文件。

注:使用如下命令可查看mysql实例的配置文件搜索顺序

[root@mysqldb1 bin]# mysql --help | grep ‘/my.cnf‘

9、配置启动脚本

--MySQLDB1 节点实例

[root@mysqla 3306]# cp support-files/mysql.server /etc/init.d/mysql3306

[root@mysqla 3306]# vi /etc/init.d/mysql3306

将如下内容

#basedir=...

#datadir=...

修改为:

basedir=/mysql/3306

datadir=/mysql/3306/data

--MySQLDB2 节点实例

[root@mysqlb 3306]# cp support-files/mysql.server /etc/init.d/mysql3306

[root@mysqlb 3306]# vi /etc/init.d/mysql3306

将如下内容

#basedir=...

#datadir=...

修改为:

basedir=/mysql/3306

datadir=/mysql/3306/data

--MySQLDB3 节点实例

[root@mysqlc 3306]# cp support-files/mysql.server /etc/init.d/mysql3306

[root@mysqlc 3306]# vi /etc/init.d/mysql3306

将如下内容

#basedir=...

#datadir=...

修改为:

basedir=/mysql/3306

datadir=/mysql/3306/data

10、数据库服务启动

--MySQLDB1 节点

[mysql@mysqldb1 ~]$ service  mysql3306  start

--MySQLDB2 节点

[mysql@mysqldb2 ~]$ service  mysql3306  start

--MySQLDB3 节点

[mysql@mysqldb3 ~]$ service  mysql3306  start

11、登录数据库以添加远程登录帐号信息

[mysql@mysqldb1 ~]$ mysql -u root -p  -P 3306 --socket=/tmp/mysql3306.sock

[mysql@mysqldb2 ~]$ mysql -u root -p  -P 3306 --socket=/tmp/mysql3306.sock

[mysql@mysqldb3 ~]$ mysql -u root -p  -P 3306 --socket=/tmp/mysql3306.sock

注:使用mysql用户执行上述命令前,先配置相关环境变量值

/home/mysql/.bash_profile

添加如下内容:

MYSQL3306HOME=/mysql/3306

PATH=$PATH:$MYSQL3306HOME/bin

export MYSQL3306HOME PATH

注:上述登录数据库是需有参数  --socket ,否则会报出如下错误:

Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock

--为了安全起见,先删除默认生成的用户相关信息在创建一个指定名称的数据库管理员帐号

mysql> set  password  for  root@localhost  = password(‘rootroot‘);

mysql> delete from mysql.db;

mysql> delete from mysql.user;

mysql> grant all privileges on *.* to ‘sysadmin‘@‘localhost‘ identified by ‘mysql‘ with grant option;

mysql> grant all privileges on *.* to ‘sysadmin‘@‘127.0.0.1‘ identified by ‘mysql‘ with grant option;

mysql> flush privileges;

mysql> select host,user from user where user=‘sysadmin‘;

--退出当前连接,再次登录数据库,以验证新建数据库管理员帐号的合法性

--以 MySQLDB1 节点为例测试

mysql> exit;

[mysql@mysqldb1 ~]$ mysql -h localhost -u sysadmin -p -P 3306 -S /tmp/mysql3306.sock

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or g.

Your MySQL connection id is 3

Server version: 5.7.16-log MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type ‘help;‘ or ‘h‘ for help. Type ‘c‘ to clear the current input statement.

mysql>

--注:为了安全的需要,上述的连接数据库命令行中密码没有直接写出,而是在使用 -p 参数,再在提示符行中输入密码

确认有当前添加的用户即可进行远程登录数据库。

12、设置数据库自动启动

--MySQLDB1 节点

[root@mysqldb1 ~]# chkconfig --add mysql3306

[root@mysqldb1 ~]# chkconfig mysql3306 --list

mysql3306 0:off 1:off 2:on 3:on 4:on 5:on 6:off

[root@mysqldb1 ~]# 

--MySQLDB2 节点

[root@mysqldb2 ~]# chkconfig --add mysql3306

[root@mysqldb2 ~]# chkconfig mysql3306 --list

mysql3306 0:off 1:off 2:on 3:on 4:on 5:on 6:off

[root@mysqldb2 ~]# 

--MySQLDB3 节点

[root@mysqldb3 ~]# chkconfig --add mysql3306

[root@mysqldb3 ~]# chkconfig mysql3306 --list

mysql3306 0:off 1:off 2:on 3:on 4:on 5:on 6:off

[root@mysqldb3 ~]# 

13、重启系统验证数据库自动启动服务功能

--重启系统

[root@mysqldb1 ~]#  shutdown -r now

[root@mysqldb2 ~]#  shutdown -r now

[root@mysqldb3 ~]#  shutdown -r now

--查看数据库服务是否随系统启动

--MySQLDB1 节点

[root@mysqldb1 ~]# service mysql3306 status

MySQL running (2122) [ OK ]

[root@mysqldb1 ~]# 

--MySQLDB2 节点

[root@mysqldb2 ~]# service mysql3306 status

MySQL running (2117) [ OK ]

[root@mysqldb2 ~]# 

--MySQLDB3 节点

[root@mysqldb3 ~]# service mysql3306 status

MySQL running (2119) [ OK ]

[root@mysqldb3 ~]# 

14、在master节点创建复制专业帐号

mysql> grant replication slave on *.* to ‘repl‘@‘%‘ identified by ‘repl‘;

Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

15、查看 master 主机信息 (slave 服务器配置需要改信息)

[mysql@mysqldb1 ~]$ mysql -h localhost -u sysadmin -p -P 3306 -S /tmp/mysql3306.sock

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or g.

Your MySQL connection id is 3

Server version: 5.7.16-log MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type ‘help;‘ or ‘h‘ for help. Type ‘c‘ to clear the current input statement.

mysql> show master status G

*************************** 1. row ***************************

                        File: mysql_bin.000004

                Position: 403

      Binlog_Do_DB: test

 Binlog_Ignore_DB: mysql

 Executed_Gtid_Set:

1 row in set (0.00 sec)

mysql> 

16、在 MySQLDB2 节点配置复制,并启动复制

mysql> show slave status G

Empty set (0.00 sec)

mysql> change master to

    -> master_host=‘192.168.1.41‘,

    -> master_port=3306,

    -> master_user=‘repl‘,

    -> master_password=‘repl‘,

    -> master_log_file=‘mysql_bin.000004‘,

    -> master_log_pos=403;

Query OK, 0 rows affected, 2 warnings (0.06 sec)

mysql> start slave;

Query OK, 0 rows affected (0.17 sec)

mysql> 

17、复制功能测试

--MySQLDB1 节点

mysql> create database testdb;

mysql> use testdb;

Database changed

mysql> select database();

+------------+

| database() |

+------------+

| testdb |

+------------+

1 row in set (0.00 sec)

mysql> create table t1(id int, name varchar(20));

Query OK, 0 rows affected (1.71 sec)

mysql> select * from t1;

Empty set (0.00 sec)

mysql> insert into t1 (id,name) values(1,‘yangchao‘);

Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;

+------+----------+

| id | name |

+------+----------+

| 1 | yangchao |

--MySQLDB1 节点

mysql> select * from t1;

Empty set (0.01 sec)

mysql> select * from t1;

+------+----------+

| id | name |

+------+----------+

| 1 | yangchao |

+------+----------+

1 row in set (0.00 sec)

mysql> 

----------------------- 复制功能正常 --------------------------------------

------------------ 动态添加 MySQLDB3 节点(innobackupex) ---------------------------

18、在 MySQLDB1 节点执行全库备份

[root@mysqldb1 ~]#  innobackupex --user=sysadmin --password=mysql --socket=/tmp/mysql3306.sock --defaults-file=/mysql/3306/my.cnf --slave-info /home/mysql

xtrabackup: Error: --defaults-file must be specified first on the command line

----提示配置文件参数必须放在第一位

[root@mysqldb1 ~]#  innobackupex --defaults-file=/mysql/3306/my.cnf --user=sysadmin --password=mysql --socket=/tmp/mysql3306.sock  --slave-info /home/mysql

19、将 /home/mysql/yyyy-mm-dd_hh24-mi-ss 这个文件夹拷贝到 Salve2 节点的 /home/mysql 目录下

注:或者直接用 scp 命令拷贝

scp  -r  /home/mysql/yyyy-mm-dd_hh24-mi-ss  root@mysrvc:/home/mysql

20、停止 MySQLDB3 节点上的mysql实例,并备份 data 目录

[root@mysqldb3 ~]# service mysql3306 stop

[root@mysqldb3 ~]# cd /mysql/3306

[root@mysqldb3 3306]# mv data data.bak

21、执行恢复

[root@mysqldb3 3306]# innobackupex --defaults-file=/mysql/3306/my.cnf --user=sysadmin --apply-log /home/mysql/yyyy-mm-dd_hh24-mi-ss

[root@mysqldb3 3306]# innobackupex --defaults-file=/mysql/3306/my.cnf --user=sysadmin --copy-back /home/mysql/yyyy-mm-dd_hh24-mi-ss

22、修改 data 目录所有者权限  (如果使用mysql用户备份操作时,则无需做目录所有者权限修改)

[root@mysqldb3 3306]# chown -R mysql:mysql data

23、启动数据库实例

[root@mysqldb3 3306]# service mysql3306 start

24、在 MySQLDB3 节点查看 Master 节点的二进制文件名和位置信息

[root@mysqldb3 3306]# cat data/xtrabackup_binlog_pos_innodb

mysql_bin.000004 976

[root@mysqldb3 3306]# 

25、配置 MySQLDB3 节点复制信息

[root@mysqldb3 3306]#  su - mysql

[mysql@mysqldb3 ~]# mysql -u sysadmin -pmysql -P 3306 --socket=/tmp/mysql3306.sock

mysql> show slave status G

Empty set (0.00 sec)

mysql> change master to

    -> master_host=‘192.168.1.41‘,

    -> master_port=3306,

    -> master_user=‘repl‘,

    -> master_password=‘repl‘,

    -> master_log_file=‘mysql_bin.000004‘,

    -> master_log_pos=976;

Query OK, 0 rows affected, 2 warnings (0.06 sec)

mysql> start slave;

Query OK, 0 rows affected (0.17 sec)

mysql> 

26、在 MySQLDB3 启动复制功能

mysql> start save;

27、测试

在 MySQLDB1节点的test数据库中执行创建数据表或数的更新操作,验证在 MySQLDB2 和 MySQLDB3 节点的test数据库中是否正常复制。

============================================

MySQL主从复制几个重要的启动选项

(1)、log-slave-updates

log-slave-updates 这个参数用来配置从服务器的更新是否写入二进制日志,这个选项默认是不打开的,但是,如果这个从服务器B是服务器A的从服务器,同时还作为服务器C的主服务器,那么就需要开发这个选项,这样它的从服务器C才能获得它的二进制日志进行同步操作。

(2)、master-connect-retry

master-connect-retry 这个参数是用来设置在和主服务器连接丢失的时候,重试的时间间隔,默认是60秒。

(3)、read-only

read-only是用来限制普通用户对从数据库的更新操作,以确保从数据库的安全性,不过如果是超级用户依然可以对从数据库进行更新操作。

(4)、slave-skip-errors

在复制过程中,由于各种的原因,从服务器可能会遇到执行BINLOG中的SQL出错的情况,在默认情况下,服务器会停止复制进程,不再进行同步,等到用户自行来处理。

Slave-skip-errors的作用就是用来定义复制过程中从服务器可以自动跳过的错误号,当复制过程中遇到定义的错误号,就可以自动跳过,直接执行后面的SQL语句。

--slave-skip-errors=[err1,err2,…….|ALL]

但必须注意的是,启动这个参数,如果处理不当,很可能造成主从数据库的数据不同步,在应用中需要根据实际情况,如果对数据完整性要求不是很严格,那么这个选项确实可以减轻维护的成本

===================================================

二、部署MyRouter服务

1、解压安装程序文件

[root@mysqlrouter mytmp]#  tar -xzvf mysql-router-2.0.4-linux-glibc2.12-x86-64bit.tar.gz

2、重命名安装文件夹

[root@mysqlrouter mytmp]#  mv mysql-router-2.0.4-linux-glibc2.12-x86-64bit /usr/local/mysqlrouter

3、创建日志和配置相关文件存放目录

[root@mysqlrouter mytmp]# cd /usr/local/mysqlrouter

[root@mysqlrouter mysqlrouter]# mkdir logs

[root@mysqlrouter mysqlrouter]# mkdir etc

4、创建配置文件 (利用模板文件创建)

[root@mysqlrouter mysqlrouter]#cp share/doc/mysqlrouter/sample_mysqlrouter.ini ./etc/mysqlrouter.ini

配置项内容如下:

[DEFAULT]

logging_folder = /usr/local/mysqlrouter/logs

plugin_folder = /usr/local/mysqlrouter/lib/mysqlrouter

config_folder = /usr/local/mysqlrouter/etc

runtime_folder = /usr/local/mysqlrouter/run

[logger]

level = INFO

[routing:read_write]

bind_address = 192.168.1.47

bind_port = 7001

mode = read-write

destinations = 192.168.1.41:3306

max_connections = 65535

max_connect_errors = 100

client_connect_timeout = 9

[routing:read_only]

bind_address = 192.168.1.47

bind_port = 7002

mode = read-only

destinations = 192.168.1.42:3306,192.168.1.43:3306

max_connections = 65535

max_connect_errors = 100

client_connect_timeout = 9

[keepalive]

interval = 60

注:参数说明

bind_address  指定mysql router绑定的服务器

bind_port         指定绑定的端口

destinations     指定后端mysql server 列表 (ip:port 格式,使用逗号分隔)

mode               读写模式(read-write, read_only)

5、启动 mysql router

[root@mysqlrouter mysqlrouter]# cd bin

[root@mysqlrouter bin]# ./mysqlrouter  -c  /usr/local/mysqlrouter/etc/mysqlrouter.ini  &

技术分享

三、验证测试

1、读写分离测试

读写分离是通过在配置文件中配置的不同端口实现

由于mysqlrouter节点未安装mysql客户端程序,所以在mysqldb1节点测试

登录写节点:端口7001

mysql  -h  192.168.1.47  -u  yangchao  -p -P 7001

技术分享

登录读节点:端口7002

mysql  -h  192.168.1.47  -u  yangchao  -p -P 7002

技术分享

由上测试可知:两次从7002读取端口登录的主机节点都是在配置文件中配置的只读节点。

2、读取复制均衡测试

登录读节点:端口7002

mysql  -h  192.168.1.47  -u  yangchao  -p -P 7002

技术分享

技术分享

由上测试的4次通过登录读取端口7002可知,分别在mysqldb2,mysqldb3两个读取节点间轮询访问,实现了读取操作的复制均衡功能。

3、高可用测试

1)、读取节点的高可用性:

先关闭读取节点mysqldb2

技术分享

mysql  -h  192.168.1.47  -u yangchao  -p  -P  7002

技术分享

由上测试可知:两次的7002端口登录都是在存活节点mysqldb3上。

2)、读写节点的高可用性:

修改配置文件,为读写节点配置如下:

[routing:read_write]

bind_address = 192.168.1.47

bind_port = 7001

mode = read-write

destinations = 192.168.1.41:3306,192.168.1.42:3306

停止读写节点 mysqldb1

技术分享

登录 7001 端口:

技术分享

登录的是 mysqldb2 节点实例

插入记录测试:

技术分享

能成功插入数据。

在读取节点查看记录是否同步:

mysql  -h  localhost  -u  yangchao  -p  -P 3306  -S  /tmp/mysql3306.sock

技术分享

由上测试可知:读写的主节点可以实现故障切换,但并不能实现其复制角色色转变。

注:

1、在重新启动mysqldb1 节点实例服务后,再登录读写节点时也并不能登录到mysqldb1实例了,需要重新启动mysqlrouter服务后,方能实现登录读写节点是mysqldb1节点主机。

2、由于其复制均衡采用的是轮询的方式,经测试爱多个从节点中某个实例故障后,mysqlrouter仍然会轮询访问该故障节点,所以其仅实现的简单轮询负载而已,不能对节点状态实时监控。

3、本测试案例未考虑mysqlrouter的高可用性,其高可用性的实现可以使用keepalived。

本文出自 “独孤九剑” 博客,请务必保留此出处http://130030.blog.51cto.com/120030/1915338

MySQL 主从复制 + MySQL Router 部署测试

标签:mysql router

小编还为您整理了以下内容,可能对您也有帮助:

如何配置MySQL主从复制

MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环。当一个从服务器连接到主服务器时,它通知主服务器从服务器在日志中读取的最

MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环。当一个从服务器连接到主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知下一次更新。

为什么使用主从复制?

1、主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为备份。

2、通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。但是不要同时在主从服务器上进行更新,这样可能引起冲突。

3、使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。

MySQL使用3个线程来执行复制功能(其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让主服务器发送二进制日志。主服务器创建一个线程将二进制日志中的内容发送到从服务器。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,从服务器使用此线程读取中继日志并执行日志中包含的更新。SHOW PROCESSLIST语句可以查询在主服务器上和从服务器上发生的关于复制的信息。

默认中继日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是从服务器主机名,nnnnnn是序列号。用连续序列号来创建连续中继日志文件,从000001开始。从服务器跟踪中继日志索引文件来识别目前正使用的中继日志。默认中继日志索引文件名为host_name-relay-bin.index。在默认情况,这些文件在从服务器的数据目录中被创建。中继日志与二进制日志的格式相同,并且可以用mysqlbinlog读取。当SQL线程执行完中继日志中的所有事件后,中继日志将会被自动删除。

从服务器在数据目录中另外创建两个状态文件--master.info和relay-log.info。状态文件保存在硬盘上,从服务器关闭时不会丢失。下次从服务器启动时,读取这些文件以确定它已经从主服务器读取了多少二进制日志,以及处理自己的中继日志的程度。

设置主从复制:

1、确保在主服务器和从服务器上安装的MySQL版本相同,并且最好是MySQL的最新稳定版本。

2、在主服务器上为复制设置一个连接账户。该账户必须授予REPLICATION SLAVE权限。如果账户仅用于复制(推荐这样做),则不需要再授予任何其它权限。

mysql> GRANT REPLICATION SLAVE ON *.*

TO 'replication'@'%.yourdomain.com' IDENTIFIED BY 'slavepass';

3、执行FLUSH TABLES WITH READ LOCK语句清空所有表和块写入语句:

mysql> FLUSH TABLES WITH READ LOCK;

保持mysql客户端程序不要退出。开启另一个终端对主服务器数据目录做快照。

shell> cd /usr/local/mysql/

shell> tar -cvf /tmp/mysql-snapshot.tar ./data

如果从服务器的用户账户与主服务器的不同,你可能不想复制mysql数据库。在这种情况下,应从归档中排除该数据库。你也不需要在归档中包括任何日志文件或者master.info或relay-log.info文件。

当FLUSH TABLES WITH READ LOCK所置读锁定有效时(即mysql客户端程序不退出),读取主服务器上当前的二进制日志名和偏移量值:

mysql > SHOW MASTER STATUS;

+---------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+---------------+----------+--------------+------------------+

| mysql-bin.003 | 73 | test | manual,mysql |

+---------------+----------+--------------+------------------+

File列显示日志名,而Position显示偏移量。在该例子中,二进制日志值为mysql-bin.003,偏移量为73。记录该值。以后设置从服务器时需要使用这些值。它们表示复制坐标,,从服务器应从该点开始从主服务器上进行新的更新。

如果主服务器运行时没有启用--logs-bin,SHOW MASTER STATUS显示的日志名和位置值为空。在这种情况下,当以后指定从服务器的日志文件和位置时需要使用的值为空字符串('')和4.

取得快照并记录日志名和偏移量后,回到前一中端重新启用写活动:

mysql> UNLOCK TABLES;

4、确保主服务器主机上my.cnf文件的[mysqld]部分包括一个log-bin选项。该部分还应有一个server-id=Master_id选项,其中master_id必须为1到232–1之间的一个正整数值。例如:

[mysqld]

log-bin

server-id=1

如果没有提供那些选项,应添加它们并重启服务器。

5、停止从服务器上的mysqld服务并在其my.cnf文件中添加下面的行:

[mysqld]

server-id=2

slave_id值同Master_id值一样,必须为1到232–1之间的一个正整数值。并且,从服务器的ID必须与主服务器的ID不相同。

6、将数据备据目录中。确保对这些文件和目录的权限正确。服务器 MySQL运行的用户必须能够读写文件,如同在主服务器上一样。

Shell> chown -R mysql:mysql /usr/local/mysql/data

7、启动从服务器。在从服务器上执行下面的语句,用你的系统的实际值替换选项值:

mysql> CHANGE MASTER TO

MASTER_HOST='master_host_name',

MASTER_USER='replication_user_name',

MASTER_PASSWORD='replication_password',

MASTER_LOG_FILE='recorded_log_file_name',

MASTER_LOG_POS=recorded_log_position;

8、启动从服务器线程:

mysql> START SLAVE;

执行这些程序后,从服务器应连接主服务器,并补充自从快照以来发生的任何更新。

9、如果出现复制错误,从服务器的错误日志(HOSTNAME.err)中也会出现错误消息。

10、从服务器复制时,会在其数据目录中发现文件master.info和HOSTNAME-relay-log.info。从服务器使用这两个文件跟踪已经处理了多少主服务器的二进制日志。不要移除或编辑这些文件,除非你确切知你正在做什么并完全理解其意义。即使这样,最好是使用CHANGE MASTER TO语句。

如何配置两个MySQL数据库之间的主从同步功能

一、 概述

MySQL从3.23.15版本以后提供数据库复制(replication)功能,利用该功能可以实现两个数据库同步、主从模式、互相备份模式的功能。本文档主要阐述了如何在linux系统中利用mysql的replication进行双机热备的配置。

二、 环境

操作系统:Linux 2.6.23.1-42.fc8 # SMP(不安装XEN)

Mysql版本:5.0.45-4.fc8

设备环境:PC(或者虚拟机)两台

三、 配置

数据库同步复制功能的设置都在MySQL的配置文件中体现,MySQL的配置文件(一般是my.cnf):在本环境下为/etc/my.cnf。

3.1 设置环境:

IP的设置:

A主机 IP:10.10.0.119

Mask:255.255.0.0

B主机 IP:10.10.8.112

Mask:255.255.0.0

在IP设置完成以后,需要确定两主机的防火墙确实已经关闭。可以使用命令service iptables status查看防火墙状态。如果防火墙状态

为仍在运行。使用service iptables stop来停用防火墙。如果想启动关闭防火墙,可以使用setup命令来禁用或定制。

最终以两台主机可以相互ping通为佳。

3.2 配置A主(master) B从(slave)模式

3.2.1 配置A 为master

、增加一个用户同步使用的帐号:

GRANT FILE ON *.* TO ‘backup’@'10.10.8.112' IDENTIFIED BY ‘1234’;

GRANTREPLICATION SLAVE ON *.* TO ‘backup’@'10.10.8.112' IDENTIFIED BY ‘1234’;

赋予10.10.8.112也就是Slave机器有File权限,只赋予Slave机器有File权限还不行,还要给它REPLICATION SLAVE的权限才可以。

、增加一个数据库作为同步数据库:

create database test;

、创建一个表结构:

create table mytest (username varchar(20),password varchar(20));

、修改配置文件:

修改A的/etc/my.cnf文件,在my.cnf配置项中加入下面配置:

server-id = 1 #Server标识

log-bin

binlog-do-db=test #指定需要日志的数据库

、重起数据库服务:

service mysqld restart

查看server-id:

show variable like ‘server_id’;

实例:

mysql> show variables like 'server_id';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| server_id | 1 |

+---------------+-------+

1 row in set (0.00 sec)

、用show master status/G命令看日志情况。

正常为:

mysql> show master status/G

*************************** 1. row ***************************

File: mysqld-bin.000002

Position: 198

Binlog_Do_DB: test,test

Binlog_Ignore_DB:

1 row in set (0.08 sec)

3.2.2 配置B 为slave

、增加一个数据库作为同步数据库:

create database test;

、创建一个表结构:

create table mytest (username varchar(20),password varchar(20));

、修改配置文件:

修改B的/etc/my.cnf文件,在my.cnf配置项中加入下面配置:

server-id=2

master-host=10.10. 0.119

master-user=backup #同步用户帐号

master-password=1234

master-port=3306

master-connect-retry=60 #预设重试间隔秒

replicate-do-db=test #告诉slave只做backup数据库的更新

、重起数据库服务:

service mysqld restart

查看server-id:

show variables like ‘server_id’;

实例:

mysql> show variables like 'server_id';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| server_id | 2 |

+---------------+-------+

1 row in set (0.00 sec)

、用show slave status/G命令看日志情况。

正常为:

mysql> show slave status/G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 10.10.0.119

Master_User: backup

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysqld-bin.000001

Read_Master_Log_Pos: 98

Relay_Log_File: mysqld-relay-bin.000003

Relay_Log_Pos: 236

Relay_Master_Log_File: mysqld-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB: test,test

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 98

Relay_Log_Space: 236

Until_Condition: None

Until_Log_File:

Until_Log_Pos: 0

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master: 0

1 row in set (0.01 sec)

3.2.3 验证配置

分别使用insert, delete , update在A主机进行增删改查数据库;查看B主机的数据库是否与A主机一致;若一致,则配置成功。

3.3双机互备模式

如果在A主机加入slave设置,在B主机加入master设置,则可以做B->A的同步。

、在A主机的配置文件中 mysqld配置项加入以下设置:

master-host=10.10.8.112

master-user=backup

master-password=1234

replicate-do-db=test

master-connect-retry=10

、在B的配置文件中 mysqld配置项加入以下设置:

log-bin

binlog-do-db=test

注意:当有错误产生时,*.err日志文件同步的线程退出,当纠正错误后,要让同步机制进行工作,运行slave start。

重起A、B机器,则可以实现双向的热备份。

四、 常见问题及解决

、Slave机器的权限问题,不但要给slave机器File权限,还要给它REPLICATION SLAVE的权限。

、在修改完Slave机器/etc/my.cnf之后,slave机器的mysql服务启动之前,记得要删除掉master.info

、在show master status或着show slave status不正常时,看看.err是怎样说的。

、Slave上Mysql的Replication工作有两个线程, I/O thread和SQL thread。I/O的作用是从

master 3306端口上把它的binlog取过来(master在被修改了任何内容之后,就会把修改了什么写到自己的binlog等待slave更

新),然后写到本地的relay-log,而SQL thread则是去读本地的relay-log,再把它转换成本Mysql所能理解的语句,于是同步

就这样一步一步的完成.决定I/O thread的是/var/lib/mysql/master.info,而决定SQL thread的是/var

/lib/mysql/relay-log.info.

、启动slave,命令用start slave;重新启动用restart slave

关于mysql 主从复制的错误

项目上 MySQL 还原 SQL 备份经常会碰到一个错误如下,且通常出现在导入视图、函数、存储过程、事件等对象时,其根本原因就是因为导入时所用账号并不具有SUPER 权限,所以无法创建其他账号的所属对象。ERROR 1227 (42000) : Access denied; you need (at least one of) the SUPER privilege(s) for this operation常见场景:1. 还原 RDS 时经常出现,因为 RDS 不提供 SUPER 权限;2. 由开发库还原到项目现场,账号权限等有所不同。

处理方式:

1. 在原库中批量修改对象所有者为导入账号或修改 SQL SECURITY 为 Invoker;2. 使用 mysqlmp 导出备份,然后将 SQL 文件中的对象所有者替换为导入账号。
二、问题原因我们先来看下为啥会出现这个报错,那就得说下 MySQL 中一个很特别的权限控制机制,像视图、函数、存储过程、触发器等这些数据对象会存在一个 DEFINER 和一个 SQL SECURITY 的属性,如下所示:

    --视图定义CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW v_test


    --函数定义CREATE DEFINER=`root`@`%` FUNCTION `f_test()` RETURNS varchar(100) SQL SECURITY DEFINER


    --存储过程定义CREATE DEFINER=`root`@`%` PROCEDURE `p_test`() SQL SECURITY DEFINER


    --触发器定义CREATE DEFINER=`root`@`%` trigger t_test


    --事件定义CREATE DEFINER=`root`@`%` EVENT `e_test`

    DEFINER:对象定义者,在创建对象时可以手动指定用户,不指定的话默认为当前连接用户;

    SQL SECURITY:指明以谁的权限来执行该对象,有两个选项,一个为 DEFINER,一个为 INVOKER,默认情况下系统指定为 DEFINER;DEFINER:表示按定义者的权限来执行; INVOKER:表示按调用者的权限来执行。

    如果导入账号具有 SUPER 权限,即使对象的所有者账号不存在,也可以导入成功,但是在查询对象时,如果对象的 SQL SECURITY 为 DEFINER,则会报账号不存在的报错。ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist


    三、改写内容上述这个 DEFINER 问题,个人想到最简单的解决方式就是 mysqlmp 导出时直接摘除掉相关属性,但是 mysqlmp 本身并不提供对应参数,所以比较蛋疼,无论是原库走脚本变更或是备份后修改 SQL 文件都不是非常方便,尤其是触发器的 DEFINER,只能先 DROP 再 CREATE 才可以变更。只能看下是否可以从 mysqlmp 源码中去掉 DEFINER 定义。本次 mysqlmp 改写主要有 2 个目的:1. 摘取备份中视图、函数、存储过程、触发器等对象的 DEFINER 定义;2. 尝试加上比较简单的备份进度显示(原生 mysqlmp 的 verbose 参数不是非常清晰,想要实现 navicate 备份时的那种行数显示)。

    改写好处:1. 可以避免还原时遇到 DEFINER 报错相关问题;2. 根据输出信息知道备份是否正常进行,防止备份中遇到元数据锁无法获取然后一直卡住的情况。

关于mysql 主从复制的错误

项目上 MySQL 还原 SQL 备份经常会碰到一个错误如下,且通常出现在导入视图、函数、存储过程、事件等对象时,其根本原因就是因为导入时所用账号并不具有SUPER 权限,所以无法创建其他账号的所属对象。ERROR 1227 (42000) : Access denied; you need (at least one of) the SUPER privilege(s) for this operation常见场景:1. 还原 RDS 时经常出现,因为 RDS 不提供 SUPER 权限;2. 由开发库还原到项目现场,账号权限等有所不同。

处理方式:

1. 在原库中批量修改对象所有者为导入账号或修改 SQL SECURITY 为 Invoker;2. 使用 mysqlmp 导出备份,然后将 SQL 文件中的对象所有者替换为导入账号。
二、问题原因我们先来看下为啥会出现这个报错,那就得说下 MySQL 中一个很特别的权限控制机制,像视图、函数、存储过程、触发器等这些数据对象会存在一个 DEFINER 和一个 SQL SECURITY 的属性,如下所示:

    --视图定义CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW v_test


    --函数定义CREATE DEFINER=`root`@`%` FUNCTION `f_test()` RETURNS varchar(100) SQL SECURITY DEFINER


    --存储过程定义CREATE DEFINER=`root`@`%` PROCEDURE `p_test`() SQL SECURITY DEFINER


    --触发器定义CREATE DEFINER=`root`@`%` trigger t_test


    --事件定义CREATE DEFINER=`root`@`%` EVENT `e_test`

    DEFINER:对象定义者,在创建对象时可以手动指定用户,不指定的话默认为当前连接用户;

    SQL SECURITY:指明以谁的权限来执行该对象,有两个选项,一个为 DEFINER,一个为 INVOKER,默认情况下系统指定为 DEFINER;DEFINER:表示按定义者的权限来执行; INVOKER:表示按调用者的权限来执行。

    如果导入账号具有 SUPER 权限,即使对象的所有者账号不存在,也可以导入成功,但是在查询对象时,如果对象的 SQL SECURITY 为 DEFINER,则会报账号不存在的报错。ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist


    三、改写内容上述这个 DEFINER 问题,个人想到最简单的解决方式就是 mysqlmp 导出时直接摘除掉相关属性,但是 mysqlmp 本身并不提供对应参数,所以比较蛋疼,无论是原库走脚本变更或是备份后修改 SQL 文件都不是非常方便,尤其是触发器的 DEFINER,只能先 DROP 再 CREATE 才可以变更。只能看下是否可以从 mysqlmp 源码中去掉 DEFINER 定义。本次 mysqlmp 改写主要有 2 个目的:1. 摘取备份中视图、函数、存储过程、触发器等对象的 DEFINER 定义;2. 尝试加上比较简单的备份进度显示(原生 mysqlmp 的 verbose 参数不是非常清晰,想要实现 navicate 备份时的那种行数显示)。

    改写好处:1. 可以避免还原时遇到 DEFINER 报错相关问题;2. 根据输出信息知道备份是否正常进行,防止备份中遇到元数据锁无法获取然后一直卡住的情况。

如何利用docker快速构建MySQL主从复制环境

Docker容器虚拟化的好处

Docker项目的发起人和Docker Inc.的CTO Solomon Hykes认为,Docker在正确的地点、正确的时间顺应了正确的趋势—即高效地构建应用。现在开发者需要能方便地创建运行在云平台上的应用,也就是说应用必须能够脱离底层机器,而且同时必须是“任何时间任何地点”可获取的。因此,开发者们需要一种创建分布式应用程序的方式,这也是Docker所能够提供的。

举个简单的应用场景的例子。假设用户试图基于最常见的LAMP(Linux + Apache + MySQL + PHP)组合来运维一个网站。按照传统的做法,首先,需要安装Apache、MySQL 和PHP以及它们各自运行所依赖的环境;之后分别对它们进行配置(包括创建合适的用户、配置参数等);经过大量的操作后,还需要进行功能测试,看是否工作正常;如果不正常,则意味着更多的时间代价和不可控的风险。可以想象,如果再加上更多的应用,事情会变得更加难以处理。

更为可怕的是,一旦需要服务器迁移(例如从阿里云迁移到腾讯云),往往需要重新部署和调试。这些琐碎而无趣的“体力活”,极大地降低了工作效率。

而Docker提供了一种更为聪明的方式,通过容器来打包应用,意味着迁移只需要在新的服务器上启动需要的容器就可以了。这无疑将节约大量的宝贵时间,并降低部署过程出现问题的风险。

Docker在开发和运维中的优势

对开发和运维(DevOps)人员来说,可能最梦寐以求的就是一次性地创建或配置,可以在任意环境、任意时间让应用正常地运行。而Docker恰恰是可以实现这一终极目标的瑞士军刀。

具体说来,Docker在开发和运维过程中,具有如下几个方面的优势。

更快速的交付和部署。使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完成之后,测试和运维人员可以直接使用相同环境来部署代码。Docker可以快速创建和删除容器,实现快速迭代,大量节约开发、测试、部署的时间。并且,各个步骤都有明确的配置和操作,整个过程全程可见,使团队更容易理解应用的创建和工作过程。

更高效的资源利用。Docker容器的运行不需要额外的虚拟化管理程序(Virtual Machine Manager,VMM,以及Hypervisor)支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。

更轻松的迁移和扩展。Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性让用户可以在不同平台之间轻松地迁移应用。

更简单的更新管理。使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。并且所有修改都以增量的方式进行分发和更新,从而实现自动化并且高效的容器管理。

Docker与虚拟机比较

作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著优势:

Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式要快得多。

Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器。

Docker通过类似Git的操作来方便用户获取、分发和更新应用镜像,指令简明,学习成本较低。

Docker通过Dockerfile配置文件来支持灵活的自动化创建和部署机制,提高工作效率。

Docker容器除了运行其中的应用之外,基本不消耗额外的系统资源,保证应用性能的同时,尽量减小系统开销。传统虚拟机方式运行N个不同的应用就要启动N个虚拟机(每个虚拟机需要单独分配独占的内存、磁盘等资源),而Docker只需要启动N个隔离的容器,并将应用放到容器内即可。

当然,在隔离性方面,传统的虚拟机方式多了一层额外的隔离。但这并不意味着Docker就不安全。Docker利用Linux系统上的多种防护机制实现了严格可靠的隔离。从1.3版本开始,Docker引入了安全选项和镜像签名机制,极大地提高了使用Docker的安全性。

Mysql 的主从复制,最多支持多少个数据库同步,最佳的建议是几个?

主从复制理论上支持无穷大的从库个数,实际情况下,受服务器带宽和读写能力的影响

请参考mysql官方手册的建议:

理论上,通过使用单个主服务器/多从服务器设置,可以通过添加更多的从服务器来扩充系统,直到用完网络带宽,或者你的更新负载已经增长到主服务器不能处理的点。

在获得的收益开始吃平之前,为了确定可以有多少从服务器,以及可以将你的站点的性能提高多少,需要知道查询模式,并且要通过基准测试并根据经验确定一个典型的主服务器和从服务器中的读取(每秒钟读取量,或者max_reads)吞吐量和写(max_writes)吞吐量的关系。通过一个假设的带有复制的系统,本例给出了一个非常简单的计算结果。

假设系统负载包括10%的写和90%的读取,并且我们通过基准测试确定max_reads是1200 –2 × max_writes。换句话说,如果没有写操作,系统每秒可以进行1,200次读取操作,平均写操作是平均读操作所用时间的两倍,并且关系是线性的。我们假定主服务器和每个从服务器具有相同的性能,并且我们有一个主服务器和N个从服务器。那么,对于每个服务器(主服务器或从服务器),我们有:

reads = 1200 – 2 × writes

reads = 9 × writes / (N + 1) (读取是分离的, 但是写入所有服务器)

9 × writes / (N + 1) + 2 × writes = 1200

writes = 1200 / (2 + 9/(N+1))

最后的等式表明了N个从服务器的最大写操作数,假设最大可能的读取速率是每分钟1,200次,读操作与写操作的比率是9。

如上分析可以得到下面的结论:

· 如果N = 0(这表明没有复制),系统每秒可以处理大约1200/11 = 109个写操作。

· 如果N = 1,每秒得到184个写操作。

· 如果N = 8,每秒得到400个写操作。

· 如果N = 17,每秒得到480个写操作。追问我现在有个问题,再我最初时的复制同步是没问题的,但在我对服务器重启后。第二对同步日志更新后,我在主服务中创建的数据表脚没能同步到从服务器,但是在命令:mysq>show slave status\G 后没有发现错误的地方!这是什么原因呢?

追答能否留个Q,详细说

显示全文