关于java:LVSKeepAlived高可用部署实战应用

1次阅读

共计 20748 个字符,预计需要花费 52 分钟才能阅读完成。

LVS+KeepAlived 高可用部署实战

1. 构建高可用集群

1.1 什么是高可用集群

​ 高可用集群(High Availability Cluster,简称 HA Cluster),是指以缩小服务中断工夫为目标得服务器集群技术。它通过爱护用户得业务程序对外部间断提供的服务,把因为软件,硬件,认为造成的故障对业务得影响升高到最小水平。总而言之就是保障公司业务 7 *24 小时不宕机

1.2 高可用衡量标准

​ 掂量集群的可用性 (HA) 高下,能够从 MTTF(均匀无故障工夫)和 MTTR(均匀故障培修工夫)进行考量,公式为:HA=MTTF/(MTTF+MTTR)*100%,具体衡量标准能够参考下表

根本可用性 2 个 9 99% 年度宕机工夫:87.6 小时
较高可用性 3 个 9 99.9% 年度宕机工夫:8.8 小时
具备故障主动复原 4 个 9 99.99% 年度宕机工夫:53 分钟
极高可用性 5 个 9 99.999% 年度宕机工夫:5 分钟
1.3 高可用保障

​ 对集群中的服务器进行负载平衡、衰弱监测,并在服务器呈现故障时能进行故障转移,主动切换到失常服务器是高可用保障的必要伎俩。

1.3.1 负载平衡

​ 常见的负载平衡伎俩如下:

​ 硬件负载平衡,如 F5

​ 软件负载平衡,如 nginx、haproxy、lvs

​ 几种软件负载平衡技术比拟

技术 长处 毛病
nginx 能够针对 http 利用做一些分流的策略;对网络稳定性的依赖十分小 装置和配置简略,测试不便 能撑持几万的并发量 可作为动态网页和图片服务器 仅反对 http、https 和 Email 协定 只反对通过端口进行衰弱检测
haproxy 反对通过 URL 进行衰弱检测 单纯做负载平衡,效率高于 nginx 反对 TCP 的负载平衡,能够对 mysql 集群负载 不反对 POP/SMTP 协定 不反对 HTTP cache 性能 多过程模式反对不够好 重载配置须要重启过程
lvs 抗负载能力强,工作在网络 4 层,性能最好 配置性比拟低 工作稳固 只散发申请,无流量产生,保障 IO 性能 利用范畴比拟广 不反对正则表达式解决 不能做动静拆散 大型网站施行简单 没有专门用于 windows 的版本
1.3.2 衰弱监测和主动切换

​ 常见的衰弱监测和主动切换软件有 keepAlived 和 heartBeat,其二者比照如下:

​ Keepalived 应用更简略:从装置、配置、应用、保护等角度上比照,Keepalived 都比 Heartbeat 要简略

​ Heartbeat 性能更弱小:Heartbeat 尽管简单,但性能更弱小,配套工具更全,适宜做大型集群治理,而 Keepalived 次要用于集群倒换,根本没有治理性能

1.4 高可用拓扑图

2. 软件负载平衡技术 LVS

2.1 LVS 简介
2.1.1 什么是 lvs

​ LVS 是 Linux Virtual Server 的简写,在 1998 年 5 月由章文嵩博士成立。

​ 工作在 OSI 模型的四层,基于 IP 进行负载平衡。

​ 在 linux2.2 内核时,IPVS 就曾经以内核补丁的模式呈现。

​ 从 2.4 版本当前,IPVS 曾经成为 linux 官网规范内核的一部分。

2.1.2 lvs 官网材料链接

​ a. lvs 我的项目介绍 http://www.linuxvirtualserver…

​ b. lvs 集群的体系结构 http://www.linuxvirtualserver…

​ c. lvs 集群中的 IP 负载平衡技术 http://www.linuxvirtualserver…

​ d. lvs 集群的负载调度 http://www.linuxvirtualserver…

​ e. lvs 中文站点 http://zh.linuxvirtualserver.org

2.2 lvs 拓扑
2.2.1 lvs 术语

​ LVS 服务器(DS)

​ 集群中节点服务器(RS)

​ 虚构 IP 地址(VIP),用于向客户端提供服务的 IP 地址(配置于负载均衡器上)

​ 实在服务器的 IP 地址(RIP),集群中节点服务器的 IP 地址

​ 负载均衡器 IP 地址(DIP),负载均衡器的 IP 地址,物理网卡上的 IP

​ 客户端主机 IP 地址(CIP),终端申请用户的主机 IP 地址

2.2.2 工作原理和拓扑图

​ LVS 负载平衡调度技术是在 linux 内核中实现的,应用配置 LVS 时,不是间接配置内核中的 IPVS,而是通过 IPVS 的管理工具 IPVSADM 来治理配置,LVS 集群负载均衡器承受所有入站客户端的申请,并依据算法来决定由哪个集群的节点来解决申请。

2.3 lvs 的三种工作模式
2.3.1 NAT 模式

​ NAT(Network Address Translation)模式是基于 NAT 技术实现的。在此模式中,LVS 服务器既要解决申请的接入,又要解决申请的响应。因而存在较大的性能瓶颈。

2.3.2 DR 模式

​ DR(Direct Routing)模式是 LVS 的默认工作模式,也叫间接路由模式。只解决申请的接入,不解决申请的响应。因而性能高,瓶颈小。

2.3.3 TUN 模式

​ TUN(Tunneling)模式须要服务器反对 IP 隧道(IP tunneling,是路由器把一种网络层协定封装到另一个协定中以跨过网络传送到另一个路由器的处理过程)技术,限度较大,个别不必。

2.4 LVS 调度算法
2.4.1 动态调度算法
调度算法 说 明
RR roundrobin 轮询调度
WRR Weighted RR 加权轮询调度
SH Soure Hashing 源地址哈希调度
DH Destination Hashing 指标地址哈希调度
2.4.2 动静调度算法
调度算法 说 明
LC Least Connections 最小连接数调度
WLC Weighted LC 加权最小连接数调度 *(默认
SED Shortest Expection Delay 初始连贯高权重优先
NQ Nerver Queue 第一轮平均分配,后续 SED
LBLC Locality-Based LC 动静的 DH 算法
LBLCR LBLC with Replication 带复制性能的 LBLC
FO Weighted Fail Over,linux 内核 4.15 后新增的调度算法
OVF Overflow-connection,linux 内核 4.15 后新增的调度算法

2.5 lvs 根本命令

对于 lvs 的操作,次要是通过 ipvsadm 软件实现,罕用的 lvs 操作命令如下:

2.5.1 集群服务治理
命令 说 明
ipvsadm -A -t IP -s 调度算法 此命令用来增加一个 lvs 策略,IP 指 VIP,调度算法是 12 种调度算法的一种
ipvsadm -C 此命令用来革除一个 lvs 策略
ipvsadm -S 此命令用来保留一个 lvs 策略
ipvsadm -R 此命令用来加载一个 lvs 策略
ipvsadm -L 此命令用来查看策略
2.5.2 集群 RS 治理
命令 说 明
ipvsadm -a -t IP1 -r IP2 -m\ g\ i 增加一台 RS,IP1 指 VIP,IP2 指 RIP,-m\ g\ i 中 m 是 NAT,g 是 DR,
ipvsadm -d -t IP1 -r IP2 此命令用来删除一台 RS,IP1 指 VIP,IP2 指 RIP
2.6 lvs 实战
2.6.1 NAT 模式实战

NAT 实战拓扑图

NAT 模式实现

​ 依照下面的拓扑图,进行 NAT 实战,步骤如下:

A. 筹备 4 台 linux 虚拟机,并确定每台虚拟机的角色,为了不便辨别,能够对每台虚拟机设置新的主机名,比方 LVS 服务器能够设置主机名为 lvs,设置形式如下

# 设置主机名
hostnamectl set-hostname lvs
#断开近程连贯
logout
#从新连贯即可看到主机名曾经更改

​ 而后对四台虚拟机别离进行配置如下:

RS1 和 RS2 配置

​ 1) 配置网卡为 NAT 模式

​ 2) 下载安装 httpd 服务,命令如下

yum install -y httpd

​ 3) 设置首页内容(RS2 把内容改为 this is RS2)

echo this is RS01 > /var/www/html/index.html

​ 4) 启动 httpd

systemctl start httpd

​ 5) 在 RS1 和 RS2 上测试拜访,能输入 this is RS01 或 this is RS02 即为胜利

[root@rs01 ~]# curl localhost
this is RS01

​ 6) RS1 设置动态 IP 为 192.168.116.131,RS2 设置动态 IP 为 192.168.116.132。

​ RS1 和 RS2 指定网关为 192.168.116.130,子网掩码 255.255.255.0

​ 7) 查看网关是否失效

[root@rs01 html]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.116.130 0.0.0.0         UG    100    0        0 ens33
192.168.116.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33

LVS 服务器配置

​ 1) 装置 ipvsadm

yum install -y ipvsadm

​ 2) 设置双网卡

​ 仅主机网卡一块,IP 配置为 192.168.5.131,此 IP 是承受内部申请的 VIP

​ NAT 网卡一块,IP 配置为 192.168.116.130,此 IP 是与后端 RS 服务器通信的 DIP

​ 3) 配置 ip_forward 转发

vi /etc/sysctl.conf
#增加如下内容并保留退出
net.ipv4.ip_forward = 1
#执行如下命令使批改失效
sysctl -p

​ 4) 应用 ipvsadm 进行负载平衡配置

# 指定负载 80 端口的 VIP,并指定调度策略为轮询
[root@lvs01 ~]# ipvsadm -A -t 192.168.5.131:80 -s rr
#增加两台 RS,并指定负载平衡工作模式为 NAT
[root@lvs01 ~]# ipvsadm -a -t 192.168.5.131:80 -r 192.168.116.131 -m
[root@lvs01 ~]# ipvsadm -a -t 192.168.5.131:80 -r 192.168.116.132 -m
#查看上述配置是否失效
[root@lvs01 ~]# 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.5.131:80 rr
  -> 192.168.116.131:80           Masq    1      0          0         
  -> 192.168.116.132:80           Masq    1      0          0 

client 虚拟机配置和测试

​ 配置网卡为仅主机模式,IP 为 192.168.5.130,网关无需配置即可。

​ 在 client 上测试负载平衡成果,如下:

[root@client ~]# curl 192.168.5.131
this is RS02
[root@client ~]# curl 192.168.5.131
this is RS01
[root@client ~]# curl 192.168.5.131
this is RS02
[root@client ~]# curl 192.168.5.131
this is RS01

NAT 模式存在的问题 –>LVS 性能瓶颈

2.6.2 DR 模式实战

小贴士: ARP(Address Resolution Protocol)地址解析协定,是依据 IP 地址获取物理地址(MAC)的一个 TCP/IP 协定。主机发送信息时将蕴含指标 IP 地址的 ARP 申请播送到局域网络上的所有主机,并接管返 回音讯,以此确定指标的物理地址;收到返回音讯后将该 IP 地址和物理地址存入本机 ARP 缓存中并 保留肯定工夫,下次申请时间接查问 ARP 缓存以节约资源。

DR 模式拓扑图

DR 模式实现

​ 通过比照 NAT 模式和 DR 模式的拓扑图能够发现,须要让 LVS 和 RS 在同一个网段,并且在两个 RS 服务器上也须要绑定 VIP。所以 DR 模式试验能够在方才的根底上进行,步骤如下:

​ 1) 在 RS1 和 RS2 上进行如下 ARP 克制操作,并配置 VIP 到 lo 网卡上,如下:

#arp 克制
echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
#配置 VIP 到 lo 网卡  这里的子网掩码须要 4 个 255
[root@rs01 html]# ifconfig lo:9 192.168.116.134 netmask 255.255.255.255
[root@rs01 html]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.131  netmask 255.255.255.0  broadcast 192.168.116.255
        inet6 fe80::cc13:177d:ec0:60d2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::b105:ad45:a07e:f946  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:20:b6:01  txqueuelen 1000  (Ethernet)
        RX packets 1262  bytes 105801 (103.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 582  bytes 70559 (68.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 50  bytes 5310 (5.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 50  bytes 5310 (5.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo:9: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.116.134  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)

留神:RS1 和 RS2 在之前进行 NAT 模式试验时设置了网关为 LVS 的 DIP,这里进行 DR 试验时须要把网关删除

​ 2) 在 LVS 服务器上敞开之前的 ens37 网卡(留神:你的网卡名称可能不是这个)

ifdown ens37
ifconfig ens37 down

​ 3) 在 lvs 的 ens33 网卡上绑定 VIP192.168.116.134

[root@lvs01 ~]# ifconfig ens33:9 192.168.116.134/24
[root@lvs01 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.130  netmask 255.255.255.0  broadcast 192.168.116.255
        inet6 fe80::3264:bc00:653f:77b2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::cc13:177d:ec0:60d2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::b105:ad45:a07e:f946  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:38:1d:eb  txqueuelen 1000  (Ethernet)
        RX packets 717  bytes 62082 (60.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 244  bytes 37732 (36.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.134  netmask 255.255.255.0  broadcast 192.168.116.255
        ether 00:50:56:38:1d:eb  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

​ 4) 在 lvs 服务器上清空 LVS 策略,并从新设置 DR 模式策略

# 查看策略
[root@lvs01 ~]# 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.5.131:80 rr
  -> 192.168.116.131:80           Masq    1      0          0         
  -> 192.168.116.132:80           Masq    1      0          0         
#清空策略
[root@lvs01 ~]# ipvsadm -C
#再次查看策略
[root@lvs01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

设置 DR 策略

# 设置规定
[root@lvs01 ~]# ipvsadm -A -t 192.168.116.134:80 -s rr
#增加 RS
[root@lvs01 ~]# ipvsadm -a -t 192.168.116.134:80 -r 192.168.116.131 -g
[root@lvs01 ~]# ipvsadm -a -t 192.168.116.134:80 -r 192.168.116.132 -g
#查看策略
[root@lvs01 ~]# 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.116.134:80 rr
  -> 192.168.116.131:80           Route   1      0          0         
  -> 192.168.116.132:80           Route   1      0          0

​ 5) 批改 client 服务器配置,更改应用 NAT 网卡,并设置 IP 为 192.168.116.133

​ 6) 在 client 测试成果

[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS01
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS01

​ 7) 在 LVS 服务器上查看调度状况

[root@lvs01 ~]# ipvsadm -Lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:30  FIN_WAIT    192.168.116.133:45810 192.168.116.134:80 192.168.116.131:80
TCP 01:31  FIN_WAIT    192.168.116.133:45812 192.168.116.134:80 192.168.116.132:80
TCP 01:32  FIN_WAIT    192.168.116.133:45814 192.168.116.134:80 192.168.116.131:80
TCP 01:30  FIN_WAIT    192.168.116.133:45808 192.168.116.134:80 192.168.116.132:80
2.6.3 四个问题

​ a. 如果后端某台 RS 服务器挂了会呈现什么问题?

​ b. 如果 LVS 服务器挂了会呈现什么问题?

` c. 如何获知 RS 服务器状态?

​ d. 如何进行故障转移、主动切换?

3. KeepAlived

3.1 keepAlived 简介

​ Keepalived 的作用是 检测服务器状态 ,如果有一台 web 服务器宕机,或工作呈现故障,Keepalived 将检测到,并 将有故障的服务器从零碎中剔除,同时应用其余服务器代替该服务器的工作,当服务器工作失常后 Keepalived 主动将服务器退出到服务器群中。

3.2 keepAlived 次要特点
3.2.1 健康检查
查看形式 说 明
tcp_check 工作在第 4 层,keepalived 向后端服务器发动一个 tcp 连贯申请,如果后端服务器没有响应或超时,那么这个后端将从服务器池中移除
http_get 工作在第 5 层,向指定的 URL 执行 http 申请,将失去的后果用 md5 加密并与指定的 md5 值比拟看是否匹配,不匹配则从服务器池中移除;此外还能够指定 http 返回码来判断检测是否胜利。HTTP_GET 能够指定多个 URL 用于检测,这个一台服务器有多个虚拟主机的状况下比拟好用。
misc_check 用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内
ssl_get 和 http_get 类似,不同的只是用 SSL 连贯
smtp_check 次要用于邮件系统 SMTP 协定的检测
3.2.2 故障迁徙

VRRP 协定

​ 在事实的网络环境中。主机之间的通信都是通过配置动态路由或者 (默认网关) 来实现的,而主机之间的路由器一旦产生故障,通信就会生效,因而这种通信模式当中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了 VRRP 协定。

​ VRRP 协定是一种容错的主备模式的协定,保障当主机的下一跳路由呈现故障时,由另一台路由器来代替呈现故障的路由器进行工作,通过 VRRP 能够在网络产生故障时通明的进行设施切换而不影响主机之间的数据通信

故障迁徙原理

​ 在 Keepalived 服务失常工作时,主 Master 节点会一直地向备节点发送(多播的形式)心跳音讯,用以通知备 Backup 节点本人还活着,当主 Master 节点产生故障时,就无奈发送心跳音讯,备节点也就因而无奈持续检测到来自主 Master 节点的心跳了,于是调用本身的接管程序,接管主 Master 节点的 IP 资源及服务。而当主 Master 节点复原时,备 Backup 节点又会开释主节点故障时本身接管的 IP 资源及服务,复原到原来的备用角色。

3.3 keepAlived 原理

​ Keepalived 工作在 TCP/IP 参考模型的三层、四层、五层,其原理如下:

工作层 说 明
网络层 Keepalived 通过 ICMP 协定向服务器集群中的每一个节点发送一个 ICMP 数据包 (有点相似与 Ping 的性能), 如果某个节点没有返回响应数据包,那么认为该节点产生了故障,Keepalived 将报告这个节点生效,并从服务器集群中剔除故障节点。
传输层 Keepalived 在传输层里利用了 TCP 协定的端口连贯和扫描技术来判断集群节点的端口是否失常。比方对于常见的 WEB 服务器 80 端口。或者 SSH 服务 22 端口,Keepalived 一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口产生异样,而后强制将这些端口所对应的节点从服务器集群中剔除掉。
利用 层 Keepalived 的运行形式更加全面化和复杂化,用户能够通过自定义 Keepalived 工作形式。例如:能够通过编写程序或者脚本来运行 Keepalived,而 Keepalived 将依据用户的设定参数检测各种程序或者服务是否失常,如果 Keepalived 的检测后果和用户设定的不统一时,Keepalived 将把对应的服务器从服务器集群中剔除。

3.4 分布式选主策略
3.4.1 仅设置 priority

​ 在一个一主多备的 Keepalived 集群中,priority 值最大的将成为集群中的 MASTER 节点,而其余都是 BACKUP 节点。在 MASTER 节点产生故障后,BACKUP 节点之间将进行“民主选举”,通过对节点优先级值 priority 和 weight 的计算,选出新的 MASTER 节点接管集群服务。

3.4.2 设置 priority 和 weight

weight 值为负数时

​ 在 vrrp_script 中指定的脚本如果检测胜利,那么 MASTER 节点的权值将是 weight 值与 priority 值之和;如果脚本检测生效,那么 MASTER 节点的权值放弃为 priority 值

​ MASTER 节点 vrrp_script 脚本检测失败时,如果 MASTER 节点 priority 值小于 BACKUP 节点 weight 值与 priority 值之和,将产生主、备切换。

​ MASTER 节点 vrrp_script 脚本检测胜利时,如果 MASTER 节点 weight 值与 priority 值之和大于 BACKUP 节点 weight 值与 priority 值之和,主节点仍然为主节点,不产生切换。

weight 值为正数时

​ 在 vrrp_script 中指定的脚本如果检测胜利,那么 MASTER 节点的权值仍为 priority 值,当脚本检测失败时,MASTER 节点的权值将是 priority 值与 weight 值之差

​ MASTER 节点 vrrp_script 脚本检测失败时,如果 MASTER 节点 priority 值与 weight 值之差小于 BACKUP 节点 priority 值,将产生主、备切换。

​ MASTER 节点 vrrp_scrip 脚本检测胜利时,如果 MASTER 节点 priority 值大于 BACKUP 节点 priority 值时,主节点仍然为主节点,不产生切换。

weight 设置规范

​ 对于 weight 值的设置,有一个简略的规范,即 weight 值的绝对值要大于 MASTER 和 BACKUP 节点 priority 值之差。由此可见,对于 weight 值的设置要十分审慎,如果设置不好,主节点产生故障时将导致集群角色选举失败,使集群陷于瘫痪状态。

4. LVS+keepAlived 实战

4.1 实战拓扑

为了测试 lvs 的高可用,这里须要减少一台 lvs 服务器,需在此服务器上安装 ipvsadm。

4.2 keepAlived 装置和配置
4.2.1 装置 keepAlived

​ 在两台 lvs 服务器上都须要装置 keepAlived,装置命令如下:

yum install -y keepalived

​ keepAlived 装置实现后,在 /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 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
#下面的配置无需关注,重点关注和批改上面的配置
vrrp_instance VI_1 {
    state MASTER# 标识以后 lvs 是主,依据理论 lvs 服务器布局确定,可选值 MASTER 和 BACKUP
    interface eth0#lvs 服务器提供服务器的网卡,依据理论服务器网卡进行批改
    virtual_router_id 51#lvs 提供的服务所属 ID,目前无需批改
    priority 100#lvs 服务器的优先级,主服务器最高,备份服务器要低于主服务器
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #virtual_ipaddress 用于配置 VIP 和 LVS 服务器的网卡绑定关系,个别须要批改
    #示例: 192.168.116.134/24 dev ens33 label ens33:9
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}
#配置 lvs 服务策略,相当于 ipvsadm -A -t 192.168.116.134:80 -s rr,个别须要批改
virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr# 配置 lvs 调度算法,默认轮询
    lb_kind NAT# 配置 lvs 工作模式,能够改为 DR
    persistence_timeout 50# 用于指定同一个 client 在多久内,只去申请第一次提供服务的 RS,为查看轮询效                               果,这里须要改为 0
    protocol TCP#TCP 协定
    #配置 RS 信息,相当于 ipvsadm -a -t 192.168.116.134:80 -r 192.168.116.131 -g
    real_server 192.168.201.100 443 {
        weight 1# 以后 RS 的权重
        SSL_GET {#SSL_GET 健康检查,个别改为 HTTP_GET
            #两个 url 能够删除一个,url 内的内容改为 path / 和 status_code 200,digest 删除
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
#上面的配置理论是两组 lvs 服务的配置,含意和下面的 lvs 服务配置统一。如果用不到,上面的配置能够全副删除
virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    sorry_server 192.168.200.200 1358

    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
4.2.2 配置 keepAlived

​ 基于上述配置文件和实战拓扑图及服务器布局,对两台 lvs 服务器别离批改 keepalived.conf 配置如下:

lvs 主服务器

! 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 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

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.116.134/24 dev ens33 label ens33:9}
}

virtual_server 192.168.116.134 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 192.168.116.131 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200 
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.116.132 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200 
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

lvs 备份服务器

! 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 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {192.168.116.134/24 dev ens33 label ens33:9}
}

virtual_server 192.168.116.134 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 192.168.116.131 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200 
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.116.132 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200 
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

留神:配置文件中的 key 和大括号之间肯定要有空格

4.2.3 启动 keepAlived

​ 在两台 lvs 服务器上别离启动 keepAlived,命令如下:

service keepalived start
4.3 高可用测试
4.3.1 测试环境查看

​ 上述步骤执行结束后,能够在 lvs 主服务器和备份服务器别离执行 ifconfig 命令,能够查看到 VIP 被绑定到了主服务器,如下:

[root@lvs01 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.130  netmask 255.255.255.0  broadcast 192.168.116.255
        inet6 fe80::3264:bc00:653f:77b2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::cc13:177d:ec0:60d2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::b105:ad45:a07e:f946  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:38:1d:eb  txqueuelen 1000  (Ethernet)
        RX packets 1574  bytes 135506 (132.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 840  bytes 96383 (94.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.134  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:50:56:38:1d:eb  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

​ 这样,就能够在客户端申请 VIP192.168.116.134 来进行测试。

4.3.2 测试负载平衡

​ 在客户端发动申请,测试负载平衡,如下:

[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS01
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS01
4.3.3 测试 RS 高可用

​ 敞开一台 RS 后 (这里能够应用ifconfig 网卡名 down 命令临时敞开网卡),客户端持续发动申请,查看是否能够失常拜访,如下:

[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134

​ 会发现,此时客户端能够失常拜访,但只有 RS2 在提供服务。这阐明,keepAlived 检测到了 RS1 服务器异样,将其剔除了。

​ 此时再启动 RS1 服务器,客户端持续拜访,会发现响应后果如下,keepAlived 检测到 RS1 服务器恢复正常,又将其退出服务列表了。

[root@client ~]# curl 192.168.116.134
this is RS01
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS01
[root@client ~]# curl 192.168.116.134
this is RS02
4.3.4 测试 LVS 高可用

​ 这里次要进行两个测试:

测试 lvs 主服务宕机

​ 应用 ifconfig 网卡名 down 命令,敞开主服务器网卡,此时主服务器不能提供服务。察看备份服务器是否将 VIP 绑定到本人,以及客户端是否能够持续失常拜访。如下:

​ 敞开主服务器网卡

[root@lvs01 keepalived]# ifconfig ens33 down

​ 察看备份服务器,会发现 VIP 曾经绑定过去了。这里理论是 keepAlived 检测到了主服务器的异样,而做出的故障转移和主动切换。

[root@lvs02 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.135  netmask 255.255.255.0  broadcast 192.168.116.255
        inet6 fe80::3264:bc00:653f:77b2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::cc13:177d:ec0:60d2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::b105:ad45:a07e:f946  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:3a:95:05  txqueuelen 1000  (Ethernet)
        RX packets 1891  bytes 167840 (163.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 830  bytes 77459 (75.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.134  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:50:56:3a:95:05  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 6  bytes 528 (528.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6  bytes 528 (528.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

​ 察看客户端是否能够持续失常拜访

[root@client ~]# curl 192.168.116.134
this is RS01
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS01
[root@client ~]# curl 192.168.116.134
this is RS02

测试 lvs 主服务器复原

​ 上述测试通过后,能够开启主服务器网卡,让其可能提供服务,而后察看 VIP 是否会回到主服务器。

​ 开启主服务器网卡

ifconfig ens33 up

​ 查看主服务器和备份服务器

主服务器

[root@lvs01 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.130  netmask 255.255.255.0  broadcast 192.168.116.255
        inet6 fe80::3264:bc00:653f:77b2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::cc13:177d:ec0:60d2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::b105:ad45:a07e:f946  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:38:1d:eb  txqueuelen 1000  (Ethernet)
        RX packets 2323  bytes 219033 (213.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1953  bytes 189317 (184.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.134  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:50:56:38:1d:eb  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 7  bytes 616 (616.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7  bytes 616 (616.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

备份服务器

[root@lvs02 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.135  netmask 255.255.255.0  broadcast 192.168.116.255
        inet6 fe80::3264:bc00:653f:77b2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::cc13:177d:ec0:60d2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::b105:ad45:a07e:f946  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:3a:95:05  txqueuelen 1000  (Ethernet)
        RX packets 2182  bytes 197998 (193.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1117  bytes 100885 (98.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 6  bytes 528 (528.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6  bytes 528 (528.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

会发现,VIP 从新绑定到了主服务器。

本文由传智教育博学谷 – 狂野架构师教研团队公布,转载请注明出处!

如果本文对您有帮忙,欢送关注和点赞;如果您有任何倡议也可留言评论或私信,您的反对是我保持创作的能源

正文完
 0