双机热备(keepalived)

keepalived是什么?

Keepalived 是Linux下一个轻量级别的高可用解决方案。除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。

Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。
keepalived官网: http://www.keepalived.org

keepalived高可用架构示意图

keepalived实践

提供2台物理机,3个内网ip分别为:10.10.10.126(主节点),10.10.10.127(备用节点),10.10.10.129 (对外提供服务的虚拟IP)
在这种模式下,虚拟IP:10.10.10.129,在某时刻只能属于某一个节点,另一个节点作为备用节点存在。当主节点不可用时,备用节点接管虚拟IP(即虚拟IP漂移至节点B),提供正常服务。

安装

在两台服务器上分别安装 keepalived,使用源码包安装。

添加配置文件
#10.10.10.126
sudo vim /etc/keepalived/keepalived.conf

global_defs {
router_id LVS_DEVEL
}

vrrp_instance VI_1 {
state MASTER #设置为备服务器(状态参数 MASTER/BACKUP
interface eth0 #虚IP地址放置的网卡位置
virtual_router_id 51 #保持主从服务器一致
priority 100 #优先级(决定是主还是备,越大越优先)
advert_int 1 #心跳广播(VRRP Multicast)间隔(秒)

authentication {
auth_type PASS #VRRP认证方式,主备必须一致
auth_pass 1234 #认证密码
}

virtual_ipaddress {
10.10.10.129 #设备之间使用的虚拟ip地址,可以多个
}
}

注意:备份服务器 10.10.10.127 配置中 state 要改成 BACKUP,同时调低 priority。

#10.10.10.127
sudo vim /etc/keepalived/keepalived.conf

global_defs {
router_id LVS_DEVEL
}

vrrp_instance VI_1 {
state BACKUP #设置为备服务器(状态参数 MASTER/BACKUP
interface eth0 #虚IP地址放置的网卡位置
virtual_router_id 51 #保持主从服务器一致
priority 99 #优先级(决定是主还是备,越大越优先)
advert_int 1 #心跳广播(VRRP Multicast)间隔(秒)

authentication {
auth_type PASS #VRRP认证方式,主备必须一致
auth_pass 1234 #认证密码
}

virtual_ipaddress {
10.10.10.129 #设备之间使用的虚拟ip地址,可以多个
}
}
启动keepalived服务
sudo service keepalived start
keepalived -D -f /usr/local/etc/keepalived/keepalived.conf

查看log消息:

tail -f /var/log/messages

启动主节点 10.10.10.126 后, messages日志为: 广播ARP消息,重启keepalived服务之后使用: ip a 查看虚拟IP信息

10.10.10.126 机器上有两个ip : 本机IP 10.10.10.126 和 虚拟IP 10.10.10.129 
10.10.10.127 机器上有一个ip : 本机IP 10.10.10.127\

在第三台机器上进行访问

curl http://10.10.10.126
curl http://10.10.10.127
curl http://10.10.10.129

为了防止备用节点浪费资源,可以使用相互热备
分别修改126和127的机器的keepalived 配置文件,增加一个新的配置:VI_2

vrrp_instance VI_1 {     
state BACKUP #设置为备服务器(状态参数 MASTER/BACKUP
interface eth0 #虚IP地址放置的网卡位置
virtual_router_id 51 #保持主从服务器一致
priority 99 #优先级(决定是主还是备,越大越优先)
advert_int 1 #心跳广播(VRRP Multicast)间隔(秒)

authentication {
auth_type PASS #VRRP认证方式,主备必须一致
auth_pass 1234 #认证密码
}

virtual_ipaddress {
10.10.10.129 #设备之间使用的虚拟ip地址,可以多个
}
}
vrrp_instance VI_2 {
state MASTER #设置为主服务器(状态参数 master/backup)
interface eth0 #虚IP地址放置的网卡位置
virtual_router_id 52 #保持主从服务器一致
priority 100 #优先级(决定是主还是备,越大越优先)
advert_int 1 #心跳广播(VRRP Multicast)间隔(秒)

authentication {
auth_type PASS #VRRP认证方式,主备必须一致
auth_pass 1234 #认证密码
}

virtual_ipaddress {
10.10.10.130 #设备之间使用的虚拟ip地址,可以多个
}
}