文章目录
- Linux云计算架构-keepalived心跳检测机制(主备LVS、主主LVS)
-
- 1. keepalived介绍
- 2. keepalived部署
-
- 2.1 集群环境介绍
- 2.2 主备keepalived配置
-
- 2.2.1 主备环境介绍
- 2.2.2 配置主LVS
- 2.2.3 配置备LVS
- 2.2.4 测试VIP主备切换
- 2.3 主主keepalived配置
-
- 2.3.1 主主环境介绍
- 2.3.2 两次主从配置
- 2.3.3 测试VIP主主切换
- 3. keepalived总结
Linux云计算架构-keepalived心跳检测机制(主备LVS、主主LVS)
1. keepalived介绍
keepalived
是一款拥有3层检测机制的软件。可以检测web服务器的状态。若keepalived检测到web服务器不可用,则从集群中剔除该服务器,等待人工修复好该服务器后,keepalived又自动的将该服务器加入集群。
层级 | 工作位置 | 作用 |
---|---|---|
layer3 | IP网络层 | keepalived定期向服务器群中的服务器发送一个ICMP包,即ping包,若发现不通,则认为这台服务器失效,从服务器群中剔除该服务器。 |
layer4 | TCP传输层 | keepalived检测服务器的某一个端口是否启动来判断服务器是否正常。如web服务就检测80端口号是否启动,若没启动,则剔除该服务器。 |
layer5 | 应用层 | 用户自定义服务器程序运行检测规则,keepalived根据用户自定义的规则去检查服务器程序的运行是否正常,若不正常,则剔除该服务器。 |
keepalived的作用:
1.管理VIP:即存在主备分发器,当主分发器挂掉时,VIP自动转移到备分发器上,这时备分发器作为新的主分发器。当主分发器修复后,由于主分发器比备分发器的优先级高,故VIP又会从备分发器转移到原先的主分发器上。2.监控LVS分发器:为了管理VIP,就要监控LVS分发器是否挂了。主分发器上的keepalived会以组播的形式向备分发器上宣告自己还活着,若备分发器在指定时间内未收到主分发器发来的消息,就会认为主分发器挂了,并开始将VIP转移到备分发器上。
3.管理RS:keepalived会定期访问(elinks)后端真实服务器,看是否正常。如果不正常,则剔除该服务器。即某一个节点挂了。
经典高可用 web 架构: LVS+keepalived+nginx+apache+php+eaccelerator(+nfs 可选)
keepalived官网:https://www.keepalived.org/
目前最新版是2020年7月13日发布的2.1.5版本。
2. keepalived部署
2.1 集群环境介绍
网络拓扑图:
生产中,所有的IP地址都应为同一物理网段的IP地址。
主备LVS分发器实现分发器的高可用。也可以配置成主主LVS实现互为主备LVS。
2.2 主备keepalived配置
2.2.1 主备环境介绍
主机名 | IP/子网掩码 | 网关 | 作用 |
---|---|---|---|
mlvs | DIP:192.168.10.10/24 VIP:192.168.10.30/32 |
192.168.10.1 | 主LVS |
slvs | DIP:192.168.10.20/24 VIP:192.168.10.30/32 |
192.168.10.1 | 备LVS |
rs1 | 192.168.10.40/24 | 192.168.10.1 | rs1后端真实服务器 |
rs2 | 1921.68.10.50/24 | 192.168.10.1 | rs2后端真实服务器 |
# 主备lvs上都要安装ipvsadm和keepalived
# 使用命令ipvsadm -L -n 可以看到,两个分发器都是做负载均衡的,毕竟都没有配后端真实服务器。
# 这不是本文的重点,本文是要测试keepalived的心跳检测机制。
[root@mlvs ~]# yum install ipvsadm keepalived -y
[root@slvs ~]# yum install ipvsadm keepalived -y
[root@mlvs ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@slvs ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
2.2.2 配置主LVS
修改主keepalived的配置文件:
# 可以使用以下命令查看yum安装的软件包的位置
[root@mlvs ~]# rpm -ql keepalived
/etc/keepalived/keepalived.conf
# 在复制进配置文件的时候,要把注释信息去掉。
[root@mlvs ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { # 全局配置
notification_email {
root@localhost # 当VIP发生切换时,发送邮件给以下邮箱,一行一个。
}
notification_email_from root@localhost # 发件人
smtp_server localhost # smtp发件服务器地址
smtp_connect_timeout 30 # smtp连接超时时间
router_id mlvs # 标识当前节点的名字,与备lvs不同。
}
vrrp_instance M1 { #定义一个实例
state MASTER # 主LVS,备LVS应设置为BACKUP
interface ens32 # 指定检测网络的接口
virtual_router_id 51 # vrrp组名,备lvs要与主lvs在同一组。
priority 100 # 优先级(1-254)
advert_int 1 # 组播发送消息时间间隔
authentication { # 设置验证信息,两个LVS必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.30 # 指定VIP,两个LVS必须一致
}
}
virtual_server 192.168.10.30 80 { # 添加虚拟服务器VIP
delay_loop 6 # keepalived检测RS的时间间隔
lb_algo rr # 分发算法,rr指轮询
lb_kind DR # lvs模式,这里用DR
nat_mask 255.255.255.0
persistence_timeout 50 # 长连接保持时间,50s内同一IP的请求会发送给同一RS
protocol TCP
real_server 192.168.10.40 80 { # RS设置
weight 1 # 真实服务器节点的权重,数值越大权重越高
TCP_CHECK { # 检查TCP的80端口号,即layer4
connect_timeout 3 # 3s RS无响应则超时
nb_get_retry 3 # 超时重试次数
delay_before_retry 3 # 3s重试一次,即重试间隔
connect_port 80 # 检测端口
}
}
real_server 192.168.10.50 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
# 启动主lvs上的keepalived,并设置开机自启。
[root@mlvs ~]# systemctl start keepalived
[root@mlvs ~]# systemctl enable keepalived
一个virtual_server
实例就是一个LVS集群,如果要在一台主机上配置多个LVS集群,那么就需要配置多个实例。
# 清空iptables防火墙规则
[root@mlvs ~]# iptables -F
# 使用ipvsadm查看负载均衡的情况
[root@mlvs ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.30:80 rr persistent 50
# 使用ip a命令查看ens32绑定的所有IP地址
[root@mlvs ~]# ip a | grep ens32
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.8.118/24 brd 192.168.8.255 scope global noprefixroute dynamic ens32
inet 192.168.10.30/32 scope global ens32
2.2.3 配置备LVS
# 发送主lvs的keepalived配置文件给备lvs主机。
[root@mlvs ~]# scp /etc/keepalived/keepalived.conf root@192.168.8.120:/etc/keepalived/
[root@slvs keepalived]# vim keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id slvs # 从lvs标识
}
vrrp_instance M1 {
state BACKUP # 设置该实例为从LVS
interface ens32
virtual_router_id 51
priority 90 # 优先级调低,主为100,从为90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.30
}
}
virtual_server 192.168.10.30 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.10.40 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.10.50 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
# 启动从lvs上的keepalived,并设置开机自启。
[root@slvs ~]# systemctl start keepalived.service
[root@slvs ~]# systemctl enable keepalived.service
# 清空iptables防火墙规则
[root@slvs ~]# iptables -F
# 验证下VIP绑定情况,可以看到VIP是没有绑定到从LVS上的。
[root@slvs ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.30:80 rr persistent 50
[root@slvs ~]# ip a | grep ens32
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.8.120/24 brd 192.168.8.255 scope global noprefixroute dynamic ens32
2.2.4 测试VIP主备切换
停止主LVS的keepalived服务,可以看到VIP从主LVS漂移到从LVS上了。
重启主LVS上的keepalived服务,可以看到VIP从从LVS漂移回到主LVS上。
可以通过从LVS的日志看到,在主LVS恢复后,从LVS的动作为先检查优先级,再切换到BACKUP模式,最后移除VIP。
2.3 主主keepalived配置
2.3.1 主主环境介绍
主机名 | IP/子网掩码 | 网关 | 作用 |
---|---|---|---|
mlvs1 | DIP:192.168.10.10/24 VIP1:192.168.10.30/32 |
192.168.10.1 | 主LVS,也是备LVS |
mlvs2 | DIP:192.168.10.20/24 VIP2:192.168.10.60/32 |
192.168.10.1 | 主LVS,也是备LVS |
rs1 | 192.168.10.40/24 | 192.168.10.1 | rs1后端真实服务器 |
rs2 | 1921.68.10.50/24 | 192.168.10.1 | rs2后端真实服务器 |
2.3.2 两次主从配置
由于上面已经配置了一次主从,接下来再配置一次主从即可。
# 配置为M1实例的主,M2实例的从。一个实例可以看作是一个集群。
[root@mlvs2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id mlvs
}
vrrp_instance M1 {
state MASTER
interface ens32
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.30
}
}
vrrp_instance M2 {
state BACKUP
interface ens32
virtual_router_id 52
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.60
}
}
virtual_server 192.168.10.30 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.10.40 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.10.50 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
virtual_server 192.168.10.60 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.10.40 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.10.50 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
# 检测主1上的VIP情况,可以看到只绑定了一个VIP。因为主1只是实例M1的主LVS。
[root@mlvs1 ~]# systemctl restart keepalived.service
[root@mlvs1 ~]# iptables -F
[root@mlvs1 ~]# ip a |grep ens32
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.8.118/24 brd 192.168.8.255 scope global noprefixroute dynamic ens32
inet 192.168.10.30/32 scope global ens32
[root@mlvs1 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.30:80 rr persistent 50
TCP 192.168.10.60:80 rr persistent 50
# 配置为M2实例的主,M1实例的从。
[root@mlvs2 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id slvs
}
vrrp_instance M1 {
state BACKUP
interface ens32
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.30
}
}
vrrp_instance M2 {
state MASTER
interface ens32
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.60
}
}
virtual_server 192.168.10.30 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.10.40 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.10.50 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
virtual_server 192.168.10.60 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.10.40 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.10.50 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
# 检测主2上的VIP情况,可以看到只绑定了一个VIP。因为主2只是实例M2的主LVS。
[root@mlvs2 ~]# systemctl restart keepalived.service
[root@mlvs2 ~]# iptables -F
[root@mlvs2 ~]# ip a | grep ens32
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.8.120/24 brd 192.168.8.255 scope global noprefixroute dynamic ens32
inet 192.168.10.60/32 scope global ens32
[root@mlvs2 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.30:80 rr persistent 50
TCP 192.168.10.60:80 rr persistent 50
2.3.3 测试VIP主主切换
可以看到,配置完成后,一台LVS主机是绑定一个VIP的。mlvs1
绑定的是192.168.10.30
,mlvs2
绑定的是192.168.10.60
。
停止mlvs1上的keepalived服务,可以看到VIP漂移了。
启动mlvs1上的keepalived服务,可以看到VIP漂移回来了。
停止mlvs2上的keepalived服务,可以看到VIP漂移了。
启动mlvs2上的keepalived服务,可以看到VIP漂移回来了。
3. keepalived总结
①从keepalived的工作原理可以知道,它是在IP网络层、TCP传输层以及应用层这三个层次进行服务器检测的。若服务器不可用则从集群中剔除,若修复服务器后,则将该服务器加入集群。
②keepalived主要有3个作用:管理VIP、监控LVS分发器、管理RS。
③在本文集群中,主LVS和备LVS属于同一个vrrp分组,主LVS定期以组播的方式向备LVS宣告自身还活着,这时备LVS就不会喧宾夺主。但是当备LVS在一个周期内未收到主LVS的宣告,备LVS就会自动提升自己为主LVS,VIP也会自动从主LVS漂移到备LVS。
④keepalived常与web服务器、mysql服务器构建集群。本文就是keepalived+lvs+DR+http架构,如后端real_server监控的是3306端口,则该架构就转换为keepalived+lvs+DR+mysql。
⑤每一个vrrp_instance都是一个集群,配置主LVS和备LVS都是属于配置同一个集群,故vrrp_instance实例名要相同。主LVS为了能以组播的方式宣告自己还活着,virtual_route_id VRRP组ID必须相同。每一个keepalived又是属于自身的,故拥有不一样的route_id。区分主备可以通过state定义,当主LVS故障后,VIP根据state和集群中节点的优先级priority进行VIP漂移。一般会漂移到state为BACKUP、priority在备LVS中最高的节点上。通过以上配置,可以扩展为一主多备,多主多备。
⑥2台服务器可以实现主备、主主。主备属于同一集群,而主主可以看作是两个主备。3台服务器可以一主二备,三主。一主二备属于同一集群,而三主可以看作是三个一主二备。这样,当主LVS挂了,会有备LVS接收VIP,当备LVS挂了,会有另一台备LVS接收。实现生产环境不中断服务的高可用架构。