Keepalived 采用 VRRP CVirtual Router Redundancy Protocol , 虚拟路由冗余协议) ,以 软件 的形式实现服务的热备功能 。 通常情况下是将两台 Linux 服务器组成一个热备组 (Master 和 Backup ) ,同 一时间内热备组只有 一 台主服务器 Master 提供服务,同时 Master 会虚拟出一个公 用的虚拟 E 地址,简称 VIP 。 这个 VIP 只存在于 Master 上并对外提供服务 。 如果 Keepalived 检测到 Master 宿机或者服务故障,备份服务器 Backup 会自动接管 VIP 并成为 Master , Keepalived 将原 Master 从热备组中移除 。 当原 Master 恢复后,会自动加入到热备组,默认再抢占成为 Master , 起到故障转移的功能 。 Keepalived 工作在 OSI 模型中的第 3 层、第 4 层和第 7 层 。 工作在第 3 层是指 Keepalived 会定期向热备组中的服务器发送一个 ICMP 数据包来判断某 台服务器是否故障,如果故障则将这台服务器从热备组移除。 工作在第 4 层是指 Keepalived 以 TCP 端口的状态判断服务器是否故障,比如检测 RabbitMQ 的 5672 端口,如果故障则将这台服务器从热备组中移除。 工作在第 7 层是指 Keepalived 根据用户设定的策略(通常是一个自定义的检测脚本)判断 服务器上的程序是否正常运行,如果故障将这台服务器从热备组移除
部分参数详解:
nopreempt : 通常如果master服务死掉后backup会变成master,但是当master服务又好了的时候 master此时会抢占VIP,这样就会发生两次切换对业务繁忙的网站来说是不好的。所以我们要在配置文件加入 nopreempt 非抢占,但是这个参数只能用于state 为backup,故我们在用HA的时候最好master 和backup的state都设置成backup 让其通过priority来竞争。
vim /etc/keepalived/keepalived.conf #(见下面文件详细配置) #启动服务 /etc/init.d/keepalived start #启动后加载配置文件(一般无需该操作,只有在更新了配置之后重新加载时使用) /usr/sbin/keepalived -f /etc/keepalived/keepalived.conf #如下是keepalived.conf配置文件内容,因为我们的需求是主主热备,无需其他功能,故主从的配置文件一致即可 #在同一局域网内,两组keepalived两参数 router_id 和 virtual_router_id 不可以一致 # #主从库需要区别修改的三处如下: # # state 初始状态值,主库对应参数为 MASTER 从库对应的参数为 BACKUP # priority 主库的优先级参数为150 从库的优先级参数为 100 注意这里的参数,从库的优先级一定要低于主库 # virtual_ipaddress 定义虚拟VIP地址以及绑定的网卡参数 # ###########################keepalived.conf配置内容########################## ! Configuration File for keepalived global_defs { router_id mysql #keepalive主机标识,这里的标识很重要,影响到主从库之间的keepalived通讯 } vrrp_script check_run { script "/etc/keepalived/check_mysql.sh" #服务器检查脚本,主要检查mysql是否可以正常访问 interval 3 #服务检查周期,单位:秒 } vrrp_sync_group VG1 { group { VI_1 #服务组名,多个时候一个出错就切换 } notify_master /etc/keepalived/takeover.sh #状态切换为从库接管时执行该脚本,即主库宕机时,从库接管 notify_backup /etc/keepalived/recovery.sh #状态切换为主库接管时执行该脚本,即主库恢复时,从库归还 } vrrp_instance VI_1 { state BACKUP #初始状态,都设置为BACKUP,配合不抢占参数 interface eth1 #实例绑定网卡 virtual_router_id 11 #VRID标识0-255 priority 150 #主库的高优先级竞选为MASTER,从库的优先级要低于主库,故需要设置为100 advert_int 1 #检查时间,单位:秒 nopreempt #不抢占,只能设置在BACKUP上 authentication { #验证方式 auth_type PASS auth_pass 1qaz@WSX } track_script { check_run #定义程序的检查方法,调用脚本 } virtual_ipaddress { #VIP 10.10.20.205 dev eth1 label eth1:1 } }
log]# more /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id LVS_DEVEL } #vrrp_script chk_codis_port { # script "/opt/chk_codis_proxy.sh" # interval 2 # weight -5 # fall 2 # rise 1 #} vrrp_instance VI_2 { state MASTER interface bond0 virtual_router_id 37 priority 100 advert_int 6 authentication { auth_type PASS auth_pass 3333 } virtual_ipaddress { 10.50.10.165 } # track_script { # chk_codis_port # } }
-- update 2022年2月28日14:50:21
mysql 双主集群keepalived 配置
[(EDWDB01)root@edwrac1 ~]#more /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { ops@wangshibo.cn tech@wangshibo.cn } notification_email_from ops@wangshibo.cn smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MASTER-HA } vrrp_script chk_mysql_port { script "/opt/chk_mysql.sh" interval 2 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state BACKUP interface bond0 mcast_src_ip 10.50.10.49 virtual_router_id 188 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.50.10.180 } track_script { chk_mysql_port } } [(EDWDB01)root@edwrac1 ~]# [(EDWDB01)root@edwrac1 ~]#more /opt/chk_mysql.sh #!/bin/bash counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l) if [ "${counter}" -eq 0 ]; then /etc/init.d/keepalived stop fi
[(EDWDB02)root@edwrac2 ~]#more /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { ops@wangshibo.cn tech@wangshibo.cn } notification_email_from ops@wangshibo.cn smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MASTER-HA } vrrp_script chk_mysql_port { script "/opt/chk_mysql.sh" interval 2 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state MASTER interface bond0 mcast_src_ip 10.50.10.50 virtual_router_id 188 priority 80 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.50.10.180 } track_script { chk_mysql_port } }