keepalived 配置 haproxy vip_运维

Keepalived 说明

Keepalived是基于vrrp协议的一款高可用软件

Keepalived 是运行在 lvs 之上,是一个用于做双机热备(HA)的软件,它的主要功能是实现真实机的故障隔离及负载均衡器间的失败切换,提高系统的可用性。

运行原理

Keepalived 通过选举(看服务器设置的权重)挑选出一台热备服务器做 MASTER 机器,MASTER 机器会被分配到一个指定的虚拟 ip,外部程序可通过该 ip 访问这台服务器,如果这台服务器出现故障(断网,重启,或者本机器上的 keepalived crash 等),keepalived 会从其他的备份机器上重选(还是看服务器设置的权重)一台机器做 MASTER 并分配同样的虚拟 IP,充当前一台 MASTER 的角色。

选举策略

选举策略是根据 VRRP 协议,完全按照权重大小,权重最大(0~255)的是 MASTER 机器,下面几种情况会触发选举

  • Keepalived 启动的时候
  • Master 服务器出现故障(断网,重启,或者本机器上的keepalived crash 等,而本机器上其他应用程序 crash 不算)
  • 有新的备份服务器加入且权重最大

ALI 只能支持单播,且只能两台ECS绑定

Aliyun必须用他们分配的虚拟ip、还得申请弹性公网ip,要不然部署的集群对外起不到作用

如下配置可以看到我们配置,HAVIP 绑定了EIP公网,HAVIP又分别绑定到集群keepalived的master和backup的ECS中,我们访问EIP公网即可。

  • 1、Master 和 Backup 都正常工作,则访问EIP时,会访问到Master对应的Nginx服务。
  • 2、当我手动将Master的Nginx服务杀死,则访问EIP时,会访问到Backup的Nginx服务
  • 3、我们修复Master的Nginx服务,然后开启Keepalived服务,访问EIP时,会访问到Master对应的nginx服务。

术语解释

  • EIP (Elastic IP Address)
  • HaVip (High-Availability Virtual IP Address)
  • LB (Load Balancer 负载均衡)
  • HA (High Available 高可用)
  • Failover (失败切换)
  • Cluster (集群)
  • LVS (Linux Virtual Server Linux 虚拟服务器)
  • DS (Director Server),指的是前端负载均衡器节点
  • RS (Real Server),后端真实的工作服务器
  • VIP (Virtual IP),虚拟的 IP - 地址,向外部直接面向用户请求,作为用户请求的目标的 IP - 地址
  • DIP (Director IP),主要用于和内部主机通讯的 IP 地址
  • RIP (Real Server IP),后端服务器的 IP 地址
  • CIP (Client IP),访问客户端的 IP 地址

集群中使用到的IP信息如下:

  • EIP公网: xxxx
  • HaVip: 172.18.78.119
  • 集群Master: 001 (172.18.78.117)
  • 集群Backup: 002 (172.18.78.118)

主从服务器配置文件位置

主从服务器:/etc/nginx/sites-enabled/*

主服务器web地址:/var/www/html/index.html
备服务器web地址:/var/www/html/index.html

请求地址:http://xxxx

check_nginx_pid.sh 配置

/etc/keepalived/check_nginx_pid.sh

#!/bin/bash
#检测nginx是否启动了
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then            #如果nginx没有启动就启动nginx                        
      #systemctl start nginx    #重启nginx,模拟故障;生产环境可打开
      if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then    #nginx重启失败,则停掉keepalived服务,进行VIP转移
              systemctl stop keepalived
      fi
fi

MASTER

ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:0c:51:53 brd ff:ff:ff:ff:ff:ff
    inet 172.18.78.117/20 brd 172.18.79.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 172.18.78.119/32 scope global eth0
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:08:46:d7:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

/etc/keepalived/keepalived.conf

global_defs {
    router_id 172.18.78.117  # 你的ip地址
    #router_id LVS_DEVEL
}
vrrp_script chk_http_port {
    script "/etc/keepalived/check_nginx_pid.sh" # 心跳执行的脚本,检测nginx是否启动
    interval 2                                  #(检测脚本执行的间隔)
    weight 2
}
vrrp_instance VI_1 {
    state MASTER         # 备份服务器上将 MASTER 改为 BACKUP
    interface eth0       # 网卡,可以通过ifconfig查看
    virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
    priority 99          # 主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1

    # 如果两节点的上联交换机禁用了组播,则采用 vrrp 单播通告的方式
    unicast_src_ip 172.18.78.117
    unicast_peer {
        172.18.78.118
    }
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_http_port     # 调用检测脚本
    }
    virtual_ipaddress {
        172.18.78.119  # ali havip
    }
}

BACKUP 服务器

ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:0e:a5:13 brd ff:ff:ff:ff:ff:ff
    inet 172.18.78.118/20 brd 172.18.79.255 scope global eth0
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:60:48:73:12 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

/etc/keepalived/keepalived.conf

global_defs {
    router_id 172.18.78.118  # 你的ip地址
    #router_id  LVS_DEVEL
}
vrrp_script chk_http_port {
    script "/etc/keepalived/check_nginx_pid.sh"
    interval 2               #(检测脚本执行的间隔)
    weight 2
}
vrrp_instance VI_1 {
    state BACKUP         # 备份服务器上将 MASTER 改为 BACKUP
    interface eth0       # 网卡,可以通过ifconfig查看
    virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
    priority 90          # 主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1

    # 如果两节点的上联交换机禁用了组播,则采用 vrrp 单播通告的方式
    unicast_src_ip 172.18.78.118
    unicast_peer {
        172.18.78.117
    }

    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_http_port
    }
    virtual_ipaddress {
        172.18.78.119  # ali havip
    }
}