Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。
在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP(VIP),主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
keepalived体系架构中主要有三个模块,分别是core、check和vrrp。
●core模块:为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。
●vrrp模块:是来实现VRRP协议的。(调度器之间的健康检查和主备切换)
●check模块:负责健康检查,常见的方式有端口检查及URL检查。(节点服务器的健康检查)

1)负载均衡 用于提高群集的性能 LVS Nginx HAProxy SLB F5
2)健康检查(探针) 针对于调度器和节点服务器 Keepalived Heartbeat
3)故障转移 通过VIP漂移实现主备切换 VRRP 脚本
1)发送心跳消息 vrrp报文 ping/pong
2)TCP端口检查 向目标主机的 IP:PORT 发起TCP连接请求,如果TCP连接三次握手成功则认为健康检查正常,否则认为健康检查异常
3)HTTP URL检查 向目标主机的URL路径(比如http://IP:PORT/URI路径)发起 HTTP GET 请求方法,如果响应消息的状态码为 2XX 或 3XX,则认为健康检查正常
如果响应消息的状态码为 4XX 或 5XX,则认为健康检查异常
Keepalived 是基于 VRRP 协议实现的高可用方案。
默认情况下通过优先级决定主备服务器的角色(优先级最高的为主),主服务器(MASTER)会通过ip命令在本地生成VIP,接收并处理客户端发送的请求消息;同时主服务器还会定时发送VRRP报文给备服务器(BACKUP)告知主服务器的存活状态。当主服务器异常时,备服务器就会接管VIP(也是通过ip命令生成VIP),继续提供服务,保证服务的高可用。
- 抢占模式:MASTER节点从故障中恢复后,会将VIP从BACKUP节点中抢占过来。
- 非抢占模式:MASTER节点恢复后不抢占VIP。(主备节点的state都配置为BAKCUP,且都添加配置nopreempt)
现象:主服务器和备服务器都同时拥有相同的VIP
原因:因为主服务器和备服务器的通信中断,导致备服务器无法收到主服务器发送的VRRP报文,备服务器误认为主服务器已经故障了并通过ip命令生成VIP
解决:关闭主服务器或备服务器其中一个的keepalived服务
预防:(1)如果是系统防火墙导致,则关闭防火墙或添加防火墙规则放通VRRP组播地址(224.0.0.18)的传输
(2)如果是主备服务器之间的通信链路中断导致,则可以在主备服务器之间添加双链路通信
(3)在主服务器使用脚本定时判断与备服务器通信链路是否中断,如果判断是主备服务器之间的链接中断则自行关闭主服务器上的keepalived服务
(4)利用第三方应用或监控系统检测是否发生了脑裂故障现象,如果确认发生了脑裂故障则通过第三方应用或监控系统来关闭主服务器或备服务器其中一个的keepalived服务





- [root@l4 ~]# systemctl disable firewalld.service
- Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
- Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
- [root@l4 ~]# setenforce 0
- [root@l4 ~]# vim /etc/selinux/config
- [root@l4 ~]#

- [root@l4 ~]# df
- 文件系统 1K-块 已用 可用 已用% 挂载点
- devtmpfs 1913544 0 1913544 0% /dev
- tmpfs 1930624 0 1930624 0% /dev/shm
- tmpfs 1930624 12744 1917880 1% /run
- tmpfs 1930624 0 1930624 0% /sys/fs/cgroup
- /dev/mapper/centos-root 38770180 4578304 34191876 12% /
- /dev/sda1 1038336 191104 847232 19% /boot
- tmpfs 386128 40 386088 1% /run/user/0
- /dev/sr0 4635056 4635056 0 100% /run/media/root/CentOS 7 x86_64
- [root@l4 ~]# mount /dev/sr0 /mnt
- mount: /dev/sr0 写保护,将以只读方式挂载
- [root@l4 ~]#
- [root@l4 ~]# df //下载keepalived
- 文件系统 1K-块 已用 可用 已用% 挂载点
- devtmpfs 1913544 0 1913544 0% /dev
- tmpfs 1930624 0 1930624 0% /dev/shm
- tmpfs 1930624 12744 1917880 1% /run
- tmpfs 1930624 0 1930624 0% /sys/fs/cgroup
- /dev/mapper/centos-root 38770180 4578976 34191204 12% /
- /dev/sda1 1038336 191104 847232 19% /boot
- tmpfs 386128 40 386088 1% /run/user/0
- /dev/sr0 4635056 4635056 0 100% /mnt
- [root@l4 ~]# cd /mnt/Packages/
- [root@l4 Packages]# ls | grep keepalived
- keepalived-1.3.5-19.el7.x86_64.rpm
- [root@l4 Packages]#
- [root@l4 Packages]# cd /etc/yum.repos.d/
- [root@l4 yum.repos.d]# ls
- local.repo repo.bak
- [root@l4 yum.repos.d]# mv repo.bak/* . //在线源挪出来
- [root@l4 yum.repos.d]# mv local.repo repo.bak/ //本地源移进去
- [root@l4 yum.repos.d]#
- [root@l4 yum.repos.d]# ls
- CentOS-Base.repo CentOS-fasttrack.repo CentOS-Vault.repo
- CentOS-CR.repo CentOS-Media.repo CentOS-x86_64-kernel.repo
- CentOS-Debuginfo.repo CentOS-Sources.repo repo.bak
- [root@l4 yum.repos.d]# yum install -y epel-release
[root@l4 yum.repos.d]# yum install -y keepalived
关闭同步
- [root@l5 yum.repos.d]# cd /etc/keepalived/
- [root@l5 keepalived]# ls
- keepalived.conf
- [root@l5 keepalived]# vim keepalived.conf


- ! Configuration File for keepalived
-
- global_defs {
- notification_email {
- acassen@firewall.loc
- failover@firewall.loc
- sysadmin@firewall.loc
- }
- notification_email_from Alexandre.Cassen@firewall.loc
- smtp_server 127.0.0.1
- smtp_connect_timeout 30
- router_id LVS_01
- }
-
- vrrp_instance VI_1 {
- state MASTER
- interface ens33
- virtual_router_id 51
- priority 100
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.18.100
- }
- }
- [root@l4 ~]# cd /etc/keepalived/
- [root@l4 keepalived]# ls
- keepalived.conf
- [root@l4 keepalived]# cp keepalived.conf keepalived.conf.bak
- [root@l4 keepalived]# vim keepalived.conf
-

- ! Configuration File for keepalived
-
- global_defs {
- notification_email {
- acassen@firewall.loc
- failover@firewall.loc
- sysadmin@firewall.loc
- }
- notification_email_from Alexandre.Cassen@firewall.loc
- smtp_server 127.0.0.1
- smtp_connect_timeout 30
- router_id LVS_02
- }
-
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 51
- priority 90
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.18.100
- }
- }
主(5号机):
- [root@l5 keepalived]# systemctl start keepalived.service
- [root@l5 keepalived]# systemctl enable keepalived.service
- Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
- [root@l5 keepalived]#
备服务器也同上
- systemctl start keepalived.service
- systemctl enable keepalived.service
主:
备:
主:
防火墙没有关,关闭防火墙
[root@l5 keepalived]# systemctl stop firewalld.service
备服务器也如上操作
这个时候如果关闭主 keepalived
[root@l5 keepalived]# systemctl stop keepalived.service
没有vip地址

备 有VIP地址

抢占模式:MASTER节点从故障中恢复后,会将VIP从BACKUP节点中抢占过来。
主打开keepalived
- [root@l5 keepalived]# systemctl start keepalived.service
- [root@l5 keepalived]# vim keepalived.conf
-

[root@l5 keepalived]# systemctl stop keepalived.service
备 :

[root@l4 keepalived]# systemctl stop keepalived.service
非抢占模式:MASTER节点恢复后不抢占VIP。(主备节点的state都配置为BAKCUP,且都添加配置nopreempt)
不再按照优先级,而是按照启动顺序
由于虚拟机冲突,这里我们把四号机改成nfs,一号机接替他的工作(备)
- [root@localhost ~]# showmount -e //nfs
- Export list for localhost.localdomain:
- /share/xy102 192.168.18.0/24
- /share/xy101 192.168.18.0/24
- [root@localhost ~]#
两个节点服务器








二号机
[root@l2 ~]# cd /etc/sysconfig/network-scripts/

[root@l2 network-scripts]# vim ifcfg-lo:0


- [root@l2 network-scripts]# sysctl -p
- net.ipv4.conf.lo.arp_ignore = 1
- net.ipv4.conf.all.arp_ignore = 1
- net.ipv4.conf.lo.arp_announce = 2
- net.ipv4.conf.all.arp_announce = 2
- [root@l2 network-scripts]#
- [root@l2 network-scripts]# route -n //路由
- Kernel IP routing table
- Destination Gateway Genmask Flags Metric Ref Use Iface
- 0.0.0.0 192.168.18.2 0.0.0.0 UG 100 0 0 ens33
- 192.168.18.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
- 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
- [root@l2 network-scripts]#
- [root@l2 network-scripts]# route add -host 192.168.18.100 dev lo:0 //添加路由(临时添加)
- [root@l2 network-scripts]# route -n
- Kernel IP routing table
- Destination Gateway Genmask Flags Metric Ref Use Iface
- 0.0.0.0 192.168.18.2 0.0.0.0 UG 100 0 0 ens33
- 192.168.18.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
- 192.168.18.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
- 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
- [root@l2 network-scripts]#

[root@l2 network-scripts]# vim /etc/sysconfig/static-routes //永久添加路由
any host 192.168.18.100 dev lo:0

[root@l2 network-scripts]# systemctl restart network

三号机
同上一样
- ifconfig
-
- sysctl -p
-
- vim /etc/sysconfig/static-routes
-
- ___________________________________________________
- any host 192.168.18.100 dev lo:0
- ___________________________________________________
-
- systemctl restart network
-
- route -n


[root@l1 ~]# systemctl stop keepalived.service

[root@l1 ~]# yum install -y ipvsadm //两台主备服务器都要下载(1号机,5号机)
- [root@l5 ~]# modprobe ip_vs //两台主备服务器都要加载模块
-
- [root@l1 ~]# lsmod | grep ip_vs //两台主备服务器都要模块已经加载好了
- ip_vs 145458 0
- nf_conntrack 139264 1 ip_vs
- libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
- [root@l1 ~]#
- [root@l1 ~]# touch /etc/sysconfig/ipvsadm //两台主备服务器都要 ipvsadm启动起来
- [root@l5 ~]# systemctl start ipvsadm.service //主服务器
- [root@l5 ~]# systemctl enable ipvsadm.service //主服务器
- Created symlink from /etc/systemd/system/multi-user.target.wants/ipvsadm.service to /usr/lib/systemd/system/ipvsadm.service.
- [root@l5 ~]#
- [root@l1 ~]# systemctl enable --now ipvsadm //备服务器
-
- [root@l1 ~]# systemctl status ipvsadm.service //两台主备服务器都要 检查状态
-

主
- [root@l5 ~]# cd /etc/keepalived/
- [root@l5 keepalived]# ls
- keepalived.conf keepalived.conf.bak
- [root@l5 keepalived]# cp keepalived.conf.bak keepalived.conf
- cp:是否覆盖"keepalived.conf"? y
-
[root@l5 keepalived]# vim keepalived.conf
- (1)配置keeplived(主、备DR 服务器上都要设置)
- cd /etc/keepalived/
- cp keepalived.conf keepalived.conf.bak
- vim keepalived.conf
- ......
- global_defs { #定义全局参数
- --10行--修改,邮件服务指向本地
- smtp_server 127.0.0.1
- --12行--修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
- router_id LVS_01
- --14行--注释掉,取消严格遵守VRRP协议功能,否则VIP无法被连接
- #vrrp_strict
- }
-
- vrrp_instance VI_1 { #定义VRRP热备实例参数
- --20行--修改,指定热备状态,主为MASTER,备为BACKUP
- state MASTER
- --21行--修改,指定承载vip地址的物理接口
- interface ens33
- --22行--修改,指定虚拟路由器的ID号,每个热备组保持一致
- virtual_router_id 10
- #nopreempt #如果设置非抢占模式,两个节点state必须为BACKUP,并加上配置 nopreempt
- --23行--修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90
- priority 100
- advert_int 1 #通告间隔秒数(心跳频率)
- authentication { #定义认证信息,每个热备组保持一致
- auth_type PASS #认证类型
- --27行--修改,指定验证密码,主备服务器保持一致
- auth_pass abc123
- }
- virtual_ipaddress { #指定群集vip地址
- 192.168.80.188
- }
- }
- --36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
- virtual_server 192.168.80.188 80 {
- delay_loop 6 #健康检查的间隔时间(秒)
- lb_algo rr #指定调度算法,轮询(rr)
- --39行--修改,指定群集工作模式,直接路由(DR)
- lb_kind DR
- persistence_timeout 0 #连接保持时间(秒)
- protocol TCP #应用服务采用的是 TCP协议
- --43行--修改,指定第一个Web节点的地址、端口
- real_server 192.168.80.12 80 {
- weight 1 #节点的权重
- --45行--删除,添加以下健康检查方式
- TCP_CHECK {
- connect_port 80 #添加检查的目标端口
- connect_timeout 3 #添加连接超时(秒)
- nb_get_retry 3 #添加重试次数
- delay_before_retry 3 #添加重试间隔
- }
- }
-
- real_server 192.168.80.13 80 { #添加第二个 Web节点的地址、端口
- weight 1
- TCP_CHECK {
- connect_port 80
- connect_timeout 3
- nb_get_retry 3
- delay_before_retry 3
- }
- }
- ##删除后面多余的配置##
- }
-
-
- systemctl start keepalived
- ip addr #查看虚拟网卡vip










- ! Configuration File for keepalived
-
- global_defs {
- notification_email {
- acassen@firewall.loc
- failover@firewall.loc
- sysadmin@firewall.loc
- }
- notification_email_from Alexandre.Cassen@firewall.loc
- smtp_server 127.0.0.1
- smtp_connect_timeout 30
- router_id LVS_01
- }
-
- vrrp_instance VI_1 {
- state MASTER
- interface ens33
- virtual_router_id 51
- priority 100
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.18.100
- }
- }
-
- virtual_server 192.168.18.100 80 {
- delay_loop 6
- lb_algo rr
- lb_kind DR
- persistence_timeout 0
- protocol TCP
-
- real_server 192.168.18.20 80 {
- weight 1
- TCP_CHECK {
- connetc_port 80
- connect_timeout 3
- nb_get_retry 3
- delay_before_retry 3
- }
- }
-
- real_server 192.168.18.30 80 {
- weight 1
- TCP_CHECK {
- connetc_port 80
- connect_timeout 3
- nb_get_retry 3
- delay_before_retry 3
- }
- }
- }
-
- [root@l5 keepalived]# scp keepalived.conf 192.168.18.10:`pwd` //复制到另一台备服务器
- The authenticity of host '192.168.18.10 (192.168.18.10)' can't be established.
- ECDSA key fingerprint is SHA256:PzjuREbX063cokEwp/v3k5xRLoPVZ07ik8g9RMXp4rE.
- ECDSA key fingerprint is MD5:aa:ba:2e:89:05:cb:b1:af:37:32:c6:10:77:ea:07:30.
- Are you sure you want to continue connecting (yes/no)? yes
- Warning: Permanently added '192.168.18.10' (ECDSA) to the list of known hosts.
- //出现这个输入a
- root@192.168.18.10's password: //输入密码
- keepalived.conf 100% 1079 2.2MB/s 00:00
- [root@l5 keepalived]#
备:
[root@l1 keepalived]# vim keepalived.conf

- ! Configuration File for keepalived
-
- global_defs {
- notification_email {
- acassen@firewall.loc
- failover@firewall.loc
- sysadmin@firewall.loc
- }
- notification_email_from Alexandre.Cassen@firewall.loc
- smtp_server 127.0.0.1
- smtp_connect_timeout 30
- router_id LVS_02
- }
-
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 51
- priority 90
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.18.100
- }
- }
-
- virtual_server 192.168.18.100 80 {
- delay_loop 6
- lb_algo rr
- lb_kind DR
- persistence_timeout 0
- protocol TCP
-
- real_server 192.168.18.20 80 {
- weight 1
- TCP_CHECK {
- connetc_port 80
- connect_timeout 3
- nb_get_retry 3
- delay_before_retry 3
- }
- }
-
- real_server 192.168.18.30 80 {
- weight 1
- TCP_CHECK {
- connetc_port 80
- connect_timeout 3
- nb_get_retry 3
- delay_before_retry 3
- }
- }
- }
-
主:
- [root@l5 keepalived]# systemctl start keepalived.service
- [root@l5 keepalived]#
备:
- [root@l1 keepalived]# systemctl start keepalived.service
- [root@l1 keepalived]#
主:

- [root@l5 keepalived]# ipvsadm -ln
- IP Virtual Server version 1.2.1 (size=4096)
- Prot LocalAddress:Port Scheduler Flags
- -> RemoteAddress:Port Forward Weight ActiveConn InActConn
- TCP 192.168.18.100:80 rr
- -> 192.168.18.20:80 Route 1 0 0
- -> 192.168.18.30:80
备:


把主关了
备:



脑裂故障
现象:主服务器和备服务器都同时拥有相同的VIP
原因:因为主服务器和备服务器的通信中断,导致备服务器无法收到主服务器发送的VRRP报文,备服务器误认为主服务器已经故障了并通过ip命令生成VIP
解决:关闭主服务器或备服务器其中一个的keepalived服务
预防:(1)如果是系统防火墙导致,则关闭防火墙或添加防火墙规则放通VRRP组播地址(224.0.0.18)的传输
(2)如果是主备服务器之间的通信链路中断导致,则可以在主备服务器之间添加双链路通信
(3)在主服务器使用脚本定时判断与备服务器通信链路是否中断,如果判断是主备服务器之间的链接中断则自行关闭主服务器上的keepalived服务
(4)利用第三方应用或监控系统检测是否发生了脑裂故障现象,如果确认发生了脑裂故障则通过第三方应用或监控系统来关闭主服务器或备服务器其中一个的keepalived服务


- #主服务器脚本
-
- #!/bin/bash
- while true
- do
- ping -c4 -i 0.5 -W 2 备服务器IP
- if 「 $? -ne 0 ]
- then ssh 另一台主机IP ping -c 4 -i 0.5 -W2 -I 另一台主机IP 备服务器IP
- if [ $? -eg 0 ]
- then systemctl stop keepalived
- fi
- fi
- sleep 20
- done