在Linux上,搭建MySQL双主模式
MySQL的双主模式
binlog(二进制日志)
-
简介
binlog是记录所有 数据库表结构变更(例如CREATE、ALTER TABLE…)以及表数据修改(INSERT、UPDATE、DELETE…)的二进制日志
不会记录 SELECT和SHOW 等操作,因为这类操作对数据本身并没有修改
binlog 的主要目的是复制和恢复
用于 MySQL主从复制 Master端开启binlog,Master把它的二进制日志传递给slaves来达到master-slave数据一致的目的
-
分类
-
二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件
文本文件,其中内容为当前的 二进制日志文件(binlog文件)列表 -
二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件
-
-
开启
vim /etc/my.cnf或vim /etc/mysql/mysql.conf.d/mysqld.cnflog-bin = mysql-bin #没有给定值,写成 log-bin=,则默认名称为主机名(注:名称若带有小数点,则只取第一个小数点前的部分作为名称)
启用 binlog 之后须重启MySQL才能生效
service mysql restart
重启后,可以进入MySQL查看是否成功开启show variables like '%log_bin%';注:
如果/etc目录下没有my.cnf
可以在/usr/share/mysql目录下找到my-default.cnf
复制到/etc目录下cp /usr/share/mysql/my-default.cnf /etc/my.cnf
MySQL的双主模式
-
简介
两台mysql都可读写,互为主备
默认只使用一台(masterA)负责数据的写入,另一台(masterB)备用
masterA是masterB的主库,masterB又是masterA的主库,它们互为主从 -
益弊
在一定程度上保证主库的高可用,
在一台主库down掉之后,可以在极短的时间内切换到另一台主库上(尽可能减少主库宕机对业务造成的影响),减少了主从同步给线上主库带来的压力;masterB可能会一直处于空闲状态(可以用它当从库,负责部分查询)
主库后面提供服务的从库要等masterB先同步完了数据后才能去masterB上去同步数据,
这样可能会造成一定程度的同步延时
在Linux上,搭建MySQL双主模式
-
搭建环境
OS:CentOS 6.10
MySQL:MySQL-5.6.26
masterA IP:192.168.10.70
masterB IP:192.168.10.71 -
修改.cnf配置文件
更改两台主机中的MySQL配置文件/etc/my.cnfvim /etc/my.cnf
在 masterA 的my.cnf中添加server-id = 1
log-bin = binlog
auto-increment-increment = 2
auto-increment-offset = 1在 masterB 的
my.cnf中添加server-id = 2
log-bin = binlog
auto-increment-increment = 2
auto-increment-offset = 2参数说明:
server-id Mysql唯一标识,一个集群中唯一
log-bin 开启log-bin
auto-increment-increment 整个结构中服务器的总数(共两台服务器,所以值为2)
auto-increment-offset 自动增长的起点(因为服务器都设定了一次自动增长的值为2,所以他们的起点必须得不同,这样才能避免两台服务器数据同步时出现主键冲突) -
重启MySQL使配置生效,再次登录MySQL
-
创建并添加同步数据需要的用户
在 masterA 的MySQL中
CREATE USER [email protected]'%' IDENTIFIED BY '123456';GRANT REPLICATION SLAVE ON *.* TO 'userA'@'192.168.10.%' IDENTIFIED BY '123456';FLUSH PRIVILEGES;
在 masterB 的MySQL中
CREATE USER [email protected]'%' IDENTIFIED BY '123456';GRANT REPLICATION SLAVE ON *.* TO 'userA'@'192.168.10.%' IDENTIFIED BY '123456';FLUSH PRIVILEGES;
5. 查看master的状态SHOW MASTER STATUS;
masterA 的 MASTER STATUS
masterB 的 MASTER STATUS
-
说明二进制日志路径
在 masterB 上执行CHANGE MASTER TO MASTER_HOST='192.168.10.70',MASTER_USER='userA',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=585;
在 masterA 上执行CHANGE MASTER TO MASTER_HOST='192.168.10.71',MASTER_USER='userB',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=1147;参数说明
masterB上填的参数信息都对应 masterA 中设定的参数(masterA同理)以 masterB 为例,参数信息应该为:
MASTER_HOST masterA 的 host
MASTER_USER 在 masterA 中创建的 userA
MASTER_PASSWORD userA 对应的密码
MASTER_LOG_FILESHOW MASTER STATUS;查询出的第一项文件名(File)
MASTER_LOG_POSSHOW MASTER STATUS;查询出的第二项文件名(Posotion) -
开启复制功能
在 masterA 和 masterB 中都执行start slave;
至此 Linux上的MySQL双主模式配置完成 -
测试
在 masterA 中建立数据库
然后在 masterB 中查询是否也建立了相应的数据库
可以看到 masterA 与 masterB 之间已经进行了同步
遇到的问题
-
masterA 和 masterB 的数据不同步
查看 slave 的状态show slave status
其中 Slave_IO_Running 和 Slave_SQL_Running 状态都要为Yes如果 Slave_SQL_Running 状态为No
执行如下操作stop slave;set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;start slave;
附录
- masterA的my.cnf配置信息
- masterB的my.cnf配置信息