• LVS+keepalive高可用集群


    keepalive简介

    keepalive为LVS应用延伸的高可用服务。lvs的调度器无法做高可用。但keepalive不是为lvs专门集群服务的,也可以为其他的的代理服务器做高可用。
    keepalive在lvs的高可用集群,主调度器和备调度器(可以有多个) 一主两备或一主一备。

    VRRP: keepalived是基于vrrp协议实现Ivs服务的高可用。解决了调度器单节点的故障问题。
    VRRP协议:提高网络路由器的可靠性开发的一种协议。

    vrrp工作原理
    ·选举出主和备,预先设定主备的优先级。主的优先级较高,备的优先级低,一旦开启服务器,优先级高的,会自定抢占主的位置。
    ·VRRP组播通信: 224.0.0.18 VRRP协议当中的主备服务器通过组播地进行通信,交换主备服务器之间的运行状态。主服务会周期性的发送vrrp协议报文,告诉备:主的当前状态。
    ·主备切换:主服务器发生故障,或者不可达,VRRP协议会把请求转义到备服务器。通过组播地址,VRRP可以迅速的通知其他服务器发生了主备切换,确保新的主服务器可以正常处理客户端的请求。
    ·故障恢复: 一旦主服务器恢复通信,由组播地址进行通信,发现在恢复的主服务器优先级更高,会抢占原主服务器的位置,成为主服务器,调度和接受请求。

    keepalive工作原理

    主调度器能够正常运行时,由主调度器进行后端真实服务器的分配处理。其余的备用调度器处于冗余状态。
    不参与集群的运转。主调度器故障无法运行,备调度器才会承担主调度器的工作。
    一旦主调度恢复工作,继续由主调度器进行处理,备调度器又成了冗余。

    keepalive的体系模块:

    全局模块:core模块,负载整个keepalived启动加载和维护
                      VRRP模块:实现vrrp协议,主备切换
                      check模块:负责后端真实服务器健康检查,配置真实服务器的模块当中。


    安装keepalived                yum -y install keepalived ipvsadm

    vim /etc/keepalived/keepalived.conf下配置说明

    1. ·邮箱地:smtp_server
    2. ·主备服务的id,主和备的id不能一致:router_id_01
    3. ·取消严格遵守vrrp协议功能,不取消VIP无法连接:#vrrp_strict
    4. ·标识主身份:state MASTER
    5. ·指定vip地址的物理接口:interface ens33
    6. ·虚拟路由器的id号:virtual_router_id 10
    7. ·发送报文的间隔时间:advert_int 30
    8. ·指定集群的vip地址:virtual_ipaddress
    9. ·健康检查的间隔时间:delay_loop 6 单位s
    10. ·负载均衡的调度算法:lb algo rr
    11. ·指定lvs集群的工作方式(要大写):lb_kind NAT
    12. ·连接保持:persistence_timeout 50 单位s
    13. ·VIP模块:virtual server 192.168.233.100 80
    14. ·后端真实服务器的轮询权重:real_server 192.168.233.30 80
    15. ·检测目标的端口号:connect_port 80
    16. ·连接超时时间:connect_timeout 3 单位s
    17. ·重试的次数:nb_get_retry 3
    18. ·重试间隔秒数:delay_before_retry 4

    实验(LVS-DR)-keepalive

    主192.168.10.10

    备192.168.10.40

    web服务器

    192.168.10.20----nginx

    192.168.10.30----nginx

    客户端访问:任意一台

    主192.168.10.10

    1. yum -y install keepalived ipvsadm
    2. vim /etc/keepalived/keepalived.conf
    3. .............
    4. smtp_server 127.0.0.1
    5. router_id LVS_01
    6. vrrp_strict 注释掉
    7. interface ens33
    8. persistence_timeout 0
    9. virtual_ipaddress {
    10. 192.168.10.99
    11. }
    12. 修改上面的,并删掉最后一个下面所有的内容,并添加以下内容
    13. virtual_server 192.168.10.99 80 {
    14. delay_loop 6
    15. lb_algo rr
    16. lb_kind DR
    17. persistence_timeout 0
    18. protocol TCP
    19. real_server 192.168.10.20 80 {
    20. weight 1
    21. TCP_CHECK {
    22. connect_port 80
    23. connect_timeout 3
    24. nb_get_retry 3
    25. delay_before_retry 4
    26. }
    27. }
    28. real_server 192.168.10.30 80 {
    29. weight 1
    30. TCP_CHECK {
    31. connect_port 80
    32. connect_timeout 3
    33. nb_get_retry 3
    34. delay_before_retry 4
    35. }
    36. }
    37. }
    38. .............
    39. systemctl restart keepalived.service
    40. systemctl restart ipvsadm.service
    41. ipvsadm-save > /etc/sysconfig/ipvsadm
    42. systemctl restart ipvsadm.service
    43. ipvsadm -ln
    44. ipvsadm-save > /etc/sysconfig/ipvsadm
    45. systemctl restart ipvsadm.service
    46. vim /etc/sysctl.conf
    47. .....................
    48. net.ipv4.ip_forward = 0
    49. net.ipv4.conf.all.send_redirects = 0
    50. net.ipv4.conf.default.send_redirects = 0
    51. net.ipv4.conf.ens33.send_redirects = 0
    52. .....................
    53. sysctl -p 立即加载

    备192.168.10.40

    1. yum -y install keepalived ipvsadm
    2. vim /etc/keepalived/keepalived.conf
    3. .............
    4. smtp_server 127.0.0.1
    5. router_id LVS_02
    6. priority 90
    7. vrrp_strict 注释掉
    8. state BACKUP
    9. interface ens33
    10. persistence_timeout 0
    11. virtual_ipaddress {
    12. 192.168.10.99
    13. }
    14. 修改上面的,并删掉最后一个下面所有的内容,并添加以下内容
    15. virtual_server 192.168.10.99 80 {
    16. delay_loop 6
    17. lb_algo rr
    18. lb_kind DR
    19. persistence_timeout 0
    20. protocol TCP
    21. real_server 192.168.10.20 80 {
    22. weight 1
    23. TCP_CHECK {
    24. connect_port 80
    25. connect_timeout 3
    26. nb_get_retry 3
    27. delay_before_retry 4
    28. }
    29. }
    30. real_server 192.168.10.30 80 {
    31. weight 1
    32. TCP_CHECK {
    33. connect_port 80
    34. connect_timeout 3
    35. nb_get_retry 3
    36. delay_before_retry 4
    37. }
    38. }
    39. }
    40. .............
    41. systemctl restart keepalived.service
    42. systemctl restart ipvsadm.service
    43. ipvsadm-save > /etc/sysconfig/ipvsadm
    44. systemctl restart ipvsadm.service
    45. ipvsadm -ln
    46. ipvsadm-save > /etc/sysconfig/ipvsadm
    47. systemctl restart ipvsadm.service
    48. vim /etc/sysctl.conf
    49. .....................
    50. net.ipv4.ip_forward = 0
    51. net.ipv4.conf.all.send_redirects = 0
    52. net.ipv4.conf.default.send_redirects = 0
    53. net.ipv4.conf.ens33.send_redirects = 0
    54. .....................
    55. sysctl -p 立即加载

    web服务器

    192.168.10.20

    192.168.10.30

    1. vim /etc/sysconfig/network-scripts/ifcfg-lo:0
    2. .........................
    3. DEVICE=lo:0
    4. IPADDR=192.168.10.99
    5. NETMASK=255.255.255.255
    6. ONBOOT=yes
    7. .........................
    8. 重启lo:0网卡
    9. ifup ifcfg-lo:0
    10. 绑定vip
    11. route add -host 192.168.10.99 dev lo:0
    12. vim /etc/sysctl.conf
    13. ...................
    14. net.ipv4.conf.lo.arp_ignore = 1
    15. net.ipv4.conf.lo.arp_announce = 2
    16. net.ipv4.conf.all.arp_ignore = 1
    17. net.ipv4.conf.all.arp_announce = 2
    18. ...................
    19. sysctl -p

    结果

    1. 停止主的
    2. systemctl stop ipvsadm.service
    3. systemctl stop keepalived.service
    4. vip漂移到备服务器
    5. ip addr 看
    6. 页面访问服务正常

    keepalive基于nginx高可用

    主192.168.10.10--nginx

    1. yum -y install keepalived
    2. vim /etc/keepalived/keepalived.conf
    3. ...................
    4. global_defs模块中
    5. smtp_server 127.0.0.1
    6. router_id LVS_01
    7. #vrrp_strict
    8. global和vrrp_instance之间加
    9. .......
    10. vrrp_script check_nginx {
    11. script "/opt/check_nginx.sh"
    12. interval 5
    13. #5秒执行一次脚本
    14. }
    15. .......
    16. vrrp_instance模块中
    17. virtual_ipaddress {
    18. 192.168.10.99
    19. }
    20. vrrp_instance内最后加
    21. track_script {
    22. check_nginx
    23. }
    24. ...................
    25. vrrp_instance模块后的都删除
    26. chmod 777 /opt/check_nginx.sh
    27. systemctl restart keepalived.service
    1. 传递nginx的状态
    2. vim /opt/check_nginx.sh
    3. #!/bin/bash
    4. /usr/bin/curl -I http://localhost &> /dev/null
    5. if [ $? -ne 0 ]
    6. then
    7. systemctl stop keepalived
    8. fi

    备192.168.10.20--nginx

    1. yum -y install keepalived
    2. vim /etc/keepalived/keepalived.conf
    3. ...................
    4. global_defs模块中
    5. smtp_server 127.0.0.1
    6. router_id LVS_02
    7. #vrrp_strict
    8. global和vrrp_instance之间加
    9. .......
    10. vrrp_script check_nginx {
    11. script "/opt/check_nginx.sh"
    12. interval 5
    13. #5秒执行一次脚本
    14. }
    15. .......
    16. vrrp_instance模块中
    17. state BACKUP
    18. priority 90
    19. virtual_ipaddress {
    20. 192.168.10.99
    21. }
    22. vrrp_instance内最后加
    23. track_script {
    24. check_nginx
    25. }
    26. ...................
    27. vrrp_instance模块后的都删除
    28. chmod 777 /opt/check_nginx.sh
    29. systemctl restart keepalived.service
    1. 传递nginx的状态
    2. vim /opt/check_nginx.sh
    3. #!/bin/bash
    4. /usr/bin/curl -I http://localhost &> /dev/null
    5. if [ $? -ne 0 ]
    6. then
    7. systemctl stop keepalived
    8. fi

    结果:

    当主故障后切换到备,主要恢复需要

    1. 主故障
    2. systemctl stop nginx.service
    3. 主恢复需要
    4. systemctl restart nginx.service
    5. systemctl restart keepalived.service

    脑裂

    脑裂:主备同时拥有VIP地址,在高可用系统当中,联系两个节点的心跳线,本来是一体的,动作协调的高可用系统。

    心跳线断开后,分裂成了两个独立的个体。主备之间失去了联系,都以为是对方出现了故。两个调度器,就像脑裂人一样,开始抢占主的位置,抢占VIP。主也有vip,备也有vip,导致整个集群失败。
    解决方法:
    ·软件层面:    1、配置文件
                            2、tcpdump抓包方向
                            解决方法:重启主keepalived 后重启备keepalived
    ·网络层面:    1、高可用服务器之间,心跳线检测设备。主备之间通信段开
    ·硬件层面:    1、连接主备之间心跳线老化
                            2、网卡或网卡驱动设备失效,IP地址配置冲突
                            3、防火墙没有配置心跳线消息的传输通道,导致检测失败
                            4、后端服务器的配置问题,心跳方式不同。心跳广播冲突。软件BUG
                           硬件解决方法:准备两条心跳线,这样断了一条,依然能够传送心跳消息
                              设置防火墙一定要让心跳线的消息通过
                              监控软件,实时监测(zabbix) 

  • 相关阅读:
    vite 关于 global is not defined 问题
    Android-从本质层面了解数据结构与算法
    latex模板列出所有参考文献并加上超链接(xiaoming et al. 2022; xiaohong et al. 2021)
    工艺边与定位孔设计经验规则总结
    Java数据类型
    挠场的科学丨五、二十一世纪的挠力文明
    奶茶行业竞争加剧,奈雪全自动化制作,亲身示范如何“内卷”
    ES6-匿名函数
    排序算法(Java实现)
    软件开发行业的乱象——低价引流中途收费?299?399?
  • 原文地址:https://blog.csdn.net/qq_61843057/article/details/134013830