5 keepalived实现mysql双主架构
5.1 架构介绍
企业级Mysql集群具备高可用、可扩展、以管理、低成本的特点。下面将介绍企业环境中经常应用的一个解决方案,即Mysql的双主互备架构,主要设计思想是通过Mysql复制技术将两台Mysql服务器互相将对方作为自己的主服务器,自己又同时作为对方的从服务器来进行复制。这样就实现了高可用架构中的数据同步功能,同时,将采用keepalived来实现mysql的自动故障切换。在这个架构中,虽然两台Mysql服务器互为主从,但同一时刻只有一个Mysql服务器可读写,另一个Mysql服务器只能进行读操作,这样可保证数据的一致性。整个架构如下:
如上图,DB1和DB2互为主从,这样就保证了两台Mysql服务器的数据始终是同步的,同时在DB1和DB2上还需要安装高可用软件keepalived。在正常情况下,Web服务器主机仅从DB1进行数据的读写操作,DB2主负责从DB1同步数据。而Keepalived维护一个VIP,此IP用来对外部提供链接服务。同时,keepalived还负责监控DB1和DB2上Mysql数据库的运行状态。当DB1主机出现故障或者Mysql运行异常时,自动将VIP地址和Mysql服务切换到DB2上,此时Web服务器主机继续从DB2进行数据的读写操作。通过Keepalived保持了数据库服务的连续性,整个切换过程非常快,并且对前端Web服务器主机是透明的
5.2 主主互备模式配置
(略)
5.3 配置Keepalived实现Mysql双主高可用
5.3.1 安装keepalived
参考《企业级web集群——keepalived》
安装软件
wget https://www.keepalived.org/software/keepalived-2.0.1.tar.gz?[[email protected] keepalived-2.0.1]# tar -xf keepalived-2.0.1.tar.gz -C /usr/local/src/[[email protected] keepalived-2.0.1]# mkdir -p /data/keepalived[[email protected] keepalived-2.0.1]# yum install openssl-devel gcc gcc-c++ make[[email protected] keepalived-2.0.1]# ./configure --prefix=/data/keepalived/make make install
配置规范启动
[[email protected] etc]# pwd/usr/local/src/keepalived-2.0.1/keepalived/etc[[email protected] etc]# cp -R init /data/keepalived/ [[email protected] etc]# cp -R init /data/keepalived/etc/ [[email protected] etc]# cp -R init.d /data/keepalived/etc/[[email protected] etc]# ll /data/keepalived/etc/总用量 0drwxr-xr-x. 2 root root 86 4月 20 12:03 initdrwxr-xr-x. 2 root root 135 4月 20 12:03 init.ddrwxr-xr-x. 3 root root 44 4月 20 11:00 keepaliveddrwxr-xr-x. 2 root root 24 4月 20 11:00 sysconfig
[[email protected] etc]# cp /data/keepalived/etc/init.d/keepalived /etc/init.d/[[email protected] etc]# cp /data/keepalived/etc/sysconfig/keepalived /etc/sysconfig/[[email protected] etc]# mkdir /etc/keepalived[[email protected] etc]# cp /data/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/[[email protected] etc]# cp /data/keepalived/sbin/keepalived /usr/sbin/
启动
[[email protected] etc]# /etc/init.d/keepalived startStarting keepalived (via systemctl): [ 确定 ][[email protected] etc]# ps -ef |grep keepalivedroot 14858 1 0 12:07 ? 00:00:00 /data/keepalived/sbin/keepalived -Droot 14859 14858 0 12:07 ? 00:00:00 /data/keepalived/sbin/keepalived -Droot 14860 14858 0 12:07 ? 00:00:00 /data/keepalived/sbin/keepalived -Droot 14875 1702 0 12:09 pts/1 00:00:00 grep --color=auto keepalived
5.3.2 keepalived配置
在ser01上:
[[email protected] ~]# cat /etc/keepalived/keepalived.conf! Configuration File for keepalived?global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id HA_MYSQL01}?vrrp_script check_mysqld { script "/etc/keepalived/check_mysqld.sh" interval 2}?vrrp_instance HA_1 { state MASTER interface eth0 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.42.201 }? track_script { check_mysqld }}
在ser02上:
! Configuration File for keepalived?global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id HA_MYSQL01}?vrrp_script check_mysqld { script "/etc/keepalived/check_mysqld.sh" interval 2}?vrrp_instance HA_1 { state BACKUP interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.42.201 }? track_script { check_mysqld }}
监控脚本:
[[email protected] ~]# cat /etc/keepalived/check_mysqld.sh #!/bin/bashuser=rootpass[email protected]/usr/local/mysql/bin/mysql -u$user -p$pass -e "show status;" > /dev/null 2>&1if [ $? -eq 0 ]; then MYSQL_STATUS=0 else MYSQL_STATUS=1fiexit $MYSQL_STATUS[[email protected] ~]# chmod +x /etc/keepalived/check_mysqld.sh
按照以上的配置,虽然能够完成故障的切换,但是在数据库的应用场景中,我们不建议数据库的频繁切换,因此,我们可将其配置为keepalived的VIP不抢占模式。具体配置如下:
在ser01上:
[[email protected] keepalived]# cat keepalived.conf! Configuration File for keepalived?global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id HA_MYSQL01}?vrrp_script check_mysqld { script "/etc/keepalived/check_mysqld.sh" interval 2}?vrrp_instance HA_1 { state BACKUP #在ser01和ser02上均配置为backup interface eth0 virtual_router_id 51 priority 150 advert_int 1 nopreempt #不抢占模式,只在优先级高的机器上设置即可,优先级低的机器上不设置。 authentication { auth_type PASS auth_pass 1111 }? virtual_ipaddress { 192.168.42.201 }? track_script { check_mysqld }}
在ser02上:
[[email protected] keepalived]# cat keepalived.conf ! Configuration File for keepalived?global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id HA_MYSQL01}?vrrp_script check_mysqld { script "/etc/keepalived/check_mysqld.sh" interval 2}?vrrp_instance HA_1 { state BACKUP #在ser01和ser02上均配置为backup interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.42.201 }? track_script { check_mysqld }}
在优先级比较高的节点上配置成非抢占模式,使得我们故障切换后,保持在原节点上,这种场景在mysql数据库高可用方案中非常实用。
5.4 Mysql配置账号测试
5.4.1 授权账号
mysql> create user ‘keepalived‘@‘%‘ identified by ‘[email protected]‘;mysql> ALTER USER ‘keepalived‘@‘%‘ IDENTIFIED WITH mysql_native_password BY ‘[email protected]‘;mysql> flush privileges;
5.4.2 结果测试
在测试节点上用192.168.42.201,即浮动ip测试。
mysql -h192.168.42.201 -ukeepalived [email protected]
当我们ser01失败后,ser02能够实现数据的读写;
当ser01恢复后,能够实现数据同步,vip并没有漂移到ser01,而是保持在ser02上;
当ser02故障后,VIP自然漂移到了ser01上。
原文地址:https://www.cnblogs.com/anttech/p/11296127.html