赞
踩
森格 | 2023年1月
本文旨在记录学习主从时的拓展内容,怎么借助keepalived实现简单的高可用。
keepalived的作用是检测服务器的状态,若某一台服务器宕机,会通过VIP(虚拟IP)的漂移选择另一台服务器,从而实现高可用。
它的工作原理是VRRP,即虚拟路由冗余协议,其中有两组重要概念:
其实也好理解,对于第一组概念,VRRP路由器是物理实体,指的是运行VRRP的路由器;虚拟路由器是VRRP创建的,是一种逻辑概念,一组VRRP路由器协同工作,共同构成一台虚拟路由器。
对于第二组概念,其协议中存在着一种选举机制,用于选出提供服务的路由即为主控路由,其他的则成了备份路由。当主控路由失效后,会从备份路由中重新选举出一个主控路由,来继续工作,保障服务的不间断。
对于主从同步的模式分为很多,这里选择用双主模式,个人理解为,两台机器互为主备,一台主机宕机,另一台机器可以继续提供服务。
两台机器做双主同步,如果一台宕机,在没有VIP的时候,是不是需要我们手动去切换节点,这个过程是相对是非常耗时的,加入keepalived后,我们服务器的请求直接发送到VIP上,由VIP选择要去访问的IP,对于用户可以认为是无感知的,这也是它最大的优点。
和主从同步的配置是一样的,这里可以参照我的上一篇文章《[MySQL]-主从同步实战》。
唯一要注意的就是,这篇文章是一主一从,对于双主,就是在两台机器上都布置下一主一从就可以,同时第二台机器部署主从同步时,可以不需要再去dump了。
开始之前呢,我们需要两台机器,和一个其他机器的IP当做VIP来使用。
要在两台机器上都部署keepalived
# 下载 wget http://www.keepalived.org/software/keepalived-1.4.5.tar.gz # 解压缩 tar -zxf keepalived-1.4.5.tar.gz # 编译安装 cd keepalived-1.4.5 ./configure --prefix=/xx/xx/keepalived (你的安装路径) make && make install # 复制所需文件 cp /xx/xx/keepalived/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/ cp /xx/xx/keepalived/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ # 复制配置文件 mkdir /etc/keepalived cp /xx/xx/keepalived/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ echo "/etc/init.d/keepalived start" >> /etc/rc.local
# 编辑配置文件
vim /etc/keepalived/keepalived.conf
机器1的配置:
! Configurateon Fll-cmd --list-portsile for keepalived global_defs { router_id 1 } vrrp_script chk_mysql_port { #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等 script "/etc/keepalived/mysql.sh" #这里通过脚本监测 interval 2 #脚本执行间隔,每2s检测一次 weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5 fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间) rise 1 #检测1次成功就算成功。但不修改优先级 } vrrp_instance VI_1 { # state MASTER state BACKUP nopreempt #非抢占模式 interface ens192 #指定虚拟ip的网卡接口 mcast_src_ip IP2 #机器1的IP virtual_router_id 51 #路由器标识,MASTER和BACKUP必须是一致的 priority 101 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { VIP #虚拟IP } track_script { chk_mysql_port } }
机器2的配置:
! Configuration File for keepalived global_defs { router_id 2 } vrrp_script { #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等 script "/etc/keepalived/mysql.sh" #这里通过脚本监测 interval 2 #脚本执行间隔,每2s检测一次 weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5 fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间) rise 1 #检测1次成功就算成功。但不修改优先级 } vrrp_instance VI_1 { # state MASTER state BACKUP nopreempt #非抢占模式 interface ens192 #指定虚拟ip的网卡接口 mcast_src_ip IP2 #机器2的IP virtual_router_id 51 #路由器标识,MASTER和BACKUP必须是一致的 priority 100 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { VIP #虚拟IP } track_script { chk_mysql_port } }
检测脚本 mysql.sh (我这里的两台机器数据库的端口为3307)
#!bin/bash
source ~/.bash_profile
counter=$(netstat -na|grep "LISTEN"|grep "3307"|wc -l)
if [ "${counter}" -eq 0 ]; then
/etc/init.d/keepalived stop
fi
chmod 755 /etc/keepalived/mysql.sh
启动
/etc/init.d/keepalived start
正在启动 keepalived: [确定]
# 查看两台机器的网卡情况
# 因为我们给机器1的priority要大一些,所以机器1的网卡上可以看到VIP的信息
inet VIP/32 scope global ens192
下面我们试着让机器1的mysql宕机,宕机之后我们再看一下VIP是在哪台机器上
# 这里模拟的比较简单,直接将3307端口干掉了
lsof -i:3307 | awk 'NR!=1{print $2}' | xargs kill -9
之后如果你的配置一切正常,再次查看两台机器的网卡情况后,如果在机器2上看到VIP的信息,那么到这里就说明你的双主+keepalived的高可用配置成功了。你的用户只需要访问VIP的地址,对IP的漂移是无感知的。这样一来,等到下次你的机器挂掉一台,就不用再去进行手动切换了。
本文章介绍了MySQL最普通的一种高可用方案,优点很明显,但是回过头来,我们也要去思考是否存在缺点。下面是小编个人总结的优缺点:
优点:
缺点:
所以,这么看来,任何一种方案都不是完美的,继续加油学习吧!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。