安装部署

环境

服务器 ip 备注
主lvs调度器(MASTER) 192.168.1.110 vip地址:192.168.1.120,使用keepalived配置
备lvs调度器(MASTER) 192.168.1.111 vip地址:192.168.1.120,使用keepalived配置
http服务器RS1 192.168.1.101 部署nginx测试
http服务器RS2 192.168.1.103 部署nginx测试
  1. 部署LB和RS的lvs,部署keepalived,参考《keepalived原理与部署》
  2. 配置LVS-LB-MASK的keepalived.conf配置文件,注意此时LVS-LB不需要手动配置VIP,keepalived会自动配置
global_defs {
  router_id LVS_DEVEL    # 标识当前节点,主从节点的设置可相同,也可不同
}
vrrp_instance VI_1 {    # 定义虚拟路由实例,不同实例ID不同
  state MASTER    # 定义服务器在keepalived中的角色主服务器,主LVS是MASTER,从的BACKUP
  interface eth0    # 定义LVS监控的网络接口eth0
  virtual_router_id 51    # 定义虚拟路由ID,同一个实例的主从一样
  priority 100    # 定义在虚拟路由器组的权限,越大越高
  advert_int 1    # MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
  authentication {    # 定义认证方式密码,主从必须一样
    auth_type PASS
    auth_pass 1111
  }
  virtual_ipaddress { # 指定虚拟IP地址
    192.168.1.120
  }
}
virtual_server 192.168.1.120 80 {    # 定义虚拟服务,需指定IP地址和端口,空格隔开
  delay_loop 6    # 定义RS运行情况监测时间间隔
  lb_algo rr    # 定义负载调度算法,这里设置为rr,即轮询算法
  lb_kind DR  # LVS实现负载均衡的机制,可以有NAT、TUN和DR三个模式
  nat_mask 255.255.255.0    # 定义虚拟服务的mask
  persistence_timeout 50    # 定义会话保持时间,单位是秒
  protocol TCP    # 转发协议类型,有tcp和udp两种
  sorry_server 127.0.0.1 80    # web服务器全部失败,vip指向本机80端口
  real_server 192.168.1.101 80 {    # 定义真实服务器IP地址和端口
    weight 1    # 定义RS的权重
    TCP_CHECK {    # RS server健康检查部分
      connect_timeout 10    # 定义超出10s连接超时
      nb_get_retry 3    # 定义重试次数
      delay_before_retry 3    # 定义重试时间间隔
      connect_port 80    # 定义健康检查端口
    }
  }
  real_server 192.168.1.103 80 {
    weight 1
    TCP_CHECK {
      connect_timeout 10 
      nb_get_retry 3 
      delay_before_retry 3
      connect_port 80
    }
  }
}
  1. 配置LVS-DR-BACKUP的keepalived.conf配置文件
global_defs {
  router_id LVS_DEVEL    # 标识当前节点,主从节点的设置可相同,也可不同
}
vrrp_instance VI_1 {     # 定义虚拟路由实例,不同实例ID不同
  state BACKUP    # 定义服务器在keepalived中的角色主服务器,主LVS是MASTER,从的BACKUP
  interface eth0    # 定义LVS监控的网络接口eth0
  virtual_router_id 51    # 定义虚拟路由ID,同一个实例的主从一样
  priority 50    # 定义在虚拟路由器组的权限,越大越高
  advert_int 1    # MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
  authentication {    # 定义认证方式密码,主从必须一样
    auth_type PASS
    auth_pass 1111
  }
  virtual_ipaddress { # 指定虚拟IP地址
    192.168.1.120
  }
}
virtual_server 192.168.1.120 80 {    # 定义虚拟服务,需指定IP地址和端口,空格隔开
  delay_loop 6    # 定义RS运行情况监测时间间隔
  lb_algo rr    # 定义负载调度算法,这里设置为rr,即轮询算法
  lb_kind DR  # LVS实现负载均衡的机制,可以有NAT、TUN和DR三个模式
  nat_mask 255.255.255.0    # 定义虚拟服务的mask
  persistence_timeout 50    # 定义会话保持时间,单位是秒
  protocol TCP    # 转发协议类型,有tcp和udp两种
  sorry_server 127.0.0.1 80    # web服务器全部失败,vip指向本机80端口
  real_server 192.168.1.101 80 {    # 定义真实服务器IP地址和端口
    weight 1    # 定义RS的权重
    TCP_CHECK {    # RS server健康检查部分
      connect_timeout 10    # 定义超出10s连接超时
      nb_get_retry 3    # 定义重试次数
      delay_before_retry 3    # 定义重试时间间隔
      connect_port 80    # 定义健康检查端口
    }
  }
  real_server 192.168.1.103 80 {
    weight 1
    TCP_CHECK {
      connect_timeout 10
      nb_get_retry 3
      delay_before_retry 3
      connect_port 80
    }
  }
}

说明:这里主LVS-DR-MASTER和LVS-DR-BACKUP之间的配置的差别就只有红色部分:HA的角色(MASTER,BACKUP)和优先级不同,还有router_id。

  1. 启动keepalived,注意/var/log/message的日志输出
keepalived -D -f ~/etc/keepalived/keepalived.conf
  1. 测试
  2. 模拟其中一台RS节点无法提供http服务时keepalive的监控和lvs和情况 关闭RS1节点(192.168.1.101)服务:killall nginx或者init 0关机 查看LB keepalive日志,输出如下
May 22 11:16:22 qun Keepalived_healthcheckers[24168]: TCP connection to [192.168.1.101]:80 failed.
May 22 11:16:25 qun Keepalived_healthcheckers[24168]: TCP connection to [192.168.1.101]:80 failed.
May 22 11:16:25 qun Keepalived_healthcheckers[24168]: Check on service [192.168.1.101]:80 failed after 1 retry.
May 22 11:16:25 qun Keepalived_healthcheckers[24168]: Removing service [192.168.1.101]:80 from VS [192.168.1.120]:80

keepalived在检测到其实一个RS节点(192.168.1.101)故障时自动从LVS移除故障节点 LB通过ipvsadm -L -n,输出如下

IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.120:80 rr persistent 50
  -> 192.168.1.103:80             Tunnel  1      0          122

此时192.168.1.101故障节点已经被移除,只有192.168.1.103节点依然保持服务 再次启动RS1节点(192.168.1.101)服务时,keepalived检查到节点恢复正常,自动添加到lvs恢复正常服务

2.模块其中一台LB节点无法正常工作时keepalive的监控和lvs和情况 关闭LB主服务器(192.168.1.110)服务:killall keepalived或者init 0关机 LB从服务器(192.168.1.111)keepalived日志输出如下

May 22 11:34:13 quns Keepalived_vrrp[10227]: VRRP_Instance(VI_1) Transition to MASTER STATE
May 22 11:34:14 quns Keepalived_vrrp[10227]: VRRP_Instance(VI_1) Entering MASTER STATE
May 22 11:34:14 quns Keepalived_vrrp[10227]: VRRP_Instance(VI_1) setting protocol VIPs.
May 22 11:34:14 quns Keepalived_healthcheckers[10226]: Netlink reflector reports IP 192.168.1.120 added
May 22 11:34:14 quns Keepalived_vrrp[10227]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.120
May 22 11:34:19 quns Keepalived_vrrp[10227]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.120

ip addr输出如下

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
      valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:da:71:51 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.111/24 brd 192.168.1.255 scope global eth0
    inet 192.168.1.120/32 scope global eth0
    inet6 fe80::a00:27ff:feda:7151/64 scope link
      valid_lft forever preferred_lft forever

此时LB从服务器在检测到LB主服务器挂掉时会自动绑定vip,将vip漂移到当前服务器 再次启动LB主服务器服务时,keepalived vrrp协议又会经过协商取回vip的管理权,将vip重新漂移回LB主服务器

参考: