负载均衡mysql集群实现数据同步

负载均衡mysql集群实现数据同步

大家都知道当网站的访问并发量比较高的时候,一般的公司都采用lvs负载均衡,mysql读写分离,集群等方式降低服务器压力,数据库读写压力,假设公司采用了mysql集群,此时就会有数据同步的问题,我们怎么实现mysql集群的数据同步呢?

mysql四种常见日志类型

  1. errot log 错误日志
  2. general query log 查询日志
  3. slow query log 慢查询日志
  4. binary log 二进制日志

其中第四种binary log,主要记录了mysql数据更改记录,就是我们将要用来实现主从复制的条件。

通过 binary log 实现数据同步

我们已经知道mysql的binary log会记录数据更改的sql,我们只要做到在多台服务器中监听这个日志变化,主动读取binary log,将binary log内容转成本身的relay log,然后自身通过relay log实现数据的同步改动即可实现数据同步。现在让我们看下具体原理和操作:

mysql数据复制原理

主要是mysql的三个线程的分工合作。

  1. binlog线程:记录所有涉及到mysql数据变化的sql语句,将sql语句写入binlog中。
  2. io线程:当我们开启slave之后,slave服务器就监听从master服务器获取binlog内容,将获取的数据放进自己的relay log。
  3. 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集群常见问题

  1. 主主复制自增主键冲突
    通过以上介绍我们知道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自增的步长就会不同,如此便可以解决自增主键冲突问题。

转载于:https://www.cnblogs.com/linlm/p/10112911.html

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值