本文在《CentOS7.0/RHEL7.0Linux下MySQL5.6主从复制配置》基础上,研究了一下MySQL Master-Master 数据同步方法,具体配置的过程如下。
一、配置MySQL运行环境
master1:192.168.1.25 CENTOS7.0 MySQL5.6.20 master2:192.168.1.26 CENTOS7.0 MySQL5.6.20
安装MySQL数据库
wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm yum update yum install mysql-community-server
配置开机启动
systemctl enable mysqld.service
配置防火墙,Centos7.0防火墙默认配置工具是firewalld,因此,可以通过firewall-cmd进行配置
firewall-cmd --zone=public --add-port=3306/tcp --permanent systemctl restart firewalld.service
查看防火墙配置是否生效
iptables -L |grep mysql ACCEPT tcp -- anywhere anywhere tcp dpt:mysql ctstate NEW
二、配置Master1 (192.168.1.25)
Centos7.0 RPM安装MySQL默认配置文件在 /etc/my.cnf,因此:
vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
#Master1 服务器ID
server-id=25
#log-bin 日志保存位置
log-bin=/var/log/mysql/mysql-bin.log
#从master读到的更新操作都记录到slave二进制日志中
log-slave-updates
#二进制变更日志文件索引文件
log-bin-index=mysql-bin-index.log
#从Master log-bin读取的日志记录到slave本地文件中
relay-log = /var/log/mysql/relay.log
#从服务器用于记录中继日志相关信息的文件名。默认名为数据目录中的relay-log.info
relay-log-info-file = /var/log/mysql/relay-log.info
#中继日志索引文件使用的位置和名称
relay-log-index = /var/log/mysql/relay-log-index.log
#自动清理过期的二进制文件
expire_logs_days = 30
#定义下一次AUTO_INCREMENT的步长
auto-increment-increment = 2
#定义AUTO_INCREMENT的起点值
auto-increment-offset = 1
#不同步下面数据库表
replicate-wild-ignore-table=mysql.%
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysqld_safe]
log-error=/var/log/mysql/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
重新启动MySQL服务
systemctl restart mysqld.service
接下来创建同步复制的用户及授权,在Master1和Master2都需创建。
mysql>grant replication slave,replication client on *.* to 'repl'@192.168.1.26 identified by '123456'; mysql>flush privileges;
在Master2上执行下面命令,获取同步文件名称和Position
mysql> show master status; +--------------------+----------+--------------+----------------+-----------------+ | File | Position | Binlog_Do_DB |Binlog_Ignore_DB|Executed_Gtid_Set| +--------------------+----------+--------------+----------------+-----------------+ | mysql-bin.000009 | 319 | | | | +--------------------+----------+--------------+----------------+-----------------+ 1 row in set (0.00 sec)
在Master1上配置slave参数,使用change命令,如下所示:
mysql>stop slave; mysql>reset slave; mysql>CHANGE MASTER TO MASTER_HOST = '192.168.1.%', MASTER_USER = 'repl', MASTER_PASSWORD = '123456', MASTER_LOG_FILE = 'mysql-bin.000009', MASTER_LOG_POS = 319; start slave;
三、配置Master2 (192.168.1.26)
编辑my.cnf加入下面代码:
#服务器ID server-id=26 #log-bin 日志保存位置 log-bin=/var/log/mysql/mysql-bin.log #从master读到的更新操作都记录到slave二进制日志中 log-slave-updates #二进制变更日志文件索引文件 log-bin-index=mysql-bin-index.log #从Master log-bin读取的日志记录到slave本地文件中 relay-log = /var/log/mysql/relay.log #从服务器用于记录中继日志相关信息的文件名。默认名为数据目录中的relay-log.info relay-log-info-file = /var/log/mysql/relay-log.info #中继日志索引文件使用的位置和名称 relay-log-index = /var/log/mysql/relay-log-index.log #自动清理过期的二进制文件 30天 expire_logs_days = 30 #定义下一次AUTO_INCREMENT的步长 auto-increment-increment = 2 #定义AUTO_INCREMENT的起点值 auto-increment-offset = 2 #不同步下面数据库表 replicate-wild-ignore-table=mysql.% replicate-wild-ignore-table=performance_schema.% replicate-wild-ignore-table=information_schema.%
重新启动MySQL服务
systemctl restart mysqld.service
在Master1上执行下面命令,获取同步文件名称和Position
mysql> show master status; +--------------------+----------+--------------+----------------+-----------------+ | File | Position | Binlog_Do_DB |Binlog_Ignore_DB|Executed_Gtid_Set| +--------------------+----------+--------------+----------------+-----------------+ | mysql-bin.000002 | 890 | | | | +--------------------+----------+--------------+----------------+-----------------+ 1 row in set (0.00 sec)
在Master2上配置slave参数,使用change命令,如下所示:
mysql>stop slave; mysql>reset slave; mysql>CHANGE MASTER TO MASTER_HOST = '192.168.1.%', MASTER_USER = 'repl', MASTER_PASSWORD = '123456', MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 890; start slave;
分别在Master1和Master2上查看slave状态,主要查看下面两个参数
show slave status\G; Slave_IO_Running: Yes Slave_SQL_Running: Yes
有人说主从同步数据库版本必须一样,但经过验证,数据库版本不一样是可以实现的。我分别在Centos6.4 MySQL5.1和Ubuntu 12.04 MySQL5.6上配置成功。
四、my.cnf配置参数说明
#启用从库日志,这样可以进行链式复制 log-slave-updates #从库是否只读,0表示可读写,1表示只读 read-only=1 #只复制某些表(可用匹配符) replicate-wild-do-table=dbname.tablename% #只复制某个库 replicate-do-db=dbname #不复制某个表 replicate-ignore-table=dbname.tablename #不复制某些表 replicate-wild-ignore-table=dbname.tablename% #不复制某数据库所有表,通过真实修改的表进行过滤,更为准确 replicate-wild-ignore-table=dbname.% #不复制某个库,使用use db来确定是否过滤 replicate-ignore-db=dbname #复制完的sql语句是否立即从中继日志中清除,1表示立即清除 relay-log-purge=1 #从服务器主机,用于show slave hosts生成从库清单 report-host=hostname
五、详细日志参数配置说明
master-connect-retry=seconds #在主服务器宕机或连接丢失的情况下,从服务器线程重新尝试连接主服务器之前睡眠的秒数。如果主服务器.info文件中的值可以读取则优先使用。如果未设置, 默认值为60 master-info-file=file_name #从服务器用于记录主服务器的相关信息使用的文件名。默认名为数据目录中的mysql.info read-only #该选项让从服务器只允许来自从服务器线程或具有SUPER权限的用户的更新。可以确保从服务器不接受来自客户的更新 relay-log=file_name #中继日志名。默认名为host_name-relay-bin.nnnnnn,其中host_name是从服务器主机的名,nnnnnn表示中继日志在编号序列中创建。如果中继日志太大(并且你不想降低max_relay_log_size),需要将它们放到数据目录之外的其它地方,或者如果想要通过硬盘之间的负载均衡提高速度,可以指定选项创建与主机名无关的中继日志名 relay-log-index=file_name #中继日志索引文件使用的位置和名称。默认名为host_name-relay-bin.index,其中host_name为从服务器名 relay-log-info-file=file_name #从服务器用于记录中继日志相关信息的文件名。默认名为数据目录中的relay-log.info max_binlog_size= #自定义二进制日志文件的大小 RESET MASTER #删除所有二进制日志文件 PURGE MASTER LOGS #只删除部分二进制文件 replicate-do-db=db_name #告诉从服务器限制默认数据库(由USE所选择)为db_name的语句的复制。要指定多个数据库,应多次使用该选项,每个数据库使用一次。请注意不复制跨数据库的语句,例如当已经选择了其它数据库或没有数据库时执行UPDATE some_db.some_table SET foo='bar'。如果需要跨数据库进行更新,使用--replicate-wild-do-table=db_name.%。请读取该选项列表后面的注意事项 replicate-do-table=db_name.tbl_name #告诉从服务器线程限制对指定表的复制。要指定多个表,应多次使用该选项,每个表使用一次。同--replicate-do-db对比,允许跨数据库更新。请读取该选项列表后面的注意事项 replicate-ignore-db=db_name #告诉从服务器不要复制默认数据库(由USE所选择)为db_name的语句。要想忽略多个数据库,应多次使用该选项,每个数据库使用一次。如果正进行跨数据库更新并且不想复制这些更新,不应使用该选项。请读取该选项后面的注意事项。 #一个不能按照期望工作的例如:如果用--replicate-ignore-db=sales启动从服务器,并且在主服务器上执行下面的语句,UPDATE语句不会复制: USE prices; UPDATE sales.january SET amount=amount+1000; #如果需要跨数据库更新,应使用--replicate-wild-ignore-table=db_name.%。 replicate-ignore-table=db_name.tbl_name #告诉从服务器线程不要复制更新指定表的任何语句(即使该语句可能更新其它的表)。要想忽略多个表,应多次使用该选项,每个表使用一次。同--replicate-ignore-db对比,该选项可以跨数据库进行更新。请读取该选项后面的注意事项 slave_compressed_protocol={0|1} #如果该选项设置为 1,如果从服务器和主服务器均支持,使用压缩从服务器/主服务器协议