负载均衡mysql集群实现数据同步
大家都知道当网站的访问并发量比较高的时候,一般的公司都采用lvs负载均衡,mysql读写分离,集群等方式降低服务器压力,数据库读写压力,假设公司采用了mysql集群,此时就会有数据同步的问题,我们怎么实现mysql集群的数据同步呢?
mysql四种常见日志类型
- errot log 错误日志
- general query log 查询日志
- slow query log 慢查询日志
- binary log 二进制日志
其中第四种binary log,主要记录了mysql数据更改记录,就是我们将要用来实现主从复制的条件。
通过 binary log 实现数据同步
我们已经知道mysql的binary log会记录数据更改的sql,我们只要做到在多台服务器中监听这个日志变化,主动读取binary log,将binary log内容转成本身的relay log,然后自身通过relay log实现数据的同步改动即可实现数据同步。现在让我们看下具体原理和操作:
mysql数据复制原理
主要是mysql的三个线程的分工合作。
- binlog线程:记录所有涉及到mysql数据变化的sql语句,将sql语句写入binlog中。
- io线程:当我们开启slave之后,slave服务器就监听从master服务器获取binlog内容,将获取的数据放进自己的relay log。
- sql执行线程:执行relay log里的sql语句,完成数据同步。
mysql主主服务器架构数据同步
顾名思义,mysql主主服务器指的就是mysql集群,mysql多台服务器同时对外提供完整的增删改查服务,此时我们只需要让这多台mysql服务器互相监听binary log变化,同步到自己的mysql服务器即可实现数据同步。
假设我们的主主服务器有两台:
# 第一步、my.cnf 修改以下配置
# server1
server-id=1
log-bin=mysql-bin
binlog-format=mixed
relay-log=mysql-relay
# server2
server-id=2
log-bin=mysql-bin
binlog-format=mixed
relay-log=mysql-relay
# 第二步、建立mysql的监听账号
# server1
grant replication client,replication slave on *.* to 'user'@'server1 ip' identified by '密码';
# server2
grant replication client,replication slave on *.* to 'user'@'server2 ip' identified by '密码';
# 第三步、实现binary log监听
# master_log_file 和 master_log_pos 用来确定slave的io线程下次开始执行时从master开始读取的位置坐标
# server1
change master to master_host='server1 ip',master_user='用户名',master_password='用户名@密码',master_log_file='mysql-bin.000001',master_log_pos=746;
# server2
change master to master_host='server2 ip',master_user='用户名',master_password='用户名@密码',master_log_file='mysql-bin.000001',master_log_pos=746;
# 查看监听状态 并且启动 slave
show slave status \G
start slave
到这里,我们的mysql主主服务器数据同步就完成了。
mysql集群常见问题
- 主主复制自增主键冲突
通过以上介绍我们知道mysql主主复制时,多台mysql同时提供服务,如果我们表中含有自增主键,此时我们就会遇见server1写入了,但是binary log还没同步到server2,此时server2也写入了数据。自增主键相同,当binary log同步的时候,就会产生冲突。
那么如何解决呢?可以通过修改 mysql的my.cnf 配置文件。
server-id=11 #任意自然数n,只要保证两台MySQL主机不重复就可以了。
log-bin=mysql-bin #开启二进制日志
auto_increment_increment=2 #步进值auto_imcrement。一般有n台主MySQL就填n
auto_increment_offset=1 #起始值。一般填第n台主MySQL。此时为第一台主MySQL
...
通过以上配置,每一台mysql自增的步长就会不同,如此便可以解决自增主键冲突问题。