MySQL主从复制(6)双主复制

tanglu 7696 2021-03-15

一、什么是双主复制

在传统主从复制的架构中,如果主库出现故障,从库便无法再写入数据。主库故障后手动进行主从切换的过程较为繁琐。为了解决这个问题可以使用双主模式,其中一台主库提供线上服务,另一台作为备机,两台数据库使用VIP提供服务,依靠Keepalived进行故障自动切换。但是强烈不建议用双主模式来实现双写,这样数据不一致的风险非常大。如果真要开启,建议指定不同的库写入指定的节点。比如DB1的写入都在MasterA完成、DB2的写入都在Master2完成。除了双写问题以外,还有一个binlog循环复制的问题值得思考,A运行SQL生成binlog,B执行后又生成同样的SQL再次传递给A,然后一直循环下去。MySQL为了避免这个问题,会依据server id来确定角色。当主库B收到主库A的binlog进行应用时,会在自己的binlog中增加上A的server id,而主库A接收到这个binlog后先判断server id,如果跟自己的相同表示这个日志是自己生成的,就直接丢弃这个日志。


二、双主复制配置

1、修改主库A的配置文件,增加以下内容

vi /etc/my.cnf
log-slave-updates = 1  #由于可能发生身份切换,所以打开该选项,作为从库也会记录binlog
replicate_same_server_id = 0  #避免循环写入问题
auto_increment_increment=2  #自增主键步长,通常有几个主库就写几,避免主键冲突
auto_increment_offset=1  #设置自增主键起始值,第一个主库为1,第二个主库为2,以此类推


2、主库A为主库B授权

mysql > grant replication slave on *.* to 'repl'@'192.168.1.102' identified by '123456';


3、修改主库B配置文件

vi /etc/my.cnf
log-slave-updates = 1
replicate_same_server_id = 0
auto_increment_increment=2
auto_increment_offset=2  #主键起始值,这里应该是2了


4、主库B为主库A授权

mysql > grant replication slave on *.* to 'repl'@'192.168.1.101' identified by '123456';  #102为另外一台主的地址


5、主库A配置主从,位置信息要在主库B服务运行后show master status查看

mysql > change master to master_host='192.168.1.102',master_user='repl',master_password='123456',master_log_file='master-bin.000002',master_log_pos=604,master_port=3306


6、主库B配置主从,位置信息要在主库A服务运行后show master status查看

mysql > change master to master_host='192.168.1.101',master_user='repl',master_password='123456',master_log_file='master-bin.000002',master_log_pos=604,master_port=3306


7、两台机器都启动从服务,如果配置成功的话在任意一台写入数据都可以同步到另一台机器

mysql > start slave


二、Keepalived配置

1、在两台数据库服务器上编译安装Keepalived

./configure --prefix=/usr/local/keepalived
make
meke install


2、创建Keepalived配置文件

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

vi /etc/keepalived/keepalived.conf
global_defs {
 # 全局设置,主要是主备切换时发送邮件通知,可以直接注释
 # notification_email {
 #   acassen@firewall.loc
 # }
 # notification_email_from Alexandre.Cassen@firewall.loc
 # smtp_server 192.168.145.1
 # smtp_connect_timeout 30
 # router_id LVS_DEVEL
 # vrrp_skip_check_adv_addr
 # vrrp_strict
 # vrrp_garp_interval 0
 # vrrp_gna_interval 0
}

vrrp_instance mysql {  #实例名称随便取
   state MASTER  #标记该节点是master还是backup,但并不起实际作用,为了防止脑裂抢占IP可以都设置为backup
   interface eth0  #配置VIP绑定的网卡,这里使用和外网通信的网卡
   virtual_router_id 51  #取1-255之间的值,主备需要相同,这样才能成为一个组
   priority 100  #权重,数值高的主机是master,这是影响主备的关键
   nopreempt  #非抢占模式,需要设置state为backup
   advert_int 1  #主备之间通讯的间隔秒数,用于判断主节点是否存活
   authentication {
       auth_type PASS  #进行安全认证的方式,PASS或者AH方式,推荐PASS
       auth_pass 1111  #PASS的密码
   }
   virtual_ipaddress {
       192.168.145.200  #VIP地址,最多可以写20个,keepalive启动后会自动配置该处VIP
   }
   virtual_server 192.168.145.200 {  #访问VIP所转发到的后端节点配置
       delay_loop 6
       protocol TCP
       lb_algo rr
      lb_kind DR
       real_server 192.168.145.101 3306{  #后端节点1
         weight 1        }
       
      real_server 192.168.145.102 3306{  #后端节点2
         weight 1       }
  }
}


3、启动Keepalived后观察VIP是否绑定成功即可

版权声明
本站所有文章均为原创,转载请注明出处!小站维护不易,如果对您有所帮助,希望能点击一下站内广告,谢谢!
上一篇:MySQL主从复制(5)多源主从复制
下一篇:MySQL主从复制(7)延迟从库的设置与恢复
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

微信二维码