目录
Keepalived
原理
Keepalived案例
双机高可用热备案例
配置
修改配置文件
测试
严格模式测试
修改配置文件
测试
模拟故障测试
LVS+Keepalived高可用
案例拓扑图
初步配置
关闭服务
主调度器配置
健康状态检查的方式
调整内核参数
从调度器配置
服务器池配置
模拟故障
Keepalived
LVS集群的缺点就是不具备健康状态检查,而通过Keepalived就可以实现LVS的健康状态检查,如果发现有服务器故障了,就在调度策略中删除该服务器的策略
- 是专为LVS和HA设计的一款健康状态检查工具
- 支持故障自动切换(Failover)
- 支持节点健康状态检查(Health Checking)
原理
- Keepalived采用VRRP热备份协议来实现Linux服务器的多机热备功能
- 每个热备组可以有多台服务器
- 热备组的故障切换是由虚拟IP地址的漂移来实现,适用于各种应用服务器
Keepalived案例
- 企业应用中,单台服务器存在单点故障的问题,单点故障一旦发生,企业服务将会中断
双机高可用热备案例
本案例用于初步了解keepalived,如果想要直接结合LVS,请往下看第二个案例
双机热备的故障切换是由虚拟IP地址的漂移来实现,适用于各种应用服务器
- 漂移地址:192.168.10.72
- 主、备服务器:192.168.10.101、192.168.10.102
- 提供的应用服务:Web
操作系统 | IP 地址 | 角色 |
CentOS7.9 | 192.168.10.101 | Web服务器 |
CentOS7.9 | 192.168.10.102 | Web服务器 |
配置
开启两个Linux虚拟机,连接上XShell,然后右键XShell终端空白处,开启会话同步
在101(Master)操作
关闭防火墙和内核安全机制,然后安装keepalived
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install keepalived
cd进入keepalived安装目录下,该工具的配置文件就在该目录下,为了防止误操作,可以备份一份配置文件
[root@localhost ~]# cd /etc/keepalived/
[root@localhost keepalived]# ls
keepalived.conf
[root@localhost keepalived]# cp keepalived.conf keepalived.conf.bak
修改配置文件
打开keepalived的配置文件,修改下面几个参数,然后启动服务
[root@localhost keepalived]# vim keepalived.conf
router_id LVS_01 # 第12行,router_id用于区分设备,可以重复但不建议(不影响使用)
interface ens33 # 第21行,填写本机网卡插槽名
virtual_router_id 51 # 第22行,虚拟路由id,用于划分主机到同一个热备组
192.168.10.172 # 第30行
[root@localhost keepalived]# systemctl start keepalived
然后来到第33行,切换为命令模式,按下小写字母d,再按下大写G,删除剩下的内容。
这里我们只是为2个主机做高可用的环境,那么上面的配置就够了,删除的行是为服务做健康状态检查的
关闭会话同步,为102修改作为备份服务器的配置
在102(Backup)操作
修改以下内容,启动服务
[root@localhost keepalived]# vim keepalived.conf
state BACKUP # 第20行,角色
priority 90
# 第23行,Backup的优先级必须比Master低
[root@localhost keepalived]# systemctl start keepalived
在101、102分别操作
在两个主机分别在启动服务后,都使用ip a命令查看有没有虚拟ip
[root@localhost keepalived]# ip a
确保101主机显示虚拟IP(192.168.10.172)而102不显示
因为Master主机才会承载虚拟IP,除非Master故障,虚拟IP漂移到Backup主机
101主机(Master):
ens33:
inet 192.168.10.101/24
inet 192.168.10.172/32
102主机(Backup):
ens33:
inet 192.168.10.102/24
测试
由于我们没有配置针对服务做健康状态检查的参数,所以我们这里需要手动暂停101(Master)主机,来模拟故障
在102(Backup)操作
然后来到Backup主机使用ip a命令,可以看到虚拟IP就过来了
2: ens33:
inet 192.168.10.102/24
inet 192.168.10.172/32
但是此时如果再恢复101主机,然后重启keepalived会发现虚拟IP并没有从原Backup主机回到原Master主机
[root@localhost ~]# systemctl restart keepalived
在101、102分别操作
如果为两个主机关闭NetworkManager服务
[root@localhost ~]# systemctl stop NetworkManager
然后再次模拟故障,等待101恢复正常后,再重启keepalived服务,此时虚拟IP就能飘回优先级高的主机了
[root@localhost ~]# systemctl restart keepalived # 分别输入
101主机
2: ens33:
inet 192.168.10.102/24
inet 192.168.10.172/32
102主机:
2: ens33:
inet 192.168.10.102/24
严格模式测试
此时再打开一台虚拟机(192.168.10.103)作为客户端来测试
在101、102分别操作
然后为101和102主机都安装httpd服务,启动httpd服务,关闭防火墙
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd
在101(Master)操作
再为两个主机添加不同的网站内容
[root@localhost ~]# echo "Test Web 01" > /var/www/html/index.html
在102(Backup)操作
[root@localhost keepalived]# echo "Test Web 02" > /var/www/html/index.html
在103(客户端)测试
在客户端如果访问两个服务器的真实IP就可以访问到Web服务,但是如果访问虚拟IP,就访问不到Web服务(包括ping命令)
[root@localhost ~]# curl 192.168.10.101
Test Web 01
[root@localhost ~]# curl 192.168.10.102
Test Web 02
[root@localhost ~]# curl 192.168.10.172
^C
修改配置文件
因为keepalived是默认开启VRRP的严格模式的,严格模式启用的情况下,VRRP协议生成的VIP是不支持单播的通信
所以我们去两台主机的keepalived配置文件中把严格模式的行注释掉或者删除,然后重启服务
在101、102分别操作
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
#vrrp_strict # 第14行
保存并退出
[root@localhost ~]# systemctl restart keepalived
测试
在103(客户端)测试
此时去客户端测试,可以与虚拟IP通信了
[root@localhost ~]# curl 192.168.10.172
Test Web 01
[root@localhost ~]# ping 192.168.10.172
PING 192.168.10.172 (192.168.10.172) 56(84) bytes of data.
64 bytes from 192.168.10.172: icmp_seq=1 ttl=64 time=0.357 ms
64 bytes from 192.168.10.172: icmp_seq=2 ttl=64 time=0.219 ms
模拟故障测试
此时再暂停101(原Master)主机,让虚拟IP飘到102主机
再去客户端测试,仍然可以访问到服务,只是网页内容变了
在103(客户端)测试
[root@localhost ~]# curl 192.168.10.172
Test Web 02
[root@localhost ~]# ping 192.168.10.172
PING 192.168.10.172 (192.168.10.172) 56(84) bytes of data.
64 bytes from 192.168.10.172: icmp_seq=1 ttl=64 time=0.201 ms
64 bytes from 192.168.10.172: icmp_seq=2 ttl=64 time=0.224 ms
如果此时再恢复101主机的状态,那么访问的网页内容就会又变成101主机的内容了
这就是高可用
LVS+Keepalived高可用
案例拓扑图
这里我们简化一下案例,不再实现NFS共享存储的服务器,105作为客户端来测试
操作系统 | IP 地址 | 角色 |
CentOS7.9 | 192.168.10.101 | 主调度器 |
CentOS7.9 | 192.168.10.102 | 从调度器 |
CentOS7.9 | 192.168.10.103 | Web服务器① |
CentOS7.9 | 192.168.10.104 | Web服务器② |
CentOS7.9 | 192.168.10.105 | 客户端(测试机) |
本案例需要5台Linux虚拟机,全部恢复系统最初的快照
初步配置
本次案例使用DR模式作为工作模式
启动5台虚拟机并全部使用XShell连接
关闭服务
开启除了客户端的会话同步 统一关闭防火墙和内核安全机制
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
主调度器配置
关闭103和104的会话同步
只开启两个调度器服务器的会话同步(101、102)
在101(主调度器)操作
关闭NetworkManager服务,安装keepalived
[root@localhost ~]# systemctl stop NetworkManager
[root@localhost ~]# yum -y install keepalived
打开keepalived配置文件,修改以下内容
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
router_id LVS_01
#vrrp_strict
state MASTER
interface ens33
virtual_router_id 51
priority 100
virtual_ipaddress {
192.168.10.172
}
因为要针对服务进行负载均衡,所以在33行后的内容要配置好集群和真实服务器
我们这里用TCP的方式检查健康状态,所以删除一些内容,然后改为TCP_CHECK
virtual_server 192.168.10.172 80 {
delay_loop 6 # 回环延迟时间
lb_algo wrr # 调度算法
lb_kind DR # 负载均衡的工作模式
#persistence_timeout 50 会话保持时间
protocol TCP
real_server 192.168.10.103 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.104 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
# 剩下的内容删除
# 命令模式下:d + G
保存并退出
健康状态检查的方式
- SSL_GET
- 通过SSL,GET一下网站根目录的网页文件,如果有内容,就是正常的
- TCP_CHECL
- 工作在第4层,keepalived向后端服务器发起一个tcp连接请求,如果后端服务器没有响应或超时,那么这个后端将从服务器池中移除。
- HTTP_GET
- 工作在第5层,向指定的URL执行http请求,将得到的结果用md5加密并与指定的md5值比较看是否匹配,不匹配则从服务器池中移除;此外还可以指定http返回码来判断检测是否成功。HTTP_GET可以指定多个URL用于检测,在一台服务器有多个虚拟主机的情况下使用。
- MISC_CHECK
- 用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内,根据脚本的返回值来判断
调整内核参数
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.ens33.send_redirects=0
[root@localhost ~]# sysctl -p
从调度器配置
关闭会话同步
在102(从调度器)操作
再次打开配置文件,修改作为从调度器的参数
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
router_id LVS_02
state BACKUP
priority 99
保存并退出
在keepalived配置文件中配置了集群和真实服务器的参数,其实就是配置好了调度策略,所以不用再使用管理工具添加调度策略了
在101、102分别操作
分别开启两个调度器的keepalived服务,然后使用ip a命令查看虚拟IP是否正常
[root@localhost ~]# systemctl start keepalived
[root@localhost ~]# ip a
服务器池配置
为103和104开启会话同步
在103(Web服务器①)操作
创建本地回环虚拟网卡,改为虚拟IP
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.10.172
NETMASK=255.255.255.255
#NETWORK=127.0.0.0
#BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
保存退出后,重启服务。然后使用ifconfig查看是否创建成功
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ifconfig
lo:0:
inet 192.168.10.172
添加路由条目,如果访问的IP是172那么就交给lo:0设备处理
然后修改内核配置文件,添加以下内容,让后端服务器不参与ARP的应答
最后使用sysctl -p应用内核设置
[root@localhost ~]# route add -host 192.168.10.172 dev lo:0
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.default.arp_ignore=1
net.ipv4.conf.default.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
[root@localhost ~]# sysctl -p
安装Apache网站服务,启动服务
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd
关闭全部会话同步
在103(Web服务器①)操作
使用重定向在存放网站文件的目录下创建测试网页
[root@localhost ~]# echo "web01" > /var/www/html/index.html
在104(Web服务器②)操作
[root@localhost ~]# echo "web02" > /var/www/html/index.html
在105(客户端)操作
测试网站服务是否实现负载均衡
[root@localhost ~]# curl 192.168.10.172
web02
[root@localhost ~]# curl 192.168.10.172
web01
模拟故障
此时把101主机(主调度器)暂停
再测试,可以看到在几秒后, 服务可以正常访问,实现高可用(主调度器和备调度器之间切换Master和VIP)
[root@localhost ~]# curl 192.168.10.172
web02
此时再开启101主机,然后在102使用ipvsadm -ln可以看到keepalived帮我们创建出对应的LVS策略
[root@localhost ~]# 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.10.172:80 rr
-> 192.168.10.103:80 Route 1 0 0
-> 192.168.10.104:80 Route 1 0 0