Keepalived 是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
Keepalived 是以 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)协议为实现基础的,这个协议可以认为是实现了路由器高可用的协议,将多台提供相同功能的路由器组成一个路由器组。
这里面有一个 MASTER 和多个 BACKUP;
MASTER 上面有一个对外提供服务的 Virtual IP(VIP);
MASTER 会发组播,当 BACKUP 收不到 VRRP 包时就认为 MASTER 宕机
这时需要根据 VRRP 优先级来选举一个 BACKUP 为 MASTER,这样就保证路由器的正常使用了。
安装
github/keepalived上下载源码keepalived-2.0.18.zip,安装依赖,可参考INSTALL
预先安装:
sudo yum install make autoconf automake
sudo yum install openssl-devel libnl3-devel
然后编译安装:
unzip keepalived-2.0.18.zip
cd keepalived-2.0.18
./build_setup
./configure --prefix=/usr/local/keepalived
make
sudo make install
创建启动文件:
# 拷贝执行文件
sudo cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
# 将初始化脚本拷贝到系统初始化目录下
sudo cp keepalived/etc/init.d/keepalived /etc/init.d/
# 将keepalived配置文件拷贝到etc下
sudo cp keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# 创建keepalived文件夹
sudo mkdir /etc/keepalived/
# 将keepalived配置文件拷贝到etc下
sudo cp keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
# 添加可执行权限
sudo chmod +x /etc/init.d/keepalived
# 添加keepalived到开机启动
chkconfig --add keepalived
chkconfig keepalived on
然后编辑配置文件/etc/keepalived/keepalived.conf,可参考keepalived.conf。
配置
这里给出一主一备的配置示例:
主节点:
! Configuration File for keepalived
global_defs {
router_id lvs_master
}
vrrp_instance VI_1 {
state MASTER // 指定 keepalived 的角色,MASTER 表示此主机是主服务器,BACKUP 表示此主机是备用服务器
interface ens160 // 指定网卡
garp_master_delay 10
virtual_router_id 51 // 虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识,即同一vrrp_instance下,MASTER和BACKUP必须是一致的
priority 100 // 定义优先级,数字越大,优先级越高(0-255)在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
advert_int 1 // 设定 MASTER 与 BACKUP 负载均衡器之间同步检查的时间间隔,单位是秒
// 设置验证类型和密码
authentication {
auth_type PASS // 设置验证类型,主要有PASS和AH两种
auth_pass 1111 // 设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
}
// 设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
virtual_ipaddress {
192.168.0.100
}
}
备节点
! Configuration File for keepalived
global_defs {
router_id lvs_standby
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
garp_master_delay 10
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass asdf
}
virtual_ipaddress {
192.168.0.100
}
notify_master "sh /home/sl/keepalived/up.sh"
}
启动
此时已加入系统服务 可使用services 启动:
#启动
sudo service keepalived start
#停止
sudo service keepalived stop
#重启
sudo service keepalived restart
#查看启动情况
ps -aux |grep keepalived
查看是否启动成功:
[sl@linuxtestf9c4 keepalived-2.0.18]$ ip addr show ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:b2:a2:06 brd ff:ff:ff:ff:ff:ff
inet 10.20.43.157/24 brd 10.20.43.255 scope global ens160
valid_lft forever preferred_lft forever
inet 192.168.0.100/32 scope global ens160
valid_lft forever preferred_lft forever
inet6 fca1:571:1:24:250:56ff:feb2:a206/64 scope global mngtmpaddr dynamic
valid_lft 2591937sec preferred_lft 604737sec
inet6 fe80::250:56ff:feb2:a206/64 scope link
valid_lft forever preferred_lft forever
工作原理
理解其工作原理的核心就是要理解IP到MAC的映射,arp缓存这些概念。多台机器(A,B)设置为一个VIP也就是虚拟IP(vip)后,假设设定A为master(ip_a,mac_a),B为backup(ip_b,mac_b),主机C要访问vip,这时,因为A是master,我们应该要访问A,所以在主机C上,首次访问vip,需要arp协议去通过IP获取MAC地址,这时候会广播arp request消息,主机A,B收到消息后,因为A是master,所以响应vip的请求,返回mac_a的地址,主机C中arp缓存更新为vip–>mac_a,从而访问主机A。当主机A down掉后,B升为master,需要一个协议刷新主机C中arp缓存vip -->mac_a更新为vip–>mac_b,这样,C就可以访问B从而不中断服务。怎么知道master挂了呢?master会定时向backup广播消息,当backup收不到消息的时候,会认为master挂掉了。
对以上过程的细化就是VRRP协议去实现的,包括master选举,节点间通信处理,等等。当然,具体的VRRP协议比我说的复杂很多。上面这些是理解Keepalived工作原理最基本的核心内容,理解了后,再看VRRP协议理解Keepalived就容易很多。
最后补充讲一下VIP(虚拟IP),为什么需要VIP呢?客户端访问服务,最终要落实到ip:port才能访问到主机上的服务,如果指定为A主机或者B主机的物理ip,则,切换主机的时候,客户端也需要更改ip,这样做是十分不好的,而如果设置为vip去实现,即使物理主机切换了,vip的地址也没有变,客户端层面无需修改,这样是比较合理的。
参考资料:




