• LVS+Keepalived群集


    Keepalived及其工作原理:

    Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。

    在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP(VIP),主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。


    Keepalived体系主要模块及其作用:

    keepalived体系架构中主要有三个模块,分别是core、check和vrrp。
    ●core模块:为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。
    ●vrrp模块:是来实现VRRP协议的。(调度器之间的健康检查和主备切换)
    check模块:负责健康检查,常见的方式有端口检查及URL检查。(节点服务器的健康检查)

    一个合格的群集应该具备的特点:

    1)负载均衡                用于提高群集的性能   LVS  Nginx  HAProxy  SLB  F5
    2)健康检查(探针)  针对于调度器和节点服务器    Keepalived   Heartbeat
    3)故障转移                 通过VIP漂移实现主备切换     VRRP   脚本


    健康检查(探针)常用的工作方式:

    1)发送心跳消息    vrrp报文    ping/pong
    2)TCP端口检查     向目标主机的 IP:PORT 发起TCP连接请求,如果TCP连接三次握手成功则认为健康检查正常,否则认为健康检查异常
    3)HTTP URL检查    向目标主机的URL路径(比如http://IP:PORT/URI路径)发起 HTTP GET 请求方法,如果响应消息的状态码为 2XX 或 3XX,则认为健康检查正常
                               如果响应消息的状态码为 4XX 或 5XX,则认为健康检查异常


    Keepalived工作原理:

    Keepalived 是基于 VRRP 协议实现的高可用方案。

    默认情况下通过优先级决定主备服务器的角色(优先级最高的为主),主服务器(MASTER)会通过ip命令在本地生成VIP,接收并处理客户端发送的请求消息;同时主服务器还会定时发送VRRP报文给备服务器(BACKUP)告知主服务器的存活状态。当主服务器异常时,备服务器就会接管VIP(也是通过ip命令生成VIP),继续提供服务,保证服务的高可用。


    Keepalived的工作模式:

    • 抢占模式:MASTER节点从故障中恢复后,会将VIP从BACKUP节点中抢占过来。
    • 非抢占模式:MASTER节点恢复后不抢占VIP。(主备节点的state都配置为BAKCUP,且都添加配置nopreempt)


    脑裂故障:

    现象:主服务器和备服务器都同时拥有相同的VIP
    原因:因为主服务器和备服务器的通信中断,导致备服务器无法收到主服务器发送的VRRP报文,备服务器误认为主服务器已经故障了并通过ip命令生成VIP
    解决:关闭主服务器或备服务器其中一个的keepalived服务
    预防:(1)如果是系统防火墙导致,则关闭防火墙或添加防火墙规则放通VRRP组播地址(224.0.0.18)的传输
          (2)如果是主备服务器之间的通信链路中断导致,则可以在主备服务器之间添加双链路通信
          (3)在主服务器使用脚本定时判断与备服务器通信链路是否中断,如果判断是主备服务器之间的链接中断则自行关闭主服务器上的keepalived服务
          (4)利用第三方应用或监控系统检测是否发生了脑裂故障现象,如果确认发生了脑裂故障则通过第三方应用或监控系统来关闭主服务器或备服务器其中一个的keepalived服务

    实验: 

    如何部署Keepalived 

    【1】先去官网下载:
    【2】初始化:

    1. [root@l4 ~]# systemctl disable firewalld.service
    2. Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
    3. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
    4. [root@l4 ~]# setenforce 0
    5. [root@l4 ~]# vim /etc/selinux/config
    6. [root@l4 ~]#

    (1)挂载yum
    1. [root@l4 ~]# df
    2. 文件系统 1K-块 已用 可用 已用% 挂载点
    3. devtmpfs 1913544 0 1913544 0% /dev
    4. tmpfs 1930624 0 1930624 0% /dev/shm
    5. tmpfs 1930624 12744 1917880 1% /run
    6. tmpfs 1930624 0 1930624 0% /sys/fs/cgroup
    7. /dev/mapper/centos-root 38770180 4578304 34191876 12% /
    8. /dev/sda1 1038336 191104 847232 19% /boot
    9. tmpfs 386128 40 386088 1% /run/user/0
    10. /dev/sr0 4635056 4635056 0 100% /run/media/root/CentOS 7 x86_64
    11. [root@l4 ~]# mount /dev/sr0 /mnt
    12. mount: /dev/sr0 写保护,将以只读方式挂载
    13. [root@l4 ~]#
    (2)下载 
    1. [root@l4 ~]# df //下载keepalived
    2. 文件系统 1K-块 已用 可用 已用% 挂载点
    3. devtmpfs 1913544 0 1913544 0% /dev
    4. tmpfs 1930624 0 1930624 0% /dev/shm
    5. tmpfs 1930624 12744 1917880 1% /run
    6. tmpfs 1930624 0 1930624 0% /sys/fs/cgroup
    7. /dev/mapper/centos-root 38770180 4578976 34191204 12% /
    8. /dev/sda1 1038336 191104 847232 19% /boot
    9. tmpfs 386128 40 386088 1% /run/user/0
    10. /dev/sr0 4635056 4635056 0 100% /mnt
    11. [root@l4 ~]# cd /mnt/Packages/
    12. [root@l4 Packages]# ls | grep keepalived
    13. keepalived-1.3.5-19.el7.x86_64.rpm
    14. [root@l4 Packages]#
    (3)在线下载(这里我们使用在线下载)
    1. [root@l4 Packages]# cd /etc/yum.repos.d/
    2. [root@l4 yum.repos.d]# ls
    3. local.repo repo.bak
    4. [root@l4 yum.repos.d]# mv repo.bak/* . //在线源挪出来
    5. [root@l4 yum.repos.d]# mv local.repo repo.bak/ //本地源移进去
    6. [root@l4 yum.repos.d]#
    1. [root@l4 yum.repos.d]# ls
    2. CentOS-Base.repo CentOS-fasttrack.repo CentOS-Vault.repo
    3. CentOS-CR.repo CentOS-Media.repo CentOS-x86_64-kernel.repo
    4. CentOS-Debuginfo.repo CentOS-Sources.repo repo.bak
    5. [root@l4 yum.repos.d]# yum install -y epel-release
    [root@l4 yum.repos.d]# yum install -y keepalived
    
    (4)也可以源码编译安装,配置方法基本相同 

    关闭同步

    【3】修改配置:

    主 (五号机):
    1. [root@l5 yum.repos.d]# cd /etc/keepalived/
    2. [root@l5 keepalived]# ls
    3. keepalived.conf
    4. [root@l5 keepalived]# vim keepalived.conf

    1. ! Configuration File for keepalived
    2. global_defs {
    3. notification_email {
    4. acassen@firewall.loc
    5. failover@firewall.loc
    6. sysadmin@firewall.loc
    7. }
    8. notification_email_from Alexandre.Cassen@firewall.loc
    9. smtp_server 127.0.0.1
    10. smtp_connect_timeout 30
    11. router_id LVS_01
    12. }
    13. vrrp_instance VI_1 {
    14. state MASTER
    15. interface ens33
    16. virtual_router_id 51
    17. priority 100
    18. advert_int 1
    19. authentication {
    20. auth_type PASS
    21. auth_pass 1111
    22. }
    23. virtual_ipaddress {
    24. 192.168.18.100
    25. }
    26. }

    备 (四号机): 
    1. [root@l4 ~]# cd /etc/keepalived/
    2. [root@l4 keepalived]# ls
    3. keepalived.conf
    4. [root@l4 keepalived]# cp keepalived.conf keepalived.conf.bak
    5. [root@l4 keepalived]# vim keepalived.conf

     

    1. ! Configuration File for keepalived
    2. global_defs {
    3. notification_email {
    4. acassen@firewall.loc
    5. failover@firewall.loc
    6. sysadmin@firewall.loc
    7. }
    8. notification_email_from Alexandre.Cassen@firewall.loc
    9. smtp_server 127.0.0.1
    10. smtp_connect_timeout 30
    11. router_id LVS_02
    12. }
    13. vrrp_instance VI_1 {
    14. state BACKUP
    15. interface ens33
    16. virtual_router_id 51
    17. priority 90
    18. advert_int 1
    19. authentication {
    20. auth_type PASS
    21. auth_pass 1111
    22. }
    23. virtual_ipaddress {
    24. 192.168.18.100
    25. }
    26. }

    主(5号机): 

    1. [root@l5 keepalived]# systemctl start keepalived.service
    2. [root@l5 keepalived]# systemctl enable keepalived.service
    3. Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
    4. [root@l5 keepalived]#

    备服务器也同上

    1. systemctl start keepalived.service
    2. systemctl enable keepalived.service

    主: 

    备:

    主:防火墙没有关,关闭防火墙

    [root@l5 keepalived]# systemctl stop firewalld.service    
    

    备服务器也如上操作这个时候如果关闭主 keepalived

    [root@l5 keepalived]# systemctl stop keepalived.service 

    没有vip地址 

    备 有VIP地址

    抢占模式:MASTER节点从故障中恢复后,会将VIP从BACKUP节点中抢占过来。


     主打开keepalived

    1. [root@l5 keepalived]# systemctl start keepalived.service
    2. [root@l5 keepalived]# vim keepalived.conf

    [root@l5 keepalived]# systemctl stop keepalived.service 

    备 :

    [root@l4 keepalived]# systemctl stop keepalived.service
    

    非抢占模式:MASTER节点恢复后不抢占VIP。(主备节点的state都配置为BAKCUP,且都添加配置nopreempt)

    不再按照优先级,而是按照启动顺序 


    LVS+Keepalived高可用负载均衡 : 

    打开上一篇的节点服务器,nfs存储服务器

    由于虚拟机冲突,这里我们把四号机改成nfs,一号机接替他的工作(备)

    1. [root@localhost ~]# showmount -e //nfs
    2. Export list for localhost.localdomain:
    3. /share/xy102 192.168.18.0/24
    4. /share/xy101 192.168.18.0/24
    5. [root@localhost ~]#

     两个节点服务器

     

    节点服务器:

    二号机

    [root@l2 ~]# cd /etc/sysconfig/network-scripts/
    

    [root@l2 network-scripts]# vim ifcfg-lo:0
    

    1. [root@l2 network-scripts]# sysctl -p
    2. net.ipv4.conf.lo.arp_ignore = 1
    3. net.ipv4.conf.all.arp_ignore = 1
    4. net.ipv4.conf.lo.arp_announce = 2
    5. net.ipv4.conf.all.arp_announce = 2
    6. [root@l2 network-scripts]#
    1. [root@l2 network-scripts]# route -n //路由
    2. Kernel IP routing table
    3. Destination Gateway Genmask Flags Metric Ref Use Iface
    4. 0.0.0.0 192.168.18.2 0.0.0.0 UG 100 0 0 ens33
    5. 192.168.18.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
    6. 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
    7. [root@l2 network-scripts]#
    1. [root@l2 network-scripts]# route add -host 192.168.18.100 dev lo:0 //添加路由(临时添加)
    2. [root@l2 network-scripts]# route -n
    3. Kernel IP routing table
    4. Destination Gateway Genmask Flags Metric Ref Use Iface
    5. 0.0.0.0 192.168.18.2 0.0.0.0 UG 100 0 0 ens33
    6. 192.168.18.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
    7. 192.168.18.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
    8. 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
    9. [root@l2 network-scripts]#

    [root@l2 network-scripts]# vim /etc/sysconfig/static-routes   //永久添加路由
    any host 192.168.18.100 dev lo:0
    

     

    [root@l2 network-scripts]# systemctl restart network

     

    三号机 

    同上一样

    1. ifconfig
    2. sysctl -p
    3. vim /etc/sysconfig/static-routes
    4. ___________________________________________________
    5. any host 192.168.18.100 dev lo:0
    6. ___________________________________________________
    7. systemctl restart network
    8. route -n

     


    开始配置

    【4】配置负载调度器(主、备相同)以下两台主备服务器都要操作:

    [root@l1 ~]# systemctl stop keepalived.service

     

    [root@l1 ~]# yum install -y ipvsadm    //两台主备服务器都要下载(1号机,5号机)
    1. [root@l5 ~]# modprobe ip_vs //两台主备服务器都要加载模块
    2. [root@l1 ~]# lsmod | grep ip_vs //两台主备服务器都要模块已经加载好了
    3. ip_vs 145458 0
    4. nf_conntrack 139264 1 ip_vs
    5. libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
    6. [root@l1 ~]#
    1. [root@l1 ~]# touch /etc/sysconfig/ipvsadm //两台主备服务器都要 ipvsadm启动起来
    2. [root@l5 ~]# systemctl start ipvsadm.service //主服务器
    3. [root@l5 ~]# systemctl enable ipvsadm.service //主服务器
    4. Created symlink from /etc/systemd/system/multi-user.target.wants/ipvsadm.service to /usr/lib/systemd/system/ipvsadm.service.
    5. [root@l5 ~]#

    1. [root@l1 ~]# systemctl enable --now ipvsadm //备服务器
    2. [root@l1 ~]# systemctl status ipvsadm.service //两台主备服务器都要 检查状态

     

    配置keeplived(主、备DR 服务器上都要设置):

    主 

    1. [root@l5 ~]# cd /etc/keepalived/
    2. [root@l5 keepalived]# ls
    3. keepalived.conf keepalived.conf.bak
    4. [root@l5 keepalived]# cp keepalived.conf.bak keepalived.conf
    5. cp:是否覆盖"keepalived.conf"? y
    [root@l5 keepalived]# vim keepalived.conf
    1. 1)配置keeplived(主、备DR 服务器上都要设置)
    2. cd /etc/keepalived/
    3. cp keepalived.conf keepalived.conf.bak
    4. vim keepalived.conf
    5. ......
    6. global_defs { #定义全局参数
    7. --10行--修改,邮件服务指向本地
    8. smtp_server 127.0.0.1
    9. --12行--修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
    10. router_id LVS_01
    11. --14行--注释掉,取消严格遵守VRRP协议功能,否则VIP无法被连接
    12. #vrrp_strict
    13. }
    14. vrrp_instance VI_1 { #定义VRRP热备实例参数
    15. --20行--修改,指定热备状态,主为MASTER,备为BACKUP
    16. state MASTER
    17. --21行--修改,指定承载vip地址的物理接口
    18. interface ens33
    19. --22行--修改,指定虚拟路由器的ID号,每个热备组保持一致
    20. virtual_router_id 10
    21. #nopreempt #如果设置非抢占模式,两个节点state必须为BACKUP,并加上配置 nopreempt
    22. --23行--修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90
    23. priority 100
    24. advert_int 1 #通告间隔秒数(心跳频率)
    25. authentication { #定义认证信息,每个热备组保持一致
    26. auth_type PASS #认证类型
    27. --27行--修改,指定验证密码,主备服务器保持一致
    28. auth_pass abc123
    29. }
    30. virtual_ipaddress { #指定群集vip地址
    31. 192.168.80.188
    32. }
    33. }
    34. --36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
    35. virtual_server 192.168.80.188 80 {
    36. delay_loop 6 #健康检查的间隔时间(秒)
    37. lb_algo rr #指定调度算法,轮询(rr)
    38. --39行--修改,指定群集工作模式,直接路由(DR)
    39. lb_kind DR
    40. persistence_timeout 0 #连接保持时间(秒)
    41. protocol TCP #应用服务采用的是 TCP协议
    42. --43行--修改,指定第一个Web节点的地址、端口
    43. real_server 192.168.80.12 80 {
    44. weight 1 #节点的权重
    45. --45行--删除,添加以下健康检查方式
    46. TCP_CHECK {
    47. connect_port 80 #添加检查的目标端口
    48. connect_timeout 3 #添加连接超时(秒)
    49. nb_get_retry 3 #添加重试次数
    50. delay_before_retry 3 #添加重试间隔
    51. }
    52. }
    53. real_server 192.168.80.13 80 { #添加第二个 Web节点的地址、端口
    54. weight 1
    55. TCP_CHECK {
    56. connect_port 80
    57. connect_timeout 3
    58. nb_get_retry 3
    59. delay_before_retry 3
    60. }
    61. }
    62. ##删除后面多余的配置##
    63. }
    64. systemctl start keepalived
    65. ip addr #查看虚拟网卡vip

    1. ! Configuration File for keepalived
    2. global_defs {
    3. notification_email {
    4. acassen@firewall.loc
    5. failover@firewall.loc
    6. sysadmin@firewall.loc
    7. }
    8. notification_email_from Alexandre.Cassen@firewall.loc
    9. smtp_server 127.0.0.1
    10. smtp_connect_timeout 30
    11. router_id LVS_01
    12. }
    13. vrrp_instance VI_1 {
    14. state MASTER
    15. interface ens33
    16. virtual_router_id 51
    17. priority 100
    18. advert_int 1
    19. authentication {
    20. auth_type PASS
    21. auth_pass 1111
    22. }
    23. virtual_ipaddress {
    24. 192.168.18.100
    25. }
    26. }
    27. virtual_server 192.168.18.100 80 {
    28. delay_loop 6
    29. lb_algo rr
    30. lb_kind DR
    31. persistence_timeout 0
    32. protocol TCP
    33. real_server 192.168.18.20 80 {
    34. weight 1
    35. TCP_CHECK {
    36. connetc_port 80
    37. connect_timeout 3
    38. nb_get_retry 3
    39. delay_before_retry 3
    40. }
    41. }
    42. real_server 192.168.18.30 80 {
    43. weight 1
    44. TCP_CHECK {
    45. connetc_port 80
    46. connect_timeout 3
    47. nb_get_retry 3
    48. delay_before_retry 3
    49. }
    50. }
    51. }
    1. [root@l5 keepalived]# scp keepalived.conf 192.168.18.10:`pwd` //复制到另一台备服务器
    2. The authenticity of host '192.168.18.10 (192.168.18.10)' can't be established.
    3. ECDSA key fingerprint is SHA256:PzjuREbX063cokEwp/v3k5xRLoPVZ07ik8g9RMXp4rE.
    4. ECDSA key fingerprint is MD5:aa:ba:2e:89:05:cb:b1:af:37:32:c6:10:77:ea:07:30.
    5. Are you sure you want to continue connecting (yes/no)? yes
    6. Warning: Permanently added '192.168.18.10' (ECDSA) to the list of known hosts.
    7. //出现这个输入a
    8. root@192.168.18.10's password: //输入密码
    9. keepalived.conf 100% 1079 2.2MB/s 00:00
    10. [root@l5 keepalived]#

    备:

    [root@l1 keepalived]# vim keepalived.conf
    

    1. ! Configuration File for keepalived
    2. global_defs {
    3. notification_email {
    4. acassen@firewall.loc
    5. failover@firewall.loc
    6. sysadmin@firewall.loc
    7. }
    8. notification_email_from Alexandre.Cassen@firewall.loc
    9. smtp_server 127.0.0.1
    10. smtp_connect_timeout 30
    11. router_id LVS_02
    12. }
    13. vrrp_instance VI_1 {
    14. state BACKUP
    15. interface ens33
    16. virtual_router_id 51
    17. priority 90
    18. advert_int 1
    19. authentication {
    20. auth_type PASS
    21. auth_pass 1111
    22. }
    23. virtual_ipaddress {
    24. 192.168.18.100
    25. }
    26. }
    27. virtual_server 192.168.18.100 80 {
    28. delay_loop 6
    29. lb_algo rr
    30. lb_kind DR
    31. persistence_timeout 0
    32. protocol TCP
    33. real_server 192.168.18.20 80 {
    34. weight 1
    35. TCP_CHECK {
    36. connetc_port 80
    37. connect_timeout 3
    38. nb_get_retry 3
    39. delay_before_retry 3
    40. }
    41. }
    42. real_server 192.168.18.30 80 {
    43. weight 1
    44. TCP_CHECK {
    45. connetc_port 80
    46. connect_timeout 3
    47. nb_get_retry 3
    48. delay_before_retry 3
    49. }
    50. }
    51. }

     主:

    1. [root@l5 keepalived]# systemctl start keepalived.service
    2. [root@l5 keepalived]#

     备:

    1. [root@l1 keepalived]# systemctl start keepalived.service
    2. [root@l1 keepalived]#

    主: 

    1. [root@l5 keepalived]# ipvsadm -ln
    2. IP Virtual Server version 1.2.1 (size=4096)
    3. Prot LocalAddress:Port Scheduler Flags
    4. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
    5. TCP 192.168.18.100:80 rr
    6. -> 192.168.18.20:80 Route 1 0 0
    7. -> 192.168.18.30:80

    备:

    测试: 把主关了

    备:


    Keepalived脑裂故障 

    脑裂故障
    现象:主服务器和备服务器都同时拥有相同的VIP
    原因:因为主服务器和备服务器的通信中断,导致备服务器无法收到主服务器发送的VRRP报文,备服务器误认为主服务器已经故障了并通过ip命令生成VIP
    解决:关闭主服务器或备服务器其中一个的keepalived服务
    预防:

          (1)如果是系统防火墙导致,则关闭防火墙或添加防火墙规则放通VRRP组播地址(224.0.0.18)的传输
          (2)如果是主备服务器之间的通信链路中断导致,则可以在主备服务器之间添加双链路通信
          (3)在主服务器使用脚本定时判断与备服务器通信链路是否中断,如果判断是主备服务器之间的链接中断则自行关闭主服务器上的keepalived服务
          (4)利用第三方应用或监控系统检测是否发生了脑裂故障现象,如果确认发生了脑裂故障则通过第三方应用或监控系统来关闭主服务器或备服务器其中一个的keepalived服务

    1. #主服务器脚本
    2. #!/bin/bash
    3. while true
    4. do
    5. ping -c4 -i 0.5 -W 2 备服务器IP
    6. if 「 $? -ne 0 ]
    7. then ssh 另一台主机IP ping -c 4 -i 0.5 -W2 -I 另一台主机IP 备服务器IP
    8. if [ $? -eg 0 ]
    9. then systemctl stop keepalived
    10. fi
    11. fi
    12. sleep 20
    13. done

  • 相关阅读:
    Spring Boot整合Redis实现订单超时处理
    计算机网络-后退N帧协议(弊端 滑动窗口 运行中的GBN 滑动窗口长度习题 GBN协议性能分析 )
    .net中定义get请求的接口实现
    Higress 全新 Wasm 运行时,性能大幅提升
    我的高考往事
    【Linux】虚拟地址空间
    Qt在qml组件中传递自定义类对象或结构体到cpp对象
    猿创征文|HCIE-Security Day52:DDoS和防火墙(附场景和配置)
    【Linux】常见指令(下)
    docker-compose的环境变量指令怎么添加数组类型的环境变量
  • 原文地址:https://blog.csdn.net/2301_82109773/article/details/139614349