Keepalived是集群管理中保证集群高可用的软件,类似heartbeat,可以检测服务器/服务的健康状态,防止单点故障,实现主备切换。
Keepalived工作原理
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。
Keepalived安装
准备工作
Keepalived是集群高可用服务器软件,所以集群至少有两台以上服务器,例如:
- Linux服务器A: 192.168.1.106
- Linux服务器B: 192.168.1.107
- 虚拟IP(VIP): 192.168.1.109
安装Keepalived
以Ubuntu系统为例,在集群的每台机器上重复以下安装步骤:
# 下载安装包 wget https://www.keepalived.org/software/keepalived-2.0.16.tar.gz # 解压 tar zxvf keepalived-2.0.16.tar.gz cd keepalived-2.0.16 # 配置编译参数 ./configure --prefix=/usr/local/keepalived # 编译 make # 安装 sudo make install
安装完Keepalived后,为了快捷启动keepalived, 可以注册keepalived为系统服务,操作步骤如下:
# 将Keepalived安装包目录下的二进制文件移动到/etc/init.d/下 sudo cp keepalived-2.0.16/keepalived/etc/init.d/keepalived /etc/init.d/ # 因为keepalived默认读取/etc/keepalived/keepalived.conf配置文件,可以通过ln将安装包中的配置文件建立软连接,方便进行统一管理 sudo mkdir /etc/keepalived sudo ln -s /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
可以通过如下命令管理Keepalived:
- 启动Keepalived: sudo service keepalived start
- 关闭Keepalived: sudo service keepalived stop
- 查看Keepalived运行状态: sudo service keepalived status
配置高可用集群
设定Linux服务器A(192.168.1.106)为主服务器, Linux服务器B(192.168.1.107),虚拟IP为192.168.1.109, 修改配置文件
/etc/keepalived/keepalived.conf进行配置。
主服务器(192.168.1.106)配置:
! Configuration File for keepalived global_defs { notification_email { } notification_email_from ravior@gitlib.com smtp_server smtp.qq.com smtp_connect_timeout 30 router_id nginx_master vrrp_skip_check_adv_addr #vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state MASTER # 标记为主服务器 interface enp0s3 # VVIP绑定的网卡 virtual_router_id 51 # 虚拟路由ID, 同一组VRRP示例改值相同 priority 50 # 优先级,当主服务器宕机后,备用服务器依据这个值选举新的主服务器,这个值越高优先级越高,主服务器的值一定要比从服务器大 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.109/24 # 配置虚拟IP } }
从服务器(192.168.1.107)配置:
! Configuration File for keepalived global_defs { notification_email { } notification_email_from ravior@gitlib.com smtp_server smtp.qq.com smtp_connect_timeout 30 router_id nginx_master vrrp_skip_check_adv_addr #vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state BACKUP # 标记为从服务器 interface enp0s3 # VVIP绑定的网卡 virtual_router_id 51 # 虚拟路由ID, 同一组VRRP示例改值相同 priority 10 # 优先级,当主服务器宕机后,备用服务器依据这个值选举新的主服务器,这个值越高优先级越高,主服务器的值一定要比从服务器大 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.109/24 # 配置虚拟IP } }
启动主从服务器Keepalived服务器,查看服务器的IP: ip addr show
可以看到主服务器,成功获取到虚拟IP(VIP)
脑裂问题
如果两台服务器都拥有虚拟IP,则说明发生了脑裂,证明目前双机通信出现问题,产生此问题的原有在于两台服务器都探测不到组内其他服务器的状态(心跳请求无法正常响应),私自判定另一台服务器挂起,则抢占虚拟IP,脑裂的出现是不被允许的,解决此问题的方法为检查防火墙设置(关闭防火墙)或者使用串口通信。