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
}
}