便民 发表于 2018-12-29 13:15:12

Mysql 双主+keepalived 实现高可用及读写分离(一)

目的:
解决 mysql数据库Master-Slave 单点故障问题。

实现方式:
1. Master-Master Replication 实现数据同步。
2.通过keepalived虚拟IP 从网络层实现单点故障时IP自动切换,从而实现高可用。
3.通过keepalived配置实现read读指向Slave节点,实现读写分离。

缺点:根据线上实际应用情况,只考虑单点网络故障及机器设备故障时虚拟ip自动切换(只切换一次)。不考虑mysql服务异常等情况,数据库异常可通过nagios等监控,防止多次来回切换,造成数据混乱!且故障节点恢复时,要人工操作及注意步骤。


Master-Master

1、使用两个MySQL数据库db01,db02,互为Master和Slave,即:
一边db01作为db02的master,一旦有数据写向db01时,db02定时从db01更新
另一边db02也作为db01的master,一旦有数据写向db02时,db01也定时从db02获得更新
(这不会导致循环,MySQL Slave默认不会记录Master同步过来的变化)
2、但从AppServer的角度来说,同时只有一个结点db01扮演Master,另外一个结点db02扮演Slave,不能同时两个结点扮演Master。即AppSever总是把write操作分配某个数据库(db01),除非db01 failed,被切换。
3、如果扮演Slave的数据库结点db02 Failed了:
a)此时appServer要能够把所有的read,write分配给db01,read操作不再指向db02
b)一旦db02恢复过来后,继续充当Slave角色,并告诉AppServer可以将read分配给它了.
4、如果扮演Master的数据库结点db01 Failed了
a)此时appServer要能够把所有的写操作从db01切换分配给db02,也就是切换Master由db02充当
b)db01恢复过来后,充当Slave的角色,Master由db02继续扮演。

具体配置如下:
测试环境简介:
1.10.10.10.40   mysql+keepalive
2.10.10.10.41   mysql+keepalive
3.写入VIP:10.10.10.21(40主,41从)
4.读取VIP:10.10.10.44(41主,40从)


http://blog.运维网.com/attachment/201211/103534485.jpg


1.mysql双主配置,此处简略,可参考网上主主同步配置。

Mysql配置文件重点简略如下:
log-bin=mysql-bin
binlog_format=mixed
server-id= 3(另一台的ID为2)

2.keepalived 配置方法
第一台(40):
global_defs {
   notification_email {
   ******@126.com
   }
   notification_email_from*****@126.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id MySQL-ha
   }

vrrp_instance VI_1 {
   state BACKUP   #两台配置此处均是BACKUP
   interface p4p1 #注意网卡接口
   virtual_router_id 51
   priority 180   #优先级,另一台改为90
   advert_int 1
   nopreempt   #不主动抢占资源,只在优先级高的机器上设置即可,优先级低的机器不设置
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
      10.10.10.21   #此虚拟ip为写
   }
   }

vrrp_instance VI_2 {
   state BACKUP   #另一台配置为MASTER
   interface p4p1 #注意网卡接口
   virtual_router_id 44 #注意id和上面的不同
   priority 90 #优先级,另一台改为180
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
      10.10.10.44      #此虚拟ip为读
   }
   }

第二台(41)
global_defs {
   notification_email {
   *********@126.com
   }
   notification_email_from ********@126.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id MySQL-ha
   }

vrrp_instance VI_1 {
   state BACKUP   #两台配置此处均是BACKUP
   interface p4p1 #注意网卡接口
   virtual_router_id 51
   priority 90   #优先级,另一台改为180
   advert_int 1
   authentication {
   auth_type PASS
   auth_pass 1111
   }
   virtual_ipaddress {
   10.10.10.21
   }
   }

vrrp_instance VI_2 {
   state MASTER   #用于mysql读
   interface p4p1 #注意网卡接口
   virtual_router_id 44
   priority 180 #优先级,另一台改为90
   advert_int 1
   authentication {
   auth_type PASS
   auth_pass 1111
   }
   virtual_ipaddress {
   10.10.10.44      #用于mysql读
   }
}



页: [1]
查看完整版本: Mysql 双主+keepalived 实现高可用及读写分离(一)