LVS架构中,不管是NAT模式还是DR模式,当后端的RS宕掉时,调度器依然会把请求转发到宕掉的RS上,这样的结果并不是我们想要的。其实,keepalived就可以解决该问题,它不仅仅有高可用的功能,还有负载均衡的功能。在调度器上只要安装了keepalived,就不用再安装ipvsadm了,也不用去编写LVS相关的脚本了,也就是说keepalived已经嵌人了LVS功能。完整的keepalived+LVS架构需要有两台调度器实现高可用,提供调度服务的只需要一台,另外一台作为备用。

节点规划 服务器名 IP VIP
调度器 keepalived 192.168.200.130 192.168.200.110
真实服务器1 rs1 192.168.200.131 192.168.200.110
真实服务器2 rs2 192.168.200.132 192.168.200.110

1.安装keepalived

如未安装keepalived,则需要先安装keepalived

  1. # yum install -y keepalived

接着编辑keepalived的配置文件:

  1. # > /etc/keepalived/keepalived.conf //清空配置文件
  2. # vim /etc/keepalived/keepalived.conf //添加内容如下
  3. vrrp_instance VI_1 {
  4. state MASTER
  5. interface ens33
  6. virtual_router_id 51
  7. priority 100
  8. advert_int 1
  9. authentication {
  10. auth_type PASS
  11. auth_pass 1111
  12. }
  13. virtual_ipaddress {
  14. 192.168.200.110
  15. }
  16. }
  17. virtual_server 192.168.200.110 80 { #VIP
  18. delay_loop 10 #每隔10秒查询realserver状态
  19. lb_algo wlc #lvs算法
  20. lb_kind DR #DR模式
  21. persistence_timeout 60 #(同一IP的连接60秒内被分配到同一台realserver)
  22. protocol TCP #用TCP协议检查realserver状态
  23. real_server 192.168.200.131 80 { #真实服务器ip
  24. weight 100 #权重
  25. TCP_CHECK {
  26. connect_timeout 10 # 10秒无响应超时(连接超时时间)
  27. nb_get_retry 3 #失败重试次数
  28. delay_before_retry 3 #失败重试的间隔时间
  29. connect_port 80 #连接的后端端口
  30. }
  31. }
  32. real_server 192.168.200.132 80 {
  33. weight 100
  34. TCP_CHECK {
  35. connect_timeout 10
  36. nb_get_retry 3
  37. delay_before_retry 3
  38. connect_port 80
  39. }
  40. }
  41. }

2.清空LVS脚本

  1. # ipvsadm -C //把之前的ipvsadm规则清空
  2. # systemctl restart network //可以把之前设置的VIP删除掉

3.为rs1、rs2运行lvs_rs.sh脚本

因为我们在keepalived的配置文件中定义的LVS模式为DR模式,所以需要运行lvs_rs.sh

  1. # vim /usr/local/sbin/lvs_rs.sh //两台rs上添加的内容一致
  2. #/bin/bash
  3. vip=192.168.200.110
  4. #把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
  5. ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
  6. route add -host $vip lo:0
  7. #以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
  8. #参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
  9. echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
  10. echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
  11. echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
  12. echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
  13. 分别在三台机器上执行各自脚本;
  14. [root@dir ~]# bash /usr/local/sbin/lvs_dr.sh
  15. [root@rs1 ~]# bash /usr/local/sbin/lvs_rs.sh
  16. [root@rs2 ~]# bash /usr/local/sbin/lvs_rs.sh

4.在192.168.200.130上启动keepalived服务

  1. # systemctl start keepalived
  2. # ps aux |grep keepalived // 检查有无keepalived进程
  3. root 12184 0.0 0.0 118684 1344 ? Ss 03:00 0:00 /usr/sbin/keepalived -D
  4. root 12185 0.0 0.0 129616 3308 ? S 03:00 0:00 /usr/sbin/keepalived -D
  5. root 12186 0.0 0.0 129484 2592 ? S 03:00 0:00 /usr/sbin/keepalived -D
  6. root 12188 0.0 0.0 112704 976 pts/0 S+ 03:00 0:00 grep --color=auto keepalived

检验是否成功的方法也很简单,需要在浏览器直接访问vip192.168.200.110,然后故意把其中一台 rs的Nginx服务关掉,比如说关闭131的;然后再刷新浏览器看结果,刷新的时候需要使用组合键(Ctrl+F5)强制刷新浏览器,这样就不会有缓存数据了。同时,也可以在调度器(130)上执行命令ipvsadm -ln查看连接数:

  1. # $ ps -ef | grep nginx //查看nginx主进程
  2. #kill

对应的rs只有一台131,然后再把132的Nginx服务启动,再来查看:

  1. # 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.200.110:80 wlc persistent 60
  6. -> 192.168.200.131:80 Route 100 2 0
  7. -> 192.168.200.132:80 Route 100 0 4