再次说明

  • HaProxy ,由于自身性能很好,只要运行一个即可
  • 另外,作为负载均衡组件,只需要对外暴露一个虚拟 ip 即可,客户端只要访问这个 ip,不用关心虚拟 ip 代表的服务物理上是否是同一个
  • Keepalived 就是用来配置

前提条件

  • 虚拟 ip 仅支持局域网,不可以在公网设置虚拟 ip
  • linux 系统才能设置虚拟 ip
  • 公司网络和移动热点网络环境下,都不能设置虚拟 ip

原理

  • keepalived 基于 VRRP 协议,可以预防单点故障
  • VRRP 协议将多个服务节点组成一个网络,里面有一个 Master 和 若干个 Backup 节点
    • Master 会发送 VRRP 广播,如果 Backup 节点收不到广播,就认为 Master 节点宕机了
      • 广播地址 224.0.0.18
    • 此时 Backup 节点会选举处一个新的 Master 节点

配置防护墙

  • 需要 VRRP
    • 如果关闭了防火墙,自然不用设置

      firewall-cmd —direct —permanent —add-rule ipv4 filter INPUT 0 —protocol vrrp -j ACCEPT firewall-cmd —reload


下载

yum install -y keepalived


配置

配置 虚拟ip

mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak vim /etc/keepalived/keepalived.conf

  1. g1obal_defs{
  2. #路由id:当前安装keepalived的节点主机标识符,保证全局唯一
  3. router_id keep_171
  4. }
  5. vrrp_instance VI_1 {
  6. state MASTER
  7. interface enp0s3
  8. virtual_router_id 51
  9. priority 100
  10. # nopreempt
  11. advert_int 1
  12. authentication {
  13. auth_type PASS
  14. auth_pass 123456
  15. }
  16. virtual_ipaddress {
  17. 192.168.1.220
  18. }
  19. }

配置说明:

  • vrrp_instance VI_1 定义虚拟路由, VI_1 为虚拟路由的标示符,自定义名称
  • state MASTER:定义节点角色为master。
    • 集群内允许有多个master,当存在多个master时,master之间就需要争抢主设备。只有激活的master下线才能继续竞选获取到主设备
    • BACKUP 是否争抢主设备交由 priority 来控制。
      • Master 会发送 VRRP 广播,如果 Backup 节点收不到广播,就认为 Master 节点宕机了,此时 Backup 节点会选举处一个新的 Master 节点
      • 如果有默认主设备和备用设备,可以都设置为 BACKUP
  • interface ens32:定义可用于外部通信的网卡名称,网卡名称可以通过 ip addr 命令查看
    • 如果是 docker,要使用 docker 中的网卡,**docker_gwbridge**
  • virtual_router_id 51:定义虚拟路由的id,取值在0-255
    • 每个节点的值需要唯一,也就是不能配置成一样的
    • 但是主备可以一致
  • priority 100:定义权重,权重越高就越优先获取到VIP,MASTER 要比 BACKUP
  • nopreempt : 默认 主设备 priority 值大的 Keepalived 节 点 配置一定要加上,否则非抢占也不起作用
  • advert_int 1:定义检 MASTER 和 BACKUP 节点间同步检查的时间间隔,单位s,主备必须一致
  • authentication:设置验证信息,各个节点必须一致;主备必须相同的密码才能正常通信
    • auth_type PASS:定义认证类型为密码
    • auth_pass 123456:定义具体的密码
  • virtual_ipaddress:定义虚拟IP(VIP),可以定义多个,每行一个。需要为同一网段下的IP,并且每个节点需要一致

**

配置 haproxy 检查脚本

  • 如果需要的话,配置个 Haproxy 状态检测

    1. vrrp_script chk_haproxy {
    2. script "/etc/keepalived/haproxy_check.sh"
    3. # 几秒运行一次脚本
    4. interval 2
    5. # 如果脚本运行失败,权重+2
    6. weight 2
    7. }
  • 编写 Haproxy 状态 检测 脚 本 /etc/keepalived haproxy _check.sh

    • 脚本要求:如果 haproxy 停止运行,尝试启动,如果无法启动则杀死本机 的 keepalived 进程, keepalied 会将虚拟 ip 绑定到 BACKUP 机器上 。

      mkdir p /usr/local/keepalived/log

      vim /etc/keepalived/ haproxy _check.sh

  1. #!/bin/bash
  2. START_HAPROXY="HAPROXY="/etc/rc.d/init.d/haproxy start
  3. STOP_HAPROXY="HAPROXY="/etc/rc.d/init.d/haproxy stop
  4. LOG_FILE="FILE="/usr/local/keepalived/log/haproxy check.log
  5. HAPS=`ps C haproxy no header |wc l`
  6. date "+%Y--%m --%d %H:%M:%S" >> $LOG_FILE
  7. echo "check haproxy status" >> $LOG_FILE
  8. # 宕机后,会尝试重启
  9. if [$HAPS eq 0 ];then
  10. echo $START_HAPROXY >> $LOG_FILE
  11. $START_HAPROXY >> $LOG_FILE 2>&1
  12. sleep 3
  13. # 重启后,还是没有启动成功,停止 keepalive ,让其启动备用即
  14. if [ `ps C haproxy no header |wc l` eq 0 ];then
  15. echo "start haproxy failed, killall keepalived" >> $LOG_FILE
  16. killall keepalived
  17. fi
  18. fi

chmod +x /etc/keepalived/ haproxy _check.sh

vrrp_instance 中配置检查脚本

  1. track_script {
  2. # 追踪脚本
  3. chk_haproxy
  4. }

启动

systemctl start keepalived


查看

ip addr

  1. enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  2. link/ether 08:00:27:c1:c4:8c brd ff:ff:ff:ff:ff:ff
  3. inet 192.168.1.212/24 brd 192.168.1.255 scope global noprefixroute enp0s3
  4. valid_lft forever preferred_lft forever
  5. inet 192.168.1.220/32 scope global enp0s3
  6. valid_lft forever preferred_lft forever
  7. inet6 fe80::b26f:2650:fbad:bc82/64 scope link noprefixroute
  8. valid_lft forever preferred_lft forever

无法启动原因

  • 防火墙配置有误,没有正确开启VRRP协议
  • 配置的虚拟IP与其他节点的IP不处于同一网段
  • Keepalived配置有误,或Keepalived根本没启动成功