企业应用中,单台服务器承担应用存在单点故障的危险。单点故障一旦发生,企业服务将发生中断,造成极大的危害。既然一个服务器会产生单点故障,那么我们可以使用两台或多台服务器来预防单点故障的问题。Keepalived工具是专为LVS负载均衡器(调度器)HA高可用设计的一款健康检查工具。健康检查也叫做探针,对象有两个,一是调度器,二是节点服务器,主切换到备的过程叫做故障转移。健康检查和故障转移属于高可用的范畴。
一、一个合格的群集应该具备的特点
- 负载均衡:用于提高群集的性能(LVS Nginx HAProxy SLB F5实现)
- 健康检查(探针):针对于调度器和节点服务器 (keepalived Hearbeat实现)
- 故障转移:通过vip漂移实现主备切换(通过vrrp 或 脚本实现)
二、健康检查常用的工作方式
- 发送心跳消息:vrrp探测报文 ping/pong消息
- tcp端口检查:向目标主机的IP:端口发起tcp连接请求,如果tcp连接三次握手成功则认为健康检查正常,否则认为健康检查异常。
- HTTP URL检查:向目标主机的url路径(如http://192.168.170.50:80/url路径)发起HTTP GET 请求方法,如果响应2xx或3xx状态码,则认为健康检查正常,如果响应4xx或5xx则认为异常,触发故障转移。
三、keepalived原理
Keepalived 是基于 VRRP 协议实现的高可用方案。默认情况下通过优先级决定主备服务器的角色(优先级最高的为主),主服务器(MASTER)会通过ip命令在本地生成VIP,接收并处理客户端发送的请求消息;同时主服务器还会定时发送VRRP报文给备服务器(BACKUP)告知主服务器的存活状态。当主服务器异常时,备服务器就会接管VIP(也是通过ip命令生成VIP),继续提供服务,保证服务的高可用。
四、Keepalived安装与启动
主调度器 | 192.168.170.100 |
备调度器 | 192.168.170.200 |
VIP:192.168.170.222 |
keepalived双机热备的故障切换是由虚拟ip地址的漂移实现的,适用于各种应用服务器。在LVS群集环境中应用时,还需用到ipvsadm管理工具。
1.主机初始化设置
关闭防火墙,挂载镜像,准备好阿里云镜像源和在线源,保证网络联通
2.部署2台调度器
①安装keepalived
访问官网Keepalived.org下载源码包或者yum软件包。挂载后我们的镜像中是有keepalived的,直接升级一下(准备好epel在线源和阿里云镜像源,安装keepalived)
②修改配置文件
cd /etc/keepalived/
vim keepalived.conf
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf
systemctl start keepalived.service
systemctl enable keepalived.service
global全局配置,邮箱通知,路由器id号,4个vrrp配置删除注释都可以
vrrp主配置为master,接口设置网卡接口,id51号,优先级设置,发送vrrp报文的间隔时间,密码验证设置一样,默认1111
virtual是lvs配置暂时不设置,删除
备调度器配置
ip address命令查看vrrp地址
五、Keepalived两个模式
- 抢占模式:如上面部署测试中的默认模式,master故障恢复后会从backup接管vip
- 非抢占模式:master故障恢复后不会主动抢占backup的vip。网络不稳定情况下,有效防止vip来回切换导致数据丢失。但是要注意,配置非抢占模式要注意启动服务的顺序,有限启动的获取master权限,与优先级无关。
主备都关掉keepalived,非抢占模式下谁先启动谁是主。
systemctl stop keepalived.service
systemctl start keepalived.service
如果就想要主服务器接管vip,生产环境中找个业务低谷时间重启备的keepalived即可(或者可以at做一次性计划任务)
六、部署LVS+Keepalived高可用群集
1)实验准备
主调度器(lvs) | 192.168.170.100 |
备调度器(lvs) | 192.168.170.200 |
节点服务器1 | 192.168.170.4 |
节点服务器2 | 192.168.170.5 |
nfs服务器 | 192.168.170.6 |
vip:192.168.170.222 |
节点服务器和nfs沿用上面的配置,检查虚接口、内核配置文件、添加路由,验证能够正常访问。
2)nfs服务器配置192.168.170.6
#安装nfs和rpcbind
yum install -y nfs-utils rpcbind
#创建共享目录和测试文件
mkdir /share/{xy101,xy102} -p
ls /share/
cd /share/
echo '<h1>this is xy101 test web page</h1>' >xy101/test.html
echo '<h1>this is xy102 test web page</h1>' >xy102/test.html
vim /etc/exports
/share/xy101 192.168.170.0/24(ro)
/share/xy102 192.168.170.0/24(ro)
systemctl enable --now rpcbind nfs
showmount -e
2)配置2台web服务器
注意:配置lo:0虚接口承载VIP;修改内核参数 arp_ignore=1、arp_announce=2防止网关ARP紊乱问题;添加路由 route add -host <VIP> dev lo:0
#节点服务器1,ip地址为192.168.170.4
systemctl start rpcbind
vim /etc/sysconfig/network-scripts/ifcfg-ens33
#挂载
showmount -e 192.168.170.6
#上传nginx的repo源
cd /etc/yum.repos.d/
#安装nginx
yum install -y nginx
systemctl start nginx
#挂载
mount 192.168.170.6:/share/xy101 /usr/share/nginx/html/
ls /usr/share/nginx/html/
//配置虚拟网卡和vip
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.170.50
NETMASK=255.255.255.255
ONBOOT=yes
systemctl restart network
ifconfig
#验证需要关闭nginx长连接功能,不然要每次等65秒
vim /etc/nginx/nginx.conf
keepalive_timeout 0;
systemctl restart nginx
systemctl enable nginx
#添加内核参数,解决ARP紊乱的问题
vim /etc/sysctl.conf
------------------------------------------------------------
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
------------------------------------------------------------
sysctl -p
#添加路由规则,把VIP地址指向lo网卡,物理网卡收到数据包后把请求送到lo网卡上
route add -host 192.168.170.222 lo:0
route -n
#永久添加的方式
vim /etc/sysconfig/static-routes
any host 192.168.170.170.222 dev lo:0
#配置开启自动添加路由的配置(实验可不加)
vim /etc/rc.local
/sbin/route add -host 192.168.170.222 dev lo:0
--------------------------------------------------------------------------------------
#节点服务器2,ip地址为192.168.170.5,操作同上。注意挂载的目录如果你创建了两个,要区别开,不要挂载到一个目录
3)部署2台调度器
#调度器安装ipvsadm,加载ip模块
yum install -y ipvsadm
touch /etc/sysconfig/ipvsadm
modprobe ip_vs
lsmod | grep ip_vs
touch /etc/sysconfig/ipvsadm
systemctl start ipvsadm
systemctl enable ipvsadm
#keepalived重新配置
cp /etc/keepalived/keepalived.conf.bak keepalived.conf
vim keepalived.conf
-----------------------------------------------------------
1 Configuration File for keepalived
2
3 global_defs {
4 notification_email {
5 acassen@firewall.loc
6 failover@firewall.loc
7 sysadmin@firewall.loc
8 }
9 notification_email_from Alexandre.Cassen@firewall.loc
10 smtp_server 127.0.0.1 //邮箱地址指向本地
11 smtp_connect_timeout 30
12 router_id LVS_01 //LVS_01
13 }
14
15 vrrp_instance VI_1 {
16 state MASTER
17 interface ens33 //网卡名
18 virtual_router_id 51 //可改可不改
19 priority 100
20 advert_int 1
21 authentication {
22 auth_type PASS
23 auth_pass 1111
24 }
25 virtual_ipaddress {
26 192.168.170.222 //vip地址,要与节点服务器的一致
27 }
28 }
29
30 virtual_server 192.168.170.222 80 { 虚拟服务器配置
31 delay_loop 6 对节点服务器的健康检查间隔时间
32 lb_algo rr 调度策略
33 lb_kind DR lvs模式改成dr模式
34 persistence_timeout 0 根据需求改连接保持时间
35 protocol TCP
36
37 real_server 192.168.170.4 80 { 真实服务器配置
38 weight 1 权重
39 TCP_CHECK { 默认是SSL_GET,这里改为TCP
40 connect_port 80 连接真实服务器的端口
41 connect_timeout 3 连接超时时间3秒
42 nb_get_retry 3 连接重试次数3次
43 delay_before_retry 3 每次重试间隔3秒
44 }
45 }
46
47 real_server 192.168.170.5 80 {
48 weight 1
49 TCP_CHECK {
50 connect_port 80
51 connect_timeout 3
52 nb_get_retry 3
53 delay_before_retry 3
54 }
55 }
56 }
-----------------------------------------------------------
#把配置文件远程给另一台调度器
scp keepalived.conf 192.168.170.200:/etc/keepalived/
文件配置好了之后重启2台调度器的keepalived服务
systemctl restart keepalived.service
#规则通过vip自动生成了
ip aadress
我这里主调度器的规则没有自动生成,我手动创建了。
#创建规则
ipvsadm -ln
ipvsadm -C
ipvsadm -A -t 192.168.170.222:80 -s rr
ipvsadm -a -t 192.168.170.222:80 -r 192.168.170.4:80 -g
ipvsadm -a -t 192.168.170.222:80 -r 192.168.170.5:80 -g
4)测试
通过虚拟ip实现负载均衡。模拟主调度器宕机,看看还能不能正常提供服务器。
现在关闭一台web服务器
至此就实现了LVS-DR配合keepalived的高可用
七、部署nginx+Keepalived高可用群集
1)实验准备
主调度器(nginx) | 192.168.170.100 |
备调度器(nginx) | 192.168.170.200 |
节点服务器1 | 192.168.170.4 |
节点服务器2 | 192.168.170.5 |
nfs服务器 | 192.168.170.6 |
vip:192.168.170.222 |
节点服务器和nfs沿用上面的配置,检查虚接口、内核配置文件、添加路由,验证能够正常访问。
调度器使用100和200,还原初始状态关闭防火墙和selinux
2)配置nginx调度器
nginx配置四层反向代理,upstream定义服务器名称backends
验证nginx的四层代理
然后开始配置nginx调度器的keepalived高可用
cd /etc/keepalived/
touch nginx_check.sh
vim nginx_check.sh
---------------------------------------------------
#!/bin/bash
if ! killall -0 nginx &> /dev/null
then
systemctl stop keepalived
fi
---------------------------------------------------
chmod +x nginx_check.sh
vim /etc/keepalived/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 NGINX_01
#vrrp_skip_check_adv_addr
#vrrp_strict
#vrrp_garp_interval 0
#vrrp_gna_interval 0
}
vrrp_script nginx_check {
script "/etc/keepalived/nginx_check.sh"
inrerval 2
weight 2
}
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.170.222
}
track_script {
nginx_check
}
}
#这里是用nginx做负载均衡器的,下面的内容全部删除
---------------------------------------------------------------
scp nginx_check.sh keepalived.conf 192.168.170.200:`pwd`
第二台nginx调度器修改配置文件
#分别启动nginx和keepalived
systemctl restart nginx
systemctl start keepalived.service
systemctl enable keepalived.service --now
ip address
3)验证,访问VIP
模拟故障,关闭一台nginx调度器
模拟调度器故障恢复,开启主调度器的nginx,再启动keepalived,主调度器又会掌管VIP做代理转发了。
八、keepalived脑裂故障
1)现象
主服务器和备服务器都同时拥有相同的VIP
2)原因
Master一直发送心跳消息给backup主机,如果中间的链路突然断掉,backup主机将无法收到master主机发送过来的心跳消息(也就是vrrp报文),backup这时候会立即抢占master的工作,但其实这时候的master是正常工作的,此时就会出现脑裂的现象。
3)如何解决
关闭主服务器或备服务器其中一个的keepalived服务
3)如何预防脑裂现象
- 如果是系统防火墙导致,则关闭防火墙或添加防火墙规则放通VRRP组播地址(224.0.0.18)的传输
- 如果是主备服务器之间的通信链路中断导致,则可以在主备服务器之间添加双链路通信
- 在主服务器使用脚本定时判断与备服务器通信链路是否中断,如果判断是主备服务器之间的链接中断则自行关闭主服务器上的keepalived服务
- 利用第三方应用或监控系统检测是否发生了脑裂故障现象,如果确认发生了脑裂故障则通过第三方应用或监控系统来关闭主服务器或备服务器其中一个的keepalived服务