如您需要技术咨询、解决方案定制、故障排除、运维监控等服务,可联系ericwcn#at#163.com。

CentOS7.0 实现MySQL主-主(Master-Master)数据同步复制

数据库 立杰 741℃ 0评论

MySQL-Master-Master-Replication

本文在《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,如果从服务器和主服务器均支持,使用压缩从服务器/主服务器协议

转载请注明:知识库 » CentOS7.0 实现MySQL主-主(Master-Master)数据同步复制

喜欢 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址