• LVS+Keepalived


    1.  规划环境:

    主机名称

    服务器名称

    IP

    用途

    centosnode1

    LVS_Master

    192.168.188.223

    提供负载均衡

    centosnode2

    LVS_Backup

    192.168.188.226

    提供负载均衡

    LVS-DR-VIP

    192.168.188.100

    网站的VIP地址

    centosnode3

    Web1服务器

    192.168.188.227

    提供Web服务

    centosnode4

    Web2服务器

    192.168.188.228

    提供Web服务

    2.  配置LVS_Master的Keepalived实现LVS负载均衡:

    1. [root@centosnode1 ~]# vim /etc/keepalived/keepalived.conf
    2. ! Configuration File for keepalived
    3. global_defs {
    4. notification_email {
    5. acassen@firewall.loc
    6. failover@firewall.loc
    7. sysadmin@firewall.loc
    8. }
    9. notification_email_from Alexandre.Cassen@firewall.loc
    10. smtp_server 192.168.200.1
    11. smtp_connect_timeout 30
    12. router_id MASTER
    13. }
    14. vrrp_instance VI_1 {
    15. state MASTER
    16. interface ens33
    17. virtual_router_id 51
    18. priority 100
    19. advert_int 1
    20. authentication {
    21. auth_type PASS
    22. auth_pass 1111
    23. }
    24. virtual_ipaddress {
    25. 192.168.188.100 ##设置vip
    26. }
    27. }
    28. virtual_server 192.168.188.100 80 { ##定义虚拟服务,需指定IP地址和端口,空格隔开
    29. delay_loop 6 ##定义RS运行情况监测时间间隔
    30. lb_algo rr ##设置负载均衡算法
    31. lb_kind DR ##设置lvs的工作模式
    32. persistence_timeout 50 ##定义会话保持时间,S为单位
    33. protocol TCP ##指定转发协议
    34. real_server 192.168.188.227 80 { ##定义真实服务器IP地址和端口
    35. weight 1 ##定义RS的权重
    36. TCP_CHECK { ##设置健康检查方式
    37. connect_timeout 8 ##定义超出8s连接超时
    38. nb_get_retry 3 ##定义重试次数
    39. delay_before_retry 3 ##定义重试时间间隔
    40. connect_port 80 ##定义健康检查端口
    41. }
    42. }
    43. }
    44. virtual_server 192.168.188.100 80 { ##定义虚拟服务,需指定IP地址和端口,空格隔开
    45. delay_loop 6 ##定义RS运行情况监测时间间隔
    46. lb_algo rr ##设置负载均衡算法
    47. lb_kind DR ##设置lvs的工作模式
    48. persistence_timeout 50 ##定义会话保持时间,S为单位
    49. protocol TCP ##指定转发协议
    50. real_server 192.168.188.228 80 { ##定义真实服务器IP地址和端口
    51. weight 1 ##定义RS的权重
    52. TCP_CHECK { ##设置健康检查方式
    53. connect_timeout 8 ##定义超出8s连接超时
    54. nb_get_retry 3 ##定义重试次数
    55. delay_before_retry 3 ##定义重试时间间隔
    56. connect_port 80 ##定义健康检查端口
    57. }
    58. }
    59. }

    3.  配置LVS_Backup的Keepalived实现LVS负载均衡:

    1. [root@centosnode2 ~]# vim /etc/keepalived/keepalived.conf
    2. ! Configuration File for keepalived
    3. global_defs {
    4. notification_email {
    5. acassen@firewall.loc
    6. failover@firewall.loc
    7. sysadmin@firewall.loc
    8. }
    9. notification_email_from Alexandre.Cassen@firewall.loc
    10. smtp_server 192.168.200.1
    11. smtp_connect_timeout 30
    12. router_id MASTER
    13. }
    14. vrrp_instance VI_1 {
    15. state BACKUP
    16. interface ens33
    17. virtual_router_id 51
    18. priority 80
    19. advert_int 1
    20. authentication {
    21. auth_type PASS
    22. auth_pass 1111
    23. }
    24. virtual_ipaddress {
    25. 192.168.188.100 ##设置vip
    26. }
    27. }
    28. virtual_server 192.168.188.100 80 { ##定义虚拟服务,需指定IP地址和端口,空格隔开
    29. delay_loop 6 ##定义RS运行情况监测时间间隔
    30. lb_algo rr ##设置负载均衡算法
    31. lb_kind DR ##设置lvs的工作模式
    32. persistence_timeout 50 ##定义会话保持时间,S为单位
    33. protocol TCP ##指定转发协议
    34. real_server 192.168.188.227 80 { ##配置后端真实服务器
    35. weight 1
    36. TCP_CHECK { ##设置健康检查方式
    37. connect_timeout 8
    38. nb_get_retry 3
    39. delay_before_retry 3
    40. connect_port 80
    41. }
    42. }
    43. }
    44. virtual_server 192.168.188.100 80 { ##定义虚拟服务,需指定IP地址和端口,空格隔开
    45. delay_loop 6 ##定义RS运行情况监测时间间隔
    46. lb_algo rr ##设置负载均衡算法
    47. lb_kind DR ##设置lvs的工作模式
    48. persistence_timeout 50 ##定义会话保持时间,S为单位
    49. protocol TCP ##指定转发协议
    50. real_server 192.168.188.228 80 { ##配置后端真实服务器
    51. weight 1
    52. TCP_CHECK { ##设置健康检查方式
    53. connect_timeout 8
    54. nb_get_retry 3
    55. delay_before_retry 3
    56. connect_port 80
    57. }
    58. }
    59. }

    4.  后端多台服务器做acl限制,这里通过shell脚本来对后端服务器做acl限制

    1. [root@centosnode3 ~]# vim /etc/init.d/lvs_rs
    2. #!/bin/bash
    3. # Startup script handle the initialisation of LVS
    4. # chkconfig: - 28 72
    5. # description: Initialise the Linux Virtual Server for DR
    6. ### BEGIN INIT INFO # Provides: ipvsadm
    7. # Required-Start: $local_fs $network $named
    8. # Required-Stop: $local_fs $remote_fs $network
    9. # Short-Description: Initialise the Linux Virtual Server
    10. # Description: The Linux Virtual Server is a highly scalable and highly
    11. # available server built on a cluster of real servers, with the load
    12. # balancer running on Linux.
    13. # description: start LVS of DR-RIP
    14. LOCK=/var/lock/ipvsadm.lock
    15. VIP=192.168.188.100
    16. . /etc/rc.d/init.d/functions
    17. start() {
    18. PID=`ifconfig | grep lo:10 | wc -l`
    19. if [ $PID -ne 0 ];
    20. then
    21. echo "The LVS-DR-RIP Server is already running !"
    22. else
    23. /sbin/ifconfig lo:10 $VIP netmask 255.255.255.255 broadcast $VIP up
    24. /sbin/route add -host $VIP dev lo:10
    25. echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    26. echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    27. echo "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignore
    28. echo "2" >/proc/sys/net/ipv4/conf/eth0/arp_announce
    29. echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    30. echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    31. /bin/touch $LOCK
    32. echo "starting LVS-DR-RIP server is ok !"
    33. fi
    34. }
    35. stop() {
    36. /sbin/route del -host $VIP dev lo:10
    37. /sbin/ifconfig lo:10 down >/dev/null
    38. echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    39. echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
    40. echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_ignore
    41. echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_announce
    42. echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
    43. echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
    44. rm -rf $LOCK
    45. echo "stopping LVS-DR-RIP server is ok !"
    46. }
    47. status() {
    48. if [ -e $LOCK ];
    49. then
    50. echo "The LVS-DR-RIP Server is already running !"
    51. else
    52. echo "The LVS-DR-RIP Server is not running !"
    53. fi
    54. }
    55. case "$1" in
    56. start)
    57. start
    58. ;;
    59. stop)
    60. stop
    61. ;;
    62. restart)
    63. stop
    64. start
    65. ;;
    66. status)
    67. status
    68. ;;
    69. *)
    70. echo "Usage: $1 {start|stop|restart|status}"
    71. exit 1
    72. esac
    73. exit 0

    5.  启动多台后端服务器" /etc/init.d/lvs_rs "脚本:

    1. ##赋予脚本执行权限
    2. [root@centosnode3 ~]# chmod +x /etc/init.d/lvs_rs
    3. ##启动脚本
    4. [root@centosnode3 ~]# /etc/init.d/lvs_rs start

    6.  启动centosnode1和centosnode2的lvs和keepalived服务:

    1. ##启动lvs
    2. [root@centosnode1 ~]# systemctl start ipvsadm.service
    3. ##启动keepalived
    4. [root@centosnode1 ~]# systemctl start keepalived.service

    7.  开启后端两台web服务器,并设置web页面:

    1. ##设置web1服务器页面
    2. [root@centosnode3 ~]# echo "this is page ip : 192.168.188.227" > /var/www/html/index.html
    3. ##启动web1的httpd服务
    4. [root@centosnode3 ~]# systemctl start httpd
    5. ##设置web2服务器页面
    6. [root@centosnode3 ~]# echo "this is page ip : 192.168.188.228" > /var/www/html/index.html
    7. ##启动web2的httpd服务
    8. [root@centosnode3 ~]# systemctl start httpd

    8.  查看LVS状态:

    1. [root@centosnode1 ~]# 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.188.100:80 rr persistent 50
    6. -> 192.168.188.227:80 Route 1 0 0
    7. -> 192.168.188.228:80 Route 1 0 0

    9.  测试LVS负载均衡是否正常:

    1. [root@centosnode5 ~]# curl 192.168.188.100
    2. this is page ip : 192.168.188.227
    3. [root@centosnode5 ~]# curl 192.168.188.100
    4. this is page ip : 192.168.188.228

    10.  测试LVS健康检查:

    1. ##监控lvs状态
    2. [root@centosnode1 ~]# watch ipvsadm -ln

     当前两台后端服务器都正常运行,使其中一台后端服务器的httpd服务关闭,模拟服务器故障,观察LVS健康检查是否正常。

    [root@centosnode3 ~]# systemctl stop httpd

     11.  测试keepalived故障转移是否正常,是否会发生ip飘移:

    由此可见当前vip地址在centosnode1主机上,然后模拟服务器故障,停掉keepalived服务。

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

     

    再次查看vip,发现vip飘移到了centosnode2主机上。可以将centosnode1主机的keepalived服务再次开启,会发现vip又会飘移到了centosnode1主机上,因为keepalived默认配置抢占主服务器,优先级高的服务器,将抢占到vip。

     补充:1.  real_server中健康检查的方式:

            1>.  TCP_CHECK:工作在第4层,keepalived向后端服务器发起一个tcp连接请求,如果后端服务器没有响应或超时,那么这个后端将从服务器池中移除。

            2>.  HTTP_GET:工作在第5层,向指定的URL执行http请求,将得到的结果用md5加密并与指定的md5值比较看是否匹配,不匹配则从服务器池中移除;此外还可以指定http返回码来判断检测是否成功。HTTP_GET可以指定多个URL用于检测,这个一台服务器有多个虚拟主机的情况下比较好用。

            3>.  SSL_GET:跟上面的HTTP_GET相似,不同的只是用SSL连。

            4>.  MISC_CHECK:用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内。脚本的返回值需为:

                    0) 检测成功。

                    1) 检测失败,将从服务器池中移除。
                    2-255 )检测成功;如果有设置 misc_dynamic ,权重自动调整为 退出码 -2 ,如退出码为 200 ,权重自动调整为198=200-2
            5>.  SMTP_CHECK :用来检测邮件服务的 smtp。
    2.  健康检查的相关选项:
    1. delay_loop 隔多长时间做一次健康检测,单位为秒
    2. connect_timeout 连接超时时间,单位为秒
    3. nb_get_retry 检测失败后的重试次数,如果达到重试次数仍然失败,将后端从服务器池中移除。
    4. delay_before_retry 失败重试的间隔时间,单位为秒

    3.  健康检查的相关配置:

            1>.  以上示例就是TCP健康检查。

            2>.  HTTP_GET|SSL_GET:

    1. HTTP_GET | SSL_GET
    2. {
    3. url {
    4. path / #HTTP/SSL 检查的url 可以是多个
    5. 方式一:digest <STRING> #HTTP/SSL 检查后的摘要信息 用工具genhash生成
    6. 方式二:status_code 200 #HTTP/SSL 检查返回的状态码
    7. }
    8. connect_port 80 #连接端口
    9. bindto <IPADD>
    10. connect_timeout 3 #连接超时时间
    11. nb_get_retry 3 #重连次数
    12. delay_before_retry 2 #连接间隔时间
    13. }

    其中digest的摘要需要通过genhash工具得到:genhash工具使keepalived安装包中自带的。

    1. ##查看genhash工具版本
    2. [root@centosnode1 ~]# ./genhash -h
    3. ##生成检查后的摘要信息
    4. 命令格式:genhash -s要生成摘要的后端服务器地址 -p 要生成摘要的端口 -u 检查的url
    5. [root@centosnode1 ~]# genhash -s192.168.188.227 -p 80 -u /index.html
    6. MD5SUM = ab9d2b22ae01e991a259a08feb1f1629
    7. [root@centosnode1 ~]# genhash -s192.168.188.228 -p 80 -u /index.html
    8. MD5SUM = 639870c3471db8868e37dcf972ea0df3

    示例:

    1. virtual_server 192.168.188.100 80 {
    2. delay_loop 6
    3. lb_algo rr
    4. lb_kind DR
    5. persistence_timeout 50
    6. protocol TCP
    7. real_server 192.168.188.227 80 {
    8. weight 1
    9. HTTP_GET {
    10. url {
    11. path /index.html
    12. digest ab9d2b22ae01e991a259a08feb1f1629
    13. }
    14. connect_timeout 8
    15. nb_get_retry 3
    16. delay_before_retry 3
    17. connect_port 80
    18. }
    19. }
    20. }
    21. virtual_server 192.168.188.100 80 {
    22. delay_loop 6
    23. lb_algo rr
    24. lb_kind DR
    25. persistence_timeout 50
    26. protocol TCP
    27. real_server 192.168.188.228 80 {
    28. weight 1
    29. HTTP_GET {
    30. url {
    31. path /index.html
    32. digest 639870c3471db8868e37dcf972ea0df3
    33. }
    34. connect_timeout 8
    35. nb_get_retry 3
    36. delay_before_retry 3
    37. connect_port 80
    38. }
    39. }
    40. }

            3>.  MISC:

    1. MISC_CHECK {
    2. misc_path <STRING>|<QUOTED-STRING> #外部程序或者脚本绝对路径
    3. misc_timeout <INT> #执行脚本的超时时间
    4. misc_dynamic #如果设置了misc_dynamic,healthchecker程序的退出状态码会用来动态调整服务器的 权重(weight).
    5. #返回0:健康检查OK,权重不被修改
    6. #返回1:健康检查失败,权重设为0
    7. #返回2-255:健康检查OK,权重设置为:退出状态码-2,比如返回255,那么weight=255-2=253 }

  • 相关阅读:
    MAUI模板项目闪退问题
    Spring Boot 资源索引
    HTTP协议状态及报文组成 - 一文通读
    springboot+nacos使用
    Compose中的FlowLayout
    JavaPhaseOne
    C++一些细碎知识点(持续更新)
    Maven 脚本批量导入本地jar包
    Windows Server 2008R2 开机自动登录 自启程序无管理员权限的解决
    通过安装chrome插件解决Sorry, your browser does not support Java的问题
  • 原文地址:https://blog.csdn.net/NancyLCL/article/details/126752149