Linux云计算架构-keepalived心跳检测机制(主备LVS、主主LVS)

   日期:2020-10-29     浏览:103    评论:0    
核心提示:Linux云计算架构-使用keepalived+LVS+DR部署高可用集群1. keepalived介绍keepalived是一款拥有3层检测机制的软件。可以检测web服务器的状态。若keepalived检测到web服务器不可用,则从集群中剔除该服务器,等待人工修复好该服务器后,keepalived又自动的将该服务器加入集群。层级工作位置作用layer3IP网络层keepalived定期向服务器群中的服务器发送一个ICMP包,即ping包,若发现不通,则认为这台服务器失效,从

文章目录

  • 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.30mlvs2绑定的是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接收。实现生产环境不中断服务的高可用架构。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服