再次说明
- 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 节点
- Master 会发送 VRRP 广播,如果 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
g1obal_defs{
#路由id:当前安装keepalived的节点主机标识符,保证全局唯一
router_id keep_171
}
vrrp_instance VI_1 {
state MASTER
interface enp0s3
virtual_router_id 51
priority 100
# nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.220
}
}
配置说明:
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**
- 如果是 docker,要使用 docker 中的网卡,
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 状态检测
vrrp_script chk_haproxy {
script "/etc/keepalived/haproxy_check.sh"
# 几秒运行一次脚本
interval 2
# 如果脚本运行失败,权重+2
weight 2
}
编写 Haproxy 状态 检测 脚 本
/etc/keepalived haproxy _check.sh
- 脚本要求:如果 haproxy 停止运行,尝试启动,如果无法启动则杀死本机 的 keepalived 进程, keepalied 会将虚拟 ip 绑定到 BACKUP 机器上 。
mkdir p /usr/local/keepalived/log
vim /etc/keepalived/ haproxy _check.sh
- 脚本要求:如果 haproxy 停止运行,尝试启动,如果无法启动则杀死本机 的 keepalived 进程, keepalied 会将虚拟 ip 绑定到 BACKUP 机器上 。
#!/bin/bash
START_HAPROXY="HAPROXY="/etc/rc.d/init.d/haproxy start
STOP_HAPROXY="HAPROXY="/etc/rc.d/init.d/haproxy stop
LOG_FILE="FILE="/usr/local/keepalived/log/haproxy check.log
HAPS=`ps C haproxy no header |wc l`
date "+%Y--%m --%d %H:%M:%S" >> $LOG_FILE
echo "check haproxy status" >> $LOG_FILE
# 宕机后,会尝试重启
if [$HAPS eq 0 ];then
echo $START_HAPROXY >> $LOG_FILE
$START_HAPROXY >> $LOG_FILE 2>&1
sleep 3
# 重启后,还是没有启动成功,停止 keepalive ,让其启动备用即
if [ `ps C haproxy no header |wc l` eq 0 ];then
echo "start haproxy failed, killall keepalived" >> $LOG_FILE
killall keepalived
fi
fi
chmod +x /etc/keepalived/ haproxy _check.sh
在 vrrp_instance
中配置检查脚本
track_script {
# 追踪脚本
chk_haproxy
}
启动
systemctl start keepalived
查看
ip addr
enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:c1:c4:8c brd ff:ff:ff:ff:ff:ff
inet 192.168.1.212/24 brd 192.168.1.255 scope global noprefixroute enp0s3
valid_lft forever preferred_lft forever
inet 192.168.1.220/32 scope global enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::b26f:2650:fbad:bc82/64 scope link noprefixroute
valid_lft forever preferred_lft forever
无法启动原因
- 防火墙配置有误,没有正确开启VRRP协议
- 配置的虚拟IP与其他节点的IP不处于同一网段
- Keepalived配置有误,或Keepalived根本没启动成功