Keepalived及其工作原理:
Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。
在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP(VIP),主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
Keepalived体系主要模块及其作用:
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工作原理:
Keepalived 是基于 VRRP 协议实现的高可用方案。
默认情况下通过优先级决定主备服务器的角色(优先级最高的为主),主服务器(MASTER)会通过ip命令在本地生成VIP,接收并处理客户端发送的请求消息;同时主服务器还会定时发送VRRP报文给备服务器(BACKUP)告知主服务器的存活状态。当主服务器异常时,备服务器就会接管VIP(也是通过ip命令生成VIP),继续提供服务,保证服务的高可用。
Keepalived的工作模式:
- 抢占模式:MASTER节点从故障中恢复后,会将VIP从BACKUP节点中抢占过来。
- 非抢占模式:MASTER节点恢复后不抢占VIP。(主备节点的state都配置为BAKCUP,且都添加配置nopreempt)
脑裂故障:
现象:主服务器和备服务器都同时拥有相同的VIP
原因:因为主服务器和备服务器的通信中断,导致备服务器无法收到主服务器发送的VRRP报文,备服务器误认为主服务器已经故障了并通过ip命令生成VIP
解决:关闭主服务器或备服务器其中一个的keepalived服务
预防:(1)如果是系统防火墙导致,则关闭防火墙或添加防火墙规则放通VRRP组播地址(224.0.0.18)的传输
(2)如果是主备服务器之间的通信链路中断导致,则可以在主备服务器之间添加双链路通信
(3)在主服务器使用脚本定时判断与备服务器通信链路是否中断,如果判断是主备服务器之间的链接中断则自行关闭主服务器上的keepalived服务
(4)利用第三方应用或监控系统检测是否发生了脑裂故障现象,如果确认发生了脑裂故障则通过第三方应用或监控系统来关闭主服务器或备服务器其中一个的keepalived服务
实验:
如何部署Keepalived
【1】先去官网下载:
【2】初始化:
[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 ~]#
(1)挂载yum
[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 ~]#
(2)下载
[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]#
(3)在线下载(这里我们使用在线下载)
[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
(4)也可以源码编译安装,配置方法基本相同
关闭同步
【3】修改配置:
主 (五号机):
[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)
不再按照优先级,而是按照启动顺序
LVS+Keepalived高可用负载均衡 :
打开上一篇的节点服务器,nfs存储服务器
由于虚拟机冲突,这里我们把四号机改成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
开始配置
【4】配置负载调度器(主、备相同)以下两台主备服务器都要操作:
[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 //两台主备服务器都要 检查状态
配置keeplived(主、备DR 服务器上都要设置):
主
[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
备:
测试: 把主关了
备:
Keepalived脑裂故障
脑裂故障
现象:主服务器和备服务器都同时拥有相同的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