KeepAlived高可用集群

  • keepalived用于实现高可用集群
  • 它的工作原理就是VRRP(虚拟冗余路由协议)

    配置高可用的web集群

    1.png

  • 环境说明:

    • web1:eth0->192.168.88.100/24
    • web2:eth0->192.168.88.200/24
  • 配置keepalived ```shell

    在两台web服务器上安装keepalived

    [root@web1 ~]# yum install -y keepalived httpd [root@web2 ~]# yum install -y keepalived httpd

修改配置文件

[root@web1 ~]# vim /etc/keepalived/keepalived.conf 12 router_id web1 # 设置本机在集群中的唯一识别符 13 vrrp_iptables # 自动配置iptables放行规则 … … 20 vrrp_instance VI_1 { 21 state MASTER # 状态,主为MASTER,备为BACKUP 22 interface eth0 # 网卡 23 virtual_router_id 51 # 虚拟路由器地址 24 priority 100 # 优先级 25 advert_int 1 # 发送心跳消息的间隔 26 authentication { 27 auth_type PASS # 认证类型为共享密码 28 auth_pass 1111 # 集群中的机器密码相同,才能成为集群 29 }
30 virtual_ipaddress { 31 192.168.88.80/24 # VIP地址 32 }
33 }

删除下面所有行

打开一个新的终端监控日志,新日志将出持续显示在屏幕上。退出按ctrl+c

[root@web1 ~]# tail -f /var/log/messages | grep -i keepalived

在前一个终端启动服务

[root@web1 ~]# systemctl start keepalived

等几秒服务完全启动后,可以查看到vip

[root@web1 ~]# ip a s eth0 # eth0将会增加额外的4.80地址

配置web2

[root@web1 ~]# scp /etc/keepalived/keepalived.conf 192.168.88.200:/etc/keepalived/ [root@web2 ~]# vim /etc/keepalived/keepalived.conf 12 router_id web2 # 改id 13 vrrp_iptables … … 20 vrrp_instance VI_1 { 21 state BACKUP # 改状态 22 interface eth0 23 virtual_router_id 51 24 priority 80 # 改优先级 25 advert_int 1 26 authentication { 27 auth_type PASS 28 auth_pass 1111 29 } 30 virtual_ipaddress { 31 192.168.88.80/24 32 } 33 }

启动服务

[root@web2 ~]# systemctl start keepalived

查看地址,eth0不会出现vip

[root@web2 ~]# ip a s eth0

测试,现在访问4.80,看到是web1上的内容

[root@client1 ~]# curl http://192.168.88.80/ 192.168.99.100

在web2上监控日志

[root@web2 ~]# tail -f /var/log/messages | grep -i keepalived

关闭web1上的keepalived,观察web2的日志输出

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

测试,现在访问4.80,看到是web2上的内容

[root@client1 ~]# curl http://192.168.88.80/ apache web server2

在web2上查看vip,可以查看到vip 192.168.88.80

[root@web2 ~]# ip a s eth0

  1. <a name="XA0RS"></a>
  2. # 配置高可用、负载均衡的web集群
  3. ![2.png](https://cdn.nlark.com/yuque/0/2022/png/2964434/1655891816397-0230701e-9169-4ebb-b9c4-805752767154.png#clientId=u44d1cec0-2dab-4&crop=0&crop=0&crop=1&crop=1&from=ui&id=u2e33941d&name=2.png&originHeight=485&originWidth=539&originalType=binary&ratio=1&rotation=0&showTitle=false&size=16920&status=done&style=none&taskId=ub9c9264a-bd65-4308-87e2-30d4af7006f&title=)
  4. - 环境说明:LVS-DR模式
  5. - client1:eth0->192.168.88.10
  6. - lvs1:eth0->192.168.88.5
  7. - lvs2:eth0->192.168.88.6
  8. - web1:eth0->192.168.88.100
  9. - web2:eth0->192.168.88.200
  10. - 环境准备
  11. ```shell
  12. # 关闭2台web服务器上的keepalived
  13. [root@web1 ~]# systemctl stop keepalived.service
  14. [root@web2 ~]# systemctl stop keepalived.service
  15. [root@web1 ~]# yum remove -y keepalived
  16. [root@web2 ~]# yum remove -y keepalived
  17. # 创建新虚拟机lvs2
  18. [root@zzgrhel8 ~]# clone-vm7
  19. Enter VM number: 5 # 虚拟机编号,
  20. [root@zzgrhel8 ~]# virsh start tedu_node05 # 启动虚机
  21. [root@zzgrhel8 ~]# virsh console tedu_node05 # 连接虚机控制台
  22. localhost login: root
  23. Password: 123456
  24. # 将以下内容粘贴到虚拟机,进行初始化
  25. hostnamectl set-hostname lvs2
  26. nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.88.6/24
  27. nmcli connection down eth0
  28. nmcli connection up eth0
  29. echo a | passwd --stdin root
  30. # 退出
  31. [root@localhost ~]# exit
  32. # 按ctrl + ]退回到真机
  33. # 连接测试
  34. [root@zzgrhel8 ~]# ssh 192.168.88.6

配置高可用、负载均衡

  1. 在2台web服务器的lo上配置vip
  2. 在2台web服务器上配置内核参数
  3. 删除lvs1上的eth0:0。因为vip将由keepalived接管

    1. [root@lvs1 ~]# ifdown eth0:0
    2. [root@lvs1 ~]# rm -f /etc/sysconfig/network-scripts/ifcfg-eth0:0
  4. 删除lvs1上的lvs规则。因为lvs规则将由keepalived创建

    1. [root@lvs1 ~]# ipvsadm -Ln # 查看规则
    2. [root@lvs1 ~]# ipvsadm -D -t 192.168.88.15:80
  5. 在lvs上配置keepalived ```shell [root@lvs1 ~]# yum install -y ipvsadm keepalived [root@lvs2 ~]# yum install -y ipvsadm keepalived

[root@lvs1 ~]# vim /etc/keepalived/keepalived.conf 12 router_id lvs1 # 为本机取一个唯一的id 13 vrrp_iptables # 自动开启iptables放行规则 … … 20 vrrp_instance VI_1 { 21 state MASTER 22 interface eth0 23 virtual_router_id 51 24 priority 100 25 advert_int 1 26 authentication { 27 auth_type PASS 28 auth_pass 1111 29 }
30 virtual_ipaddress { 31 192.168.88.15 # vip地址,与web服务器的vip一致 32 }
33 }

以下为keepalived配置lvs的规则

35 virtual_server 192.168.88.15 80 { # 声明虚拟服务器地址 36 delay_loop 6 # 健康检查延迟6秒开始 37 lb_algo wrr # 调度算法为wrr 38 lb_kind DR # 工作模式为DR 39 persistence_timeout 50 # 50秒内相同客户端调度到相同服务器 40 protocol TCP # 协议是TCP 41 42 real_server 192.168.88.100 80 { # 声明真实服务器 43 weight 1 # 权重 44 TCP_CHECK { # 通过TCP协议对真实服务器做健康检查 45 connect_timeout 3 # 连接超时时间为3秒 46 nb_get_retry 3 # 3次访问失败则认为真实服务器故障 47 delay_before_retry 3 # 两次检查时间的间隔3秒 48 } 49 } 50 real_server 192.168.88.200 80 { 51 weight 2 52 TCP_CHECK { 53 connect_timeout 3 54 nb_get_retry 3 55 delay_before_retry 3 56 } 57 } 58 }

以下部分删除

启动keepalived服务

[root@lvs1 ~]# systemctl start keepalived

验证

[root@lvs1 ~]# ip a s eth0 # 可以查看到vip [root@lvs1 ~]# ipvsadm -Ln # 出现规则

客户端连接测试

[root@client1 ~]# for i in {1..6}; do curl http://192.168.88.15/; done apache web server2 apache web server2 apache web server2 apache web server2 apache web server2 apache web server2

为了效率相同的客户端在50秒内分发给同一台服务器。为了使用同一个客户端可以看到轮询效果,可以注释配置文件中相应的行后,重启keepavlied。

配置LVS2

[root@lvs1 ~]# scp /etc/keepalived/keepalived.conf 192.168.88.6:/etc/keepalived/ [root@lvs2 ~]# vim /etc/keepalived/keepalived.conf 12 router_id lvs2 21 state BACKUP 24 priority 80 [root@lvs2 ~]# systemctl start keepalived [root@lvs2 ~]# ipvsadm -Ln # 出现规则

  1. 6. 验证
  2. ```shell
  3. # 1. 验证真实服务器健康检查
  4. [root@web1 ~]# systemctl stop httpd
  5. [root@lvs1 ~]# ipvsadm -Ln # web1在规则中消失
  6. [root@lvs2 ~]# ipvsadm -Ln
  7. [root@web1 ~]# systemctl start httpd
  8. [root@lvs1 ~]# ipvsadm -Ln # web1重新出现在规则中
  9. [root@lvs2 ~]# ipvsadm -Ln
  10. # 2. 验证lvs的高可用性
  11. [root@lvs1 ~]# shutdown -h now # 关机
  12. [root@lvs2 ~]# ip a s eth0 # 可以查看到vip
  13. # 客户端访问vip依然可用
  14. [root@client1 ~]# for i in {1..6}; do curl http://192.168.88.15/; done
  15. 192.168.99.100
  16. apache web server2
  17. apache web server2
  18. 192.168.99.100
  19. apache web server2
  20. apache web server2

HAProxy

  • 也是一款实现负载均衡的调度器
  • 适用于负载特别大的web站点
  • HAProxy的工作模式:

    • mode http:只适用于web服务
    • mode tcp:适用于各种服务
    • mode health:仅做健康检查,很少使用

      配置haproxy

      image-20220611102902015.png
  • 环境准备:

    • client1:eth0 -> 192.168.88.10
    • HAProxy:eth0 -> 192.168.88.5
    • web1:eth0 -> 192.168.88.100
    • web2:eth0 -> 192.168.88.200
  • 初始化配置 ```shell

    关闭192.168.88.6

    [root@lvs2 ~]# shutdown -h now

清理192.168.88.5

[root@lvs1 ~]# yum remove -y ipvsadm keepalived [root@lvs1 ~]# hostnamectl set-hostname haproxy1

web服务器,不需要配置vip,不需要改内核参数。但是存在对haproxy也没有影响。

  1. - 配置haproxy
  2. ```shell
  3. # 装包
  4. [root@haproxy1 ~]# yum install -y haproxy
  5. [root@haproxy1 ~]# vim /etc/haproxy/haproxy.cfg
  6. # 配置文件中,global是全局配置;default是缺省配置,如果后续有和default相同的配置,default配置将会被覆盖。
  7. # 配置文件中,frontend描述haproxy怎么和用户交互;backend描述haproxy怎么和后台应用服务器交互。这两个选项,一般不单独使用,而是合并到一起,名为listen。
  8. # 将61行之后全部删除,写入以下内容
  9. 61 listen myweb 0.0.0.0:80 # 定义本机监听地址
  10. 62 balance roundrobin # 调度算法为轮询
  11. # 对web服务器做健康检查,2秒检查一次,如果连续2次检查成功,认为服务器是健康的,如果连续5次检查失败,认为服务器坏了
  12. 63 server web1 192.168.88.100 check inter 2000 rise 2 fall 5
  13. 64 server web2 192.168.88.200 check inter 2000 rise 2 fall 5
  14. 65
  15. 66 listen stats 0.0.0.0:1080 # 定义监控地址
  16. 67 stats refresh 30s # 设置监控页面自动刷新时间为30秒
  17. 68 stats uri /stats # 定义监控地址是/stats
  18. 69 stats auth admin:admin # 监控页面的用户名和密码都是admin
  19. # 启服务
  20. [root@haproxy1 ~]# systemctl start haproxy.service
  21. # 使用firefox访问监控地址 http://192.168.88.5:1080/stats
  22. # 客户端访问测试
  23. [root@client1 ~]# for i in {1..6}; do curl http://192.168.88.5/; done
  24. 192.168.99.100
  25. apache web server2
  26. 192.168.99.100
  27. apache web server2
  28. 192.168.99.100
  29. apache web server2

监控地址 http://192.168.88.5:1080/stats如下:
image.png

  • Queue:队列长度。Cur当前队列长度,Max最大队列长度,Limit限制长度
  • Session rate:会话率,每秒钟的会话数
  • Sessions:会话数
  • Bytes:字节数。In收到的字节数,Out发出的字节数
  • Denied:拒绝。Req请求,Resp响应
  • Errors:错误
  • Warning:警告
  • Status:状态
  • LastChk:上一次检查。L4OK,第四层tcp检查通过
  • Wght:权重

负载均衡调度器比较:https://blog.51cto.com/u_13538361/3268760

  • nginx:可以工作在第4层和第7层。可以根据url进行负载均衡。正则表达式支持的更广泛。
  • lvs:效率最高。工作在第4层。
  • haproxy:可以工作在第4层和第7层。可以根据url进行负载均衡。支持有限的正则表达式。

综上所述,LVS都解决不了负载均衡,请使用F5硬件解决负载均衡。