当前位置:   article > 正文

MySQL+KeepAlived实现双主高可用方案实践_mysql keepalived

mysql keepalived

目录

 

1、什么叫双主高可用(双机热备)

2、搭建主主同步

3、配置MySQL+Keepalived故障转移的高可用环境

4、测试

5、MyCAT双主高可用

5.1 架构图

5.2 准备环境

5.3 高可用配置


1、什么叫双主高可用(双机热备

我们通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务。当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短。MySQL双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换。使用Keepalived,可以通过虚拟IP,实现双主对外的统一接口以及自动检查、失败切换机制,从而实现MySQL数据库的高可用方案。之前梳理了MySQL主从同步,下面说下MySQL+Keepalived双主热备高可用方案的实施。

实现双机热备的逻辑:

  1. 1)先实施Master->Slave的主主同步。主主是数据双向同步,主从是数据单向同步。一般情况下,主库宕机后,需要手动将连接切换到从库上。(但是用keepalived就可以自动切换)
  2. 2)再结合Keepalived的使用,通过VIP实现MySQL双主对外连接的统一接口。即客户端通过Vip连接数据库;当其中一台宕机后,VIP会漂移到另一台上,这个过程对于客户端的数据连接来说几乎无感觉,从而实现高可用。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

2、搭建主主同步

  1. Master1:192.168.223.128   安装mysql和keepalived
  2. Master2: 192.168.223.129   安装mysql和keepalived
  3. VIP:192.168.223.136 (虚拟漂移IP,不需要另外起一台服务)
  4. 要实现主主同步,可以先实现主从同步,即master1->master2的主从同步,然后master2->master1的主从同步.
  5. 这样,双方就完成了主主同步。
  6. 注意下面几点:
  7. 1)要保证同步服务期间之间的网络联通。即能相互ping通,能使用对方授权信息连接到对方数据库(防火墙开放3306端口)。
  8. 2)同步前,双方数据库中需要同步的数据要保持一致。这样,同步环境实现后,再次更新的数据就会如期同步了。
  9. 可能出现的问题:
  10. 1、报错:
  11. Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
  12. 解决办法:
  13. 删除mysql数据目录下的auto.cnf文件,重启mysql服务即可!
  14. 2、另:Keepalived必须使用root账号启动!

配置文件my.cnf

  1. #1: 主库1修改配置 vim /etc/my.cnf
  2. server-id = 1        
  3. log-bin = master-bin    
  4. sync_binlog = 1
  5. binlog_checksum = none
  6. binlog_format = ROW
  7. auto-increment-increment = 2    
  8. auto-increment-offset = 1    
  9. slave-skip-errors = all
  10. log_slave_updates=1
  11. #2: 主库2修改配置 vim /etc/my.cnf
  12. server-id = 2        
  13. log-bin = master-bin    
  14. sync_binlog = 1 #表示每次事务提交,MySQL都会把binlog刷下去,是最安全但是性能损耗最大的设置
  15. binlog_checksum = none #不做日志统计检查,提升性能
  16. binlog_format = ROW
  17. auto-increment-increment = 2 #表示自增长字段每次递增的量,其默认值是1,取值范围是1 .. 65535    
  18. auto-increment-offset = 1 #表示自增长字段从那个数开始,他的取值范围是1 .. 65535    
  19. slave-skip-errors = all #从节点跳过所有错误
  20. log_slave_updates=1 # 从节点也要保存binlog日志,三级同步使用
  21. #PS:其实就server-id不一样而已
  22. #分别重启服务
  23. ------------------------------------------------------------------------------------
  24. #3:分别进入128,129两台mysql服务器:
  25. mysql -uroot -proot
  26. #都创建主从连接账户repl
  27. CREATE USER repl;
  28. #从库repl密码123456 跟主库连接,有slave的权限
  29. GRANT replication slave ON *.* TO 'repl'@'192.168.223.128或者129' identified by '123456';
  30. #刷新生效
  31. flush privileges;
  32. #最好将库锁住,仅仅允许读,以保证数据一致性;待主主同步环境部署后再解锁;
  33. #锁住后,就不能往表里写数据,但是重启mysql服务后就会自动解锁!
  34. flush tables with read lock;  #注意该参数设置后,如果自己同步对方数据,同步前一定要记得先解锁!
  35. ---------------------------------------------------------------------------------
  36. #4:#分别创建主库连接,master_log_file和master_log_position的值需要执行:show MASTER status;查询设置比当前文件早的文件名或者比当前position小的position值
  37. #128机器做同步操作----》
  38. unlock tables;     #先解锁,将对方数据同步到自己的数据库中
  39. stop slave;#停止同步,避免数据有更新
  40. CHANGE MASTER TO
  41. master_host='192.168.223.129',
  42. master_port=3306,
  43. master_user='repl',
  44. master_password='123456',
  45. master_log_file='master-bin.000001',
  46. master_log_pos=501;
  47. start slave;#开启同步
  48. show SLAVE status;#查看从节点状态,有问题解决问题
  49. #129机器做同步操作----》
  50. unlock tables;     #先解锁,将对方数据同步到自己的数据库中
  51. stop slave;#停止同步,避免数据有更新
  52. CHANGE MASTER TO
  53. master_host='192.168.223.128',
  54. master_port=3306,
  55. master_user='repl',
  56. master_password='123456',
  57. master_log_file='master-bin.000005',
  58. master_log_pos=308;
  59. start slave;#开启同步
  60. show SLAVE status;#查看从节点状态,有问题解决问题

测试:分别在128和129上面进行数据的增删改查,可以发现数据会相互同步!

3、配置MySQL+Keepalived故障转移的高可用环境

与之前keeppalived搭建Nginx高可用类似,我们都是利用keepalived的虚拟IP漂移来达到单点故障转移的问题

  1. Keepalived看名字就知道,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导
  2. 整个系统架构的不可用)的发生,那说到keepalived不得不说的一个协议不是VRRP协议,可以说这个协议就是keepalived实现的基础。
  3. 1)Keepalived的工作原理是VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议。在VRRP中有两组重要的概念:VRRP路由器和虚拟路由器,主控路由器和备份路由器。
  4. 2)VRRP路由器是指运行VRRP的路由器,是物理实体,虚拟路由器是指VRRP协议创建的,是逻辑概念。一组VRRP路由器协同工作,共同构成一台虚拟路由器。
  5. Vrrp中存在着一种选举机制,用以选出提供服务的路由即主控路由,其他的则成了备份路由。当主控路由失效后,备份路由中会重新选举出一个主控路由,来继续工作,来保障不间断服务。

之前已经安装过Keepalived,这里不再赘述!

分别进入128,129两台服务器的keepalived.conf配置

  1. vim /etc/keepalived/keepalived.conf
  2. -------------------------------------------------------128------------------------------------------------------
  3. global_defs {
  4.   #不与其他节点重名即可
  5.   router_id mysql_master
  6. }
  7. vrrp_script chk_mysql {     #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
  8.   script "/etc/keepalived/chk_mysql.sh"   #这里通过脚本监测
  9.   interval 6                   #脚本执行间隔,每6s检测一次
  10.   weight -5                    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
  11.   fall 2                    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
  12.   rise 1                    #检测1次成功就算成功。但不修改优先级
  13. }
  14. vrrp_instance mysql {
  15.   state BACKUP
  16.   interface eth0      #指定虚拟ip的网卡接口
  17.    #mcast_src_ip 192.168.223.129 #如果是漂移本地IP,可以不写
  18.   virtual_router_id 51    #路由器标识,MASTER和BACKUP必须是一致的
  19.   priority 100            #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
  20.   advert_int 1
  21.   authentication {
  22.       auth_type PASS
  23.       auth_pass 1111
  24.   }
  25.   virtual_ipaddress {
  26.        192.168.223.136
  27.   }
  28.   track_script {
  29.     chk_mysql
  30.   }
  31. }
  32. vim /etc/keepalived/keepalived.conf
  33. -------------------------------------------------------129------------------------------------------------------
  34. global_defs {
  35.   #不与其他节点重名即可
  36.   router_id mysql_master
  37. }
  38. vrrp_script chk_mysql {     #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
  39.   script "/etc/keepalived/chk_mysql.sh"   #这里通过脚本监测
  40.   interval 6                   #脚本执行间隔,每6s检测一次
  41.   weight -5                    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
  42.   fall 2                    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
  43.   rise 1                    #检测1次成功就算成功。但不修改优先级
  44. }
  45. vrrp_instance mysql {
  46.   state BACKUP
  47.   interface eth0      #指定虚拟ip的网卡接口
  48.    #mcast_src_ip 192.168.223.129 #如果是漂移本地IP,可以不写
  49.   virtual_router_id 51    #路由器标识,MASTER和BACKUP必须是一致的
  50.   priority 99            #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
  51.   advert_int 1
  52.   authentication {
  53.       auth_type PASS
  54.       auth_pass 1111
  55.   }
  56.   virtual_ipaddress {
  57.        192.168.223.136
  58.   }
  59.   track_script {
  60.     chk_mysql
  61.   }
  62. }

编辑监测脚本:vim /etc/keepalived/chk_mysql.sh

  1. #如果mysql服务挂掉了,就会关闭keepalived的服务,让VIP漂移到其他服务节点
  2. -------------------------------------------------------------------------------------------
  3. #!/bin/bash
  4. counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
  5. if [ "${counter}" -eq 0 ]; then
  6.    killall keepalived
  7. fi
  8. #当然,你也可以抢救1次再关闭....
  9. -------------------------------------------------------------------------------------------
  10. #!/bin/bash
  11. counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
  12. if [ "${counter}" -eq 0 ]; then
  13.    service mysql restart
  14.    sleep 5;
  15.    counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
  16.    if [ "${counter}" -eq 0 ]; then
  17.   killall keepalived
  18.    fi
  19. fi

4、测试

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

分别关停其中一个服务节点服务看看效果!

5、MyCAT双主高可用

5.1 架构图

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

5.2 准备环境

192.168.223.128 :MySQL Master1;MyCAT1,Keepalived1

192.168.223.129 :MySQL Master2;MyCAT2,Keepalived2

192.168.223.130 :MySQL Slave1;

192.168.223.131 :MySQL Slave2;

192.168.223.132 :VIP

5.3 高可用配置

5.3.1 MySQL双主同步配置

略,参考本课件第二步

5.3.2 MySQL主从同步配置

略,参考上节课课件《分库分表之Mycat进阶》

5.3.3 MyCAT配置

核心配置:schema.xml 两个MyCAT只需要配置不同的MySQL读写服务器

  1. <!-- 设置表的存储方式.schema name="TESTDB" 与 server.xml中的 TESTDB 设置一致 -->
  2.        <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100">
  3.                <table name="users" primaryKey="id"  dataNode="dn1" />
  4.                <table name="item" primaryKey="id" dataNode="dn$2-3" rule="role1"/>
  5.        </schema>
  6.  
  7.        <!-- 设置表的存储方式.schema name="TESTDB" 与 server.xml中的 TESTDB 设置一致 -->
  8.        <dataNode name="dn1" dataHost="localhost1" database="db01" />
  9.        <dataNode name="dn2" dataHost="localhost1" database="db02" />
  10.        <dataNode name="dn3" dataHost="localhost1" database="db03" />
  11. ---------------------------------128--------------------------------------------------------
  12.        <!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 -->
  13.        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
  14.                          writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
  15.                <heartbeat>select user()</heartbeat>
  16.                <!-- can have multi write hosts -->
  17.                <writeHost host="hostM1" url="jdbc:mysql://192.168.223.128:3306" user="root" password="root">
  18.                        <readHost host="hostS1" url="jdbc:mysql://192.168.223.130:3306" user="root" password="root"/>  
  19.                </writeHost>
  20.                <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
  21.        </dataHost>
  22. ---------------------------------129--------------------------------------------------------
  23. <!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 -->
  24.        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
  25.                          writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
  26.                <heartbeat>select user()</heartbeat>
  27.                <!-- can have multi write hosts -->
  28.                <writeHost host="hostM1" url="jdbc:mysql://192.168.223.129:3306" user="root" password="root">
  29.                        <readHost host="hostS1" url="jdbc:mysql://192.168.223.131:3306" user="root" password="root"/>  
  30.                </writeHost>
  31.                <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
  32.        </dataHost>

5.3.4 Keepalived配置

keepalived.conf

  1. -------------------------------------128---------------------------------------------
  2. ! Configuration File for keepalived
  3. global_defs {
  4.    #不与其他节点重名即可
  5.   router_id mycat
  6. }
  7. vrrp_script chk_mycat {     #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
  8.   script "/etc/keepalived/chk_mycat.sh"   #这里通过脚本监测
  9.   interval 6                   #脚本执行间隔,每6s检测一次
  10.   weight -5                    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
  11.   fall 2                    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
  12.   rise 1                    #检测1次成功就算成功。但不修改优先级
  13. }
  14. vrrp_instance mycat {
  15.   state BACKUP
  16.   interface eth0      #指定虚拟ip的网卡接口
  17.   virtual_router_id 51    #路由器标识,MASTER和BACKUP必须是一致的
  18.   priority 90            #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优
  19. 先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
  20.   authentication {
  21.       auth_type PASS
  22.       auth_pass 1111
  23.   }
  24.   virtual_ipaddress {
  25.        192.168.223.132
  26.   }
  27.     track_script {
  28.     chk_mycat
  29.   }
  30. }
  31. -------------------------------------129---------------------------------------------
  32. ! Configuration File for keepalived
  33. global_defs {
  34.    #不与其他节点重名即可
  35.   router_id mycat
  36. }
  37. vrrp_script chk_mycat {     #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
  38.   script "/etc/keepalived/chk_mycat.sh"   #这里通过脚本监测
  39.   interval 6                   #脚本执行间隔,每6s检测一次
  40.   weight -5                    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
  41.   fall 2                    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
  42.   rise 1                    #检测1次成功就算成功。但不修改优先级
  43. }
  44. vrrp_instance mycat {
  45.   state BACKUP
  46.   interface eth0      #指定虚拟ip的网卡接口
  47.   virtual_router_id 51    #路由器标识,MASTER和BACKUP必须是一致的
  48.   priority 100            #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优
  49. #先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
  50.   authentication {
  51.       auth_type PASS
  52.       auth_pass 1111
  53.   }
  54.   virtual_ipaddress {
  55.        192.168.223.132
  56.   }
  57.     track_script {
  58.     chk_mycat
  59.   }
  60. }

存活脚本 chk_mycat:

  1. #!/bin/bash
  2. counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
  3. if [ "${counter}" -eq 0 ]; then
  4.    service mysqld restart
  5.    sleep 5;
  6.    counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
  7.    if [ "${counter}" -eq 0 ]; then
  8.       /usr/local/mycat/bin/mycat stop
  9.        killall keepalived
  10.    fi
  11. fi

PS:由于节点过多,镜像文件是复制的,一定要注意mysql的server_id和server_uuid不要相同,否则会报错

一定一定注意请检查每个数据库节点是否存在相同的server_id/server_uuid:

show variables like '%server%id%';

检测脚本执行一定要小于检测脚本执行间隔时间,否则当前检测进程还没执行完,会被下一个进程挂起,永远也不会成功!

 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/675511
推荐阅读
相关标签
  

闽ICP备14008679号