Keepalived是什么?
Keepalived是一种用于实现高可用性(HA)的开源软件,它通过虚拟路由冗余协议(VRRP,Virtual Router Redundancy Protocol)来实现主备切换,从而提高服务的可用性。
虚拟路由冗余协议(VRRP,Virtual Router Redundancy Protocol)是什么?
虚拟路由冗余协议(VRRP,Virtual Router Redundancy Protocol)是一种网络协议,用于在多个路由器之间实现虚拟路由器的高可用性。它允许多个物理路由器共享一个虚拟IP地址,从而在主路由器(Master)故障时自动切换到备份路由器(Backup),确保网络服务的连续性。以下是VRRP的工作原理和实现方式:
VRRP的基本原理
虚拟路由器:
在VRRP中,一组物理路由器被视为一个虚拟路由器,拥有一个虚拟IP地址(VIP)。
虚拟路由器对外界看起来像是一个单独的路由器。
角色划分:
每个参与VRRP的物理路由器会被分配一个角色:主路由器(Master)或备份路由器(Backup)。
主路由器负责处理虚拟IP地址的所有流量,而备份路由器在主路由器故障时接管该流量。
优先级:
每个路由器都有一个优先级,范围从1到255。优先级越高,该路由器越有可能成为主路由器。
通常情况下,优先级最高的路由器会被选为主路由器。
VRRP广告报文:
主路由器会定期发送VRRP广告报文,通知备份路由器自己处于正常工作状态。
广告报文中包含虚拟路由器的ID、优先级、广告间隔等信息。
故障切换:
如果备份路由器在规定时间内未收到主路由器的广告报文,则认为主路由器故障,进行主备切换。
备份路由器中优先级最高的路由器会成为新的主路由器,并开始发送广告报文。
理解了VRRP协议,在去看Keeepalived就会好理解很多。
Keepalived 中什么是VIP
VIP(Virtual IP,虚拟IP地址)是指由多个物理服务器或节点共享的一个IP地址。VIP用于在高可用性(HA)环境中,实现对外提供一个固定的访问入口,尽管实际的服务可能在不同的物理节点上运行。通过使用VIP,客户端只需要连接到这个固定的IP地址,而不需要关心背后的物理服务器的变化。
Keepalived通常在局域网中工作
以上,我们知道什么是VRRP协议也知道它是怎么选举的
所以, Keepalived 通常在同一个局域网(LAN)中工作。
在配置 Keepalived 时,确保所有参与的节点(包括主节点和备份节点)都在同一个子网内,并且能够互相进行组播通信。
例如:
主节点和备份节点的 IP 地址可能分别是
192.168.31.190 和 192.168.31.191。
虚拟 IP 地址可以配置为 192.168.31.200
Ubuntu安装Keepalived
第一步: 下载Keepalived
sudo apt-get update
sudo apt-get install keepalived
第二步: 配置Keepalived
说一下我的ip 190 主库,191是备库
在主库备库 /etc/keepalived中创建
check_mysql.sh keepalived.conf
这个两配置文件check_mysql.sh 是一样的
这里配置的时候需要注意的是weight -10,这个数字必须是负数, 不然即使你的脚本执行成功也不会切换到备库,因为你的权重没有减少, Keepalived不会选举备库为master
主库keepalived.conf配置:
! Configuration File for keepalived
global_defs {
router_id MySQL-HA
}
vrrp_script check_mysql {
script "/etc/keepalived/check_mysql.sh"
interval 2
weight -10
}
vrrp_instance mysql-ha {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass abc12345
}
track_script {
check_mysql
}
virtual_ipaddress {
192.168.31.200
}
}
备库keepalived.conf配置:
! Configuration File for keepalived
global_defs {
router_id MySQL-HA
}
vrrp_script check_mysql {
script "/etc/keepalived/check_mysql.sh"
interval 2
weight -10
}
vrrp_instance mysql-ha {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass abc12345
}
track_script {
check_mysql
}
virtual_ipaddress {
192.168.31.200
}
}
主备库的check_mysql.sh 脚本
if ! mysql -u root -p'abc12345' -e "show status;" &>/dev/null; then
exit 1
fi
exit 0
为什么是etc/keepalived 这个路径?
Keepalived 知道默认的配置文件位置是 /etc/keepalived/keepalived.conf,因为这是预定义的标准位置。
第三步: 启动Keepalived
启动命令:
在主从服务器上分别启动Keepalived服务:
sudo systemctl start keepalived
设置Keepalived服务开机自启动:
sudo systemctl enable keepalived
重启Keepalived
sudo systemctl restart keepalived
停止Keepalived
sudo systemctl stop keepalived
主库宕机之后,切换到备库需要注意的问题
- 主库宕机之后, 由于两边数据是不一样的, 我应该怎么知道Keepalived现在在哪台机器上?
使用ip addr show
命令, 这里可以看到我的虚拟ip在我的主库上
190是主库哈
然后我把主库的mysql关闭模拟宕机之后的场景,使用sudo systemctl status keepalived
命令看到,我这个已经成为备用的了
这个时候我在把主库启动看看会不会恢复过来, 也是成功恢复
到这里主备配置成功
需要注意的点:
- keepalived.conf文件中的auth_pass 主备必须一样
- keepalived.conf文件中的virtual_router_id 也必须一样
- keepalived.conf文件中的vrrp_script里面的weight 必须为负数
- vrrp_script仅仅通过监控脚本返回的状态码来识别集群服务是否正常,如果返回状态码是0,那么就认为服务正常 ,check_mysql 脚本的返回值为 1,表示脚本执行失败