一、keepalived 安装
官网地址:http://www.keepalived.org/download.html
1、Keepalived 环境准备
各节点时间必须同步:ntp, chrony
关闭防火墙及SELinux
各节点之间可通过主机名互相通信:非必须
建议使用/etc/hosts文件实现:非必须
各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信:非必须
2、下载后解压安装即可
# tar xzf keepalived-2.2.8.tar.gz
# cd keepalived-2.2.8
# ./configure --prefix=/usr/local/keepalived/
# make && make install
Tips 1:安装过程中提示:*** WARNING – this build will not support IPVS with IPv6.
Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
# yum install -y libnl3.x86_64
# yum install -y libnl3-devel.x86_64
Tips 2:configure: error: !!! Please install libnfnetlink headers. !!!
# yum install -y libnfnetlink.x86_64
# yum install -y libnfnetlink-devel.x86_64
3、也可以 yum安装
yum install -y keepalived
# 安装完成后 主程序在 /usr/sbin/keepalived,配置文件在 /etc/keepalived/keepalived.conf
二、配置文件
vim /etc/keepalived/keepalived.conf
# 全局配置
global_defs {
#邮件通知 notification
#指定keepalived在发生切换时需要发送email到的对象,一行一个
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc # 指定发件人
smtp_server 192.168.200.1 # 指定smtp服务器地址
smtp_connect_timeout 30 # 指定smtp连接超时时间
#路由id: 当前安装的keepalived节点主机的标识符,用主机名即可,两个节点保持一致
router_id jqma
# 下面两个配置不写的话,权限不足,无法启动keepalived
script_user root
enable_script_security
#下面几个使用默认配置即可
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#vrrp 实例配置
vrrp_instance VI_1 { # VI_1 自定义,可以随便起,一般叫VI_数字(1,2,3等)
state MASTER # 要大写,主是MASTER 备是 BACKUP
interface eth0 # 网卡,根据实际填写
virtual_router_id 51 # 虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致(取值0-255)
priority 100 # 权重,BACKUP 要比 MASTER 小
advert_int 1 # MASTER 与BACKUP 负载均衡器之间同步检查的时间间隔(一定时间发送一个报文给backup。如果backup没有收到就自己成为master),单位为秒,两个节点设置必须一样。
#集群两个节点之间通信,验证authentication。包含验证类型和验证密码。类型主要有PASS、AH 两种,通常使用的类型为PASS,
#MASTER 与BACKUP 使用相同的密码才能正常通信。
authentication {
auth_type PASS
auth_pass 1111 # 密码随便写一个
}
#单播模式
unicast_src_ip 172.21.62.19 #本机真实ip
unicast_peer { #单播模式
172.21.62.18 #另一个节点真实ip
}
#虚拟ip配置一行代表一个VIP
virtual_ipaddress {
192.168.200.16
192.168.200.17
192.168.200.18
}
############################ 无需配置 #######################################
# 当前节点成为master时,通知脚本执行任务,一般不需要写
# notify_master "/etc/keepalived/start_haproxy.sh start"
# 当前节点成为backup时,通知脚本执行任务
# notify_backup "/etc/keepalived/start_haproxy.sh stop"
# 当当前节点出现故障,执行的任务;
# notify_fault "/etc/keepalived/start_haproxy.sh stop"
####################################################################
}
#健康检查部分,如果不做健康检查可以不配置,监听 ip + 端口号 看一个服务是否健康
virtual_server 192.168.167.100 3306 { # 虚拟IP 端口号
delay_loop 2
lb_algo wrr
lb_kind DR
persistence_timeout 60
protocol TCP #使用的协议
#以上配置使用默认即可
real_server 192.168.167.150 3306 { #本节点 真实ip
weight 3
notify_down "/etc/keepalived/shutdown_keepalived.sh" # 监听的端口down时关闭keepalived,得用network,不能用NetworkManager
TCP_CHECK {
connect_timeout 10
connect_port 3306
}
}
}
#关闭keepalived的脚本
vim /etc/keepalived/shutdown_keepalived.sh
#!/bin/sh
pkill keepalived
#启动,注意:要先启动主上的keepalived,再启动备上的,非抢占式 谁先启动,VIP就在哪个节点上
/usr/sbin/keepalived/ -f /etc/keepalived/keepalived.conf
#关闭
pkill keepalived
#快捷启动
service status keepalived #Redhat7以前
systemctl status keepalived #redhat7以后
三、相关组件介绍
keepalived 核心组件:
vrrp stack:VIP消息通告
checkers:监测real server
system call:标记real server权重
SMTP:邮件组件
ipvs wrapper:生成IPVS规则
Netlink Reflector:网络接口
WatchDog:监控进程
-控制组件:配置文件解析器
-IO复用器
-内存管理组件
#Keepalived进程树,keepalived启动之后有三个进程
Keepalived <-- Parent process monitoring children
Keepalived <-- VRRP child
Keepalived <-- Healthchecking child
##################### keepalived 高级 ###################
单播(Unicast):是一个发送者和一个接收者之间通过网络进行的通信。
组播
组播产生背景:
传统的网络通讯有两种,一种是源主机和目标主机两台设备之间进行的一对一的通讯方式,也就是单播;另一种,
一台源主机和网络中的所有其他主机进行的通讯,即广播,在广播方式下,信息会发送到不需要该信息的主机从而浪费带宽资源,
甚至引起广播风暴;在单播方式下,会因为数据包的多次重复儿浪费带宽资源,源主机的负荷会因为多次的数据复制儿加大
在单播和广播有问题情况下,组播技术就应用而生了。
组播定义:组播又称多目标广播、多播。网络中使用的一种传输方式,它允许把所发消息传送给所有有可能目的地中的一个经过选择的子集,
即明确指出的多种地址传送信息,是一种在一个发送者和多个接受者之间进行通信的方法
一、keepalived单播模式
如果网路不允许组播(可能是交换机策略设置),又要使用keepalived,那么开启单播。
使用单播模式,即使网络环境内有相同的virtual_router_id,也没有关系
单播配置,在 vrrp_instance 里配置,(keepalived默认是抢占式,组播的 方式 )
#vrrp 实例配置
vrrp_instance VI_1 { # VI_1 自定义,可以随便起,一般叫VI_数字(1,2,3等)
state MASTER # 要大写,主是MASTER 备是 BACKUP
interface eth0 # 网卡,根据实际填写
virtual_router_id 51 # 虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致(取值0-255)
priority 100 # 权重,BACKUP 要比 MASTER 小
advert_int 1 # MASTER 与BACKUP 负载均衡器之间同步检查的时间间隔,单位为秒,两个节点设置必须一样。
#集群两个节点之间通信,验证authentication。包含验证类型和验证密码。类型主要有PASS、AH 两种,通常使用的类型为PASS,
#MASTER 与BACKUP 使用相同的密码才能正常通信。
authentication {
auth_type PASS
auth_pass 1111 # 密码随便写一个
}
#单播模式
unicast_src_ip 172.21.62.19 #本机真实ip
unicast_peer { #单播模式
172.21.62.18 #另一个节点真实ip
}
#虚拟ip配置一行代表一个VIP
virtual_ipaddress {
192.168.200.16
192.168.200.17
192.168.200.18
}
二、keepalived 非抢占式
keepalived默认是抢占式,组播的 方式 ,当master down 时,backup 会接管vip 地址,当master启动后又会把vip抢过来。
抢占式的缺点:会因为网络抖动,vip频繁飘移, 造成不必要的切换,推荐使用非抢占式。
配置 keepalived 非抢占模式,注意点如下:
(1) 主设备、 从设备中的 state 都设置为 BACKUP
(2) 默认主设备(priority 值大的 Keepalived 节点) 配置一定要加上 nopreempt,否则非抢占不起作用
(3) 防火墙配置允许组播(主、备两台设备上都需要配置, keepalived 使用 224.0.0.18 作为 Master 和Backup 健康检查的通信 IP)
(4)如果使用 非抢占模式,就不能通过优先级 priority 来判断谁应该是MASTER或者SLAVE.
三、非抢占模式+单播模式配置
#vrrp 实例配置
vrrp_instance VI_1 { # VI_1 自定义,可以随便起,一般叫VI_数字(1,2,3等)
state BACKUP # 非抢占式,主从都要写BACKUP
interface eth0 # 网卡,根据实际填写
virtual_router_id 51 # 虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致(取值0-255)
priority 100 # 权重,BACKUP 要比 MASTER 小
nopreempt #主上要写这个,否则非抢占不起作用,从上不用写(也就是在权重高的节点上写)
advert_int 1 # MASTER 与BACKUP 负载均衡器之间同步检查的时间间隔,单位为秒,两个节点设置必须一样。
#集群两个节点之间通信,验证authentication。包含验证类型和验证密码。类型主要有PASS、AH 两种,通常使用的类型为PASS,
#MASTER 与BACKUP 使用相同的密码才能正常通信。
authentication {
auth_type PASS
auth_pass 1111 # 密码随便写一个
}
#单播模式
unicast_src_ip 172.21.62.19 #本机真实ip
unicast_peer { #单播模式
172.21.62.18 #另一个节点真实ip
}
#虚拟ip配置一行代表一个VIP
virtual_ipaddress {
192.168.200.16
192.168.200.17
192.168.200.18
}
}
四、脚本调用
vrrp_script <string name> {
script "/etc/keepalived/nginx_check.sh" # 可以是个脚本,也可以直接写个命令,如下一行
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" # 直接写命令
interval 1 # 设置执行间隔
weight 10 # 运行成功则升级权重+10,否则-10
}
# 然后在 vrrp_instance 里调用上述的vrrp_script 的名字
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16
}
# 调用上面 vrrp_script 定义的脚本
track_script {
chk_down
chk_nginx
}
# 下面四个一般不需要
#notify_master "/usr/local/bin/vrrp.mast arg1 arg2"
#notify_backup "/usr/local/bin/vrrp.back arg1 arg2"
#notify_fault "/usr/local/bin/vrrp.fault arg1 arg2"
#notify_stop "/usr/local/bin/vrrp.stop arg1 arg2"
}
notify_master、notify_backup、notify_fault和notify_stop四个选项,这是Keepalived配置中的一个通知机制,也是Keepalived包含的四种状态。
下面介绍每个选项的含义:
notify_master :指定当Keepalived进入MASTER状态时要执行的脚本,这个脚本可以是一个状态报警脚本,也可以是一个服务管理脚本。Keepalived允许脚本传入参数,因此灵活性很强。
notify_backup : 指定当Keepalived进入BACKUP状态时要执行的脚本,同理,这个脚本可以是一个状态报警脚本,也可以是一个脚本管理脚本。
notify_fault :指定当Keepalived进入FAULT状态时要执行的脚本,脚本功能与前两个类似。
notify_stop : 指定当Keepalived程序终止时需要执行的脚本。
五、健康检查模块
virtual_server 172.21.62.24 3306 { # 虚拟IP 端口号
delay_loop 2
lb_algo wrr
lb_kind DR
persistence_timeout 60
protocol TCP
#以上配置使用默认即可
real_server 172.21.62.19 3306 { #本节点 真实ip
weight 3
notify_down "/etc/keepalived/shutdown_keepalived.sh" # 有数据库down时关闭keepalived
TCP_CHECK {
connect_timeout 10
connect_port 3306
}
}
}