keepalived总结
一、实验环境
默认ng已安装
机器如下
keepalived-master: 192.168.199.201
keepalived-backup: 192.168.199.202
VIP: 192.168.199.222
# 作为keepalived+ng使用的nginx实例
ng1: 192.168.199.201
ng2: 192.168.199.202
# 作为RS使用的nginx实例
ng3: 192.168.199.203
ng4: 192.168.199.203
二、安装keepalived(两台)
PS:两种方式2选一即可
2.1 RPM包安装
wget http://rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/keepalived-1.3.5-19.el7.x86_64.rpm
#如果启动报下图的错误,需要安装net-snmp依赖。建议直接安装
yum install net-snmp
rpm -ivhU keepalived-1.3.5-19.el7.x86_64.rpm --force --nodeps
2.2 tar包安装
安装依赖(可能需要)
yum -y install gcc gcc-c++ ncurses-devel bison libaio-devel openssl openssl-devel
下载keepalived安装包
wget https://www.keepalived.org/software/keepalived-2.1.0.tar.gz --no-check-certificate
解压安装
tar -zxvf keepalived-2.1.0.tar.gz
cd keepalived-2.1.0
./configure
make && make install
三、单/双网卡配置(仅配置VIP)
这里以tar包安装为例,RPM包安装会跳过下面三个命令,其余一致
cp keepalived-2.1.0/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived
3.1 单网卡配置
3.1.1 MASTER(192.168.199.201)配置如下
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id nodex ##本机keepalived标识,主备写一致就行
}
# VRRP实例(instance)配置
# 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state MASTER ##MASTER表示主服务器
interface ens33 ##承载VIP地址的物理接口
virtual_router_id 51 ##虚拟路由器的ID号
priority 100 ##优先级,数值越大优先级越高
advert_int 1 ##通告间隔秒数(心跳频率)
authentication { ##认证信息
auth_type PASS ##认证类型
auth_pass 123456 ##密码字串,最多为8位
}
## 最好加上,防止交换机禁止组播
unicast_src_ip 192.168.199.201 ##本机IP
unicast_peer {
192.168.199.202 ##对端IP
}
virtual_ipaddress {
192.168.199.222 ##指定漂移地址(VIP)
}
}
重启主keepalive的服务
systemctl restart keepalived
3.1.2 BACKUP(192.168.199.202)配置如下
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id nodex ##本机keepalived标识,主备写一致就行
}
# VRRP实例(instance)配置
# 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state BACKUP ##MASTER表示主服务器
interface ens33 ##承载VIP地址的物理接口
virtual_router_id 51 ##虚拟路由器的ID号
priority 90 ##优先级,数值越大优先级越高
advert_int 1 ##通告间隔秒数(心跳频率)
authentication { ##认证信息
auth_type PASS ##认证类型
auth_pass 123456 ##密码字串,最多为8位
}
## 最好加上,防止交换机禁止组播
unicast_src_ip 192.168.199.202 ##本机IP
unicast_peer {
192.168.199.201 ##对端IP
}
virtual_ipaddress {
192.168.199.222 ##指定漂移地址(VIP)
}
}
重启备keepalive的服务
systemctl restart keepalived
3.1.3 实验比较简单,结果语述如下:
1. VIP 会在201机器上
2. 停止201的keepalived,VIP会飘到202上
3. 重启201的keepalived,VIP会飘到201上
3.2 双网卡配置
假设:这里的公网IP是用的百度的
3.2.1 MASTER配置可参考:
# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id nodex ##本机keepalived标识,主备写一致就行
}
vrrp_instance VI_1 { ##定义VRRP热备实例
state MASTER ##主/备服务器
interface eth0 ##承载vip地址的物理接口
virtual_router_id 51 ##虚拟路由器的ID号
priority 100 ##优先级,数值越大优先级越高
advert_int 1 ##通告间隔秒数(心跳频率)
authentication { ##认证信息
auth_type PASS ##认证类型
auth_pass 123456 ##密码字串
}
unicast_src_ip 10.10.10.10 ##本机eth0_IP
unicast_peer {
10.10.10.11 ##对端eth0_IP
}
virtual_ipaddress {
10.10.10.222 ##eth0_VIP
}
}
vrrp_instance VI_2 { ##定义VRRP热备实例
state MASTER ##主/备服务器
interface eth1 ##承载vip地址的物理接口
virtual_router_id 52 ##虚拟路由器的ID号
priority 100 ##优先级,数值越大优先级越高
advert_int 1 ##通告间隔秒数(心跳频率)
authentication { ##认证信息
auth_type PASS ##认证类型
auth_pass 123456 ##密码字串
}
unicast_src_ip 119.75.217.109 ##本机eth1_IP
unicast_peer {
119.75.217.110 ##对端eth1_IP
}
virtual_ipaddress {
119.75.217.222 ##eth1_VIP
}
}
3.2.2 BACKUP配置可参考:
# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id nodex ##本机keepalived标识,主备写一致就行
}
vrrp_instance VI_1 { ##定义VRRP热备实例
state BACKUP ##主/备服务器
interface eth0 ##承载vip地址的物理接口
virtual_router_id 51 ##虚拟路由器的ID号
priority 90 ##优先级,数值越大优先级越高
advert_int 1 ##通告间隔秒数(心跳频率)
authentication { ##认证信息
auth_type PASS ##认证类型
auth_pass 123456 ##密码字串
}
unicast_src_ip 10.10.10.11
unicast_peer {
10.10.10.10
}
virtual_ipaddress {
10.10.10.222
}
}
vrrp_instance VI_2 { ##定义VRRP热备实例
state BACKUP ##主/备服务器
interface eth1 ##承载vip地址的物理接口
virtual_router_id 52 ##虚拟路由器的ID号
priority 90 ##优先级,数值越大优先级越高
advert_int 1 ##通告间隔秒数(心跳频率)
authentication { ##认证信息
auth_type PASS ##认证类型
auth_pass 123456 ##密码字串
}
unicast_src_ip 119.75.217.110
unicast_peer {
119.75.217.109
}
virtual_ipaddress {
119.75.217.222
}
}
3.3 测试结果如下
201的两个网卡各有一个VIP,202只有本机IP。
201的结果如下图:
3.4 非抢占模式
需要的场景:不能频繁切换业务繁忙的网站
1. 一般master服务故障后backup会变成master
2. 当master服务又恢复的时候,master会抢占VIP
这样就会发生两次切换对业务繁忙的网站来说并不是太友好
注意事项:
此时我们可以配置keepalived为非抢占式,需要两台机器硬件配置信息一致
1、两个节点的state都必须配置为BACKUP(官方建议)
2、两个节点都在vrrp_instance中添加nopreempt参数
3、其中一个节点的优先级必须要高于另外一个节点的优先级。
主配置:
! Configuration File for keepalived
global_defs {
router_id nodex ##本机keepalived标识,主备写一致就行
}
# VRRP实例(instance)配置
# 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state BACKUP ##MASTER表示主服务器
nopreempt ##不抢占
interface ens33 ##承载VIP地址的物理接口
virtual_router_id 51 ##虚拟路由器的ID号
priority 100 ##优先级,数值越大优先级越高
advert_int 1 ##通告间隔秒数(心跳频率)
authentication { ##认证信息
auth_type PASS ##认证类型
auth_pass 123456 ##密码字串,最多为8位
}
unicast_src_ip 192.168.199.201 ##本机IP
unicast_peer {
192.168.199.202 ##对端IP
}
virtual_ipaddress {
192.168.199.222 ##指定漂移地址(VIP)
}
}
备:
! Configuration File for keepalived
global_defs {
router_id nodex ##本机keepalived标识,主备写一致就行
}
# VRRP实例(instance)配置
# 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state BACKUP ##MASTER表示主服务器
nopreempt
interface ens33 ##承载VIP地址的物理接口
virtual_router_id 51 ##虚拟路由器的ID号
priority 90 ##优先级,数值越大优先级越高
advert_int 1 ##通告间隔秒数(心跳频率)
authentication { ##认证信息
auth_type PASS ##认证类型
auth_pass 123456 ##密码字串,最多为8位
}
unicast_src_ip 192.168.199.202 ##本机IP
unicast_peer {
192.168.199.201 ##对端IP
}
virtual_ipaddress {
192.168.199.222 ##指定漂移地址(VIP)
}
}
经测试符合预期
四、keepalived + ng (主要是用来防止单点故障)
重要说明:
- 这里需要把keepalived 和ng放在同一台机器上。
- ng是个范例,可以是其他服务。通常ng反向代理了其他服务。
- 这种主要是防止单点故障,比如一台ng服务宕了,可以快速切换到另外一台。
4.1 201上keeplived 编辑配置文件(MASTER)
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id nodex ##本机keepalived标识,主备写一致就行
}
vrrp_script chk_nginx {
script "/etc/keepalived/ng_check.sh" ## 检测服务状态的脚本路径
interval 2 ## 检测时间间隔
weight -20 ## 如果条件成立,权重-20
}
# VRRP实例(instance)配置
# 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state MASTER ##MASTER表示主服务器
interface ens33 ##承载VIP地址的物理接口
virtual_router_id 51 ##虚拟路由器的ID号
priority 100 ##优先级,数值越大优先级越高
advert_int 1 ##通告间隔秒数(心跳频率)
authentication { ##认证信息
auth_type PASS ##认证类型
auth_pass 123456 ##密码字串,最多为8位
}
unicast_src_ip 192.168.199.201 ##本机IP
unicast_peer {
192.168.199.202 ##对端IP
}
virtual_ipaddress {
192.168.199.222 ##指定漂移地址(VIP)
}
track_script {
chk_nginx ##执行监控的服务
}
}
检测Nginx的脚本
vim /etc/keepalived/ng_check.sh
#!/bin/bash
ngres=$(ps -C nginx --no-header|wc -l)
if [ $ngres -eq 0 ];then
echo -e " nginx1(192.168.199.201) is down on $(date +%F-%T)" >/tmp/201-nginx.log
systemctl stop keepalived
fi
chmod +x ng_check.sh
重启备keepalive的服务
systemctl restart keepalived
4.1 202上keeplived 编辑配置文件(BACKUP)
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id nodex ##本机keepalived标识,主备写一致就行
}
vrrp_script chk_nginx {
script "/etc/keepalived/ng_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 { ##定义VRRP热备实例
state BACKUP ##MASTER表示主服务器
interface ens33 ##承载VIP地址的物理接口
virtual_router_id 51 ##虚拟路由器的ID号
priority 90 ##优先级,数值越大优先级越高
advert_int 1 ##通告间隔秒数(心跳频率)
authentication { ##认证信息
auth_type PASS ##认证类型
auth_pass 123456 ##密码字串
}
unicast_src_ip 192.168.199.202
unicast_peer {
192.168.199.201
}
virtual_ipaddress {
192.168.199.222
}
track_script {
chk_nginx
}
}
Nginx检测脚本:
vim /etc/keepalived/ng_check.sh
#!/bin/bash
ngres=$(ps -C nginx --no-header|wc -l)
if [ $ngres -eq 0 ];then
echo -e " nginx1(192.168.199.202) is down on $(date +%F-%T)" >/tmp/202-nginx.log
systemctl stop keepalived
fi
重启备keepalive的服务
systemctl restart keepalived
4.3 测试结果
正常情况下,访问vip,到达201
停掉201的ng,VIP会到202上,访问vip,到达202
重启201的ng 和 keepalived,VIP又会会到201上
五、keepalived + LVS + NG +(RS)
问题:明明keepalived+ ng已经可以防止单点故障,为什么还需要LVS?
答曰:nginx本身可能也会出现故障,需要引进
重要:如果用NG反向代理,LVS配置是可以不写的
5.1 实验环境:
ng主要做反向代理,或者web服务,这里我用ng当做RS
lvs调度器: 192.168.199.201 网卡:ens33 ipvsadm、keepalived(热备)
lvs调度器: 192.168.199.202 网卡:ens33 ipvsadm、keepalived
vip: 192.168.199.222
NG: 192.168.199.203
NG: 192.168.199.204
5.2 201 202 操作
安装
yum install ipvsadm keepalived -y
5.2.1 配置(201-主)
! Configuration File for keepalived
global_defs {
router_id nodex ##本机keepalived标识,主备写一致就行
}
# VRRP实例(instance)配置
# 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state MASTER ##MASTER表示主服务器
interface ens33 ##承载VIP地址的物理接口
virtual_router_id 51 ##虚拟路由器的ID号
priority 100 ##优先级,数值越大优先级越高
advert_int 1 ##通告间隔秒数(心跳频率)
authentication { ##认证信息
auth_type PASS ##认证类型
auth_pass 123456 ##密码字串,最多为8位
}
unicast_src_ip 192.168.199.201 ##本机IP
unicast_peer {
192.168.199.202 ##对端IP
}
virtual_ipaddress {
192.168.199.222 ##指定漂移地址(VIP)
}
}
# LVS 配置
virtual_server 192.168.199.222 80 { # VIP地址
delay_loop 3 # 设置健康状态检查时间
lb_algo rr # lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR # 负载均衡转发规则NAT|DR|RUN
persistence_timeout 5 # 持久连接超时时间
protocol TCP # 使用的协议
real_server 192.168.199.203 80 { # RS的真实IP地址,这里用NG替代一下
weight 1 # 默认为1,0为失效
TCP_CHECK {
connect_timeout 3 # 连接超时时间
nb_get_retry 3 # 重连次数
delay_before_retry 3 # 重连间隔时间
connect_port 80 # 健康检查的端口的端口
}
}
real_server 192.168.199.204 80 {
weight 1
TCP_CHECK {
connect_timeout 3 # 连接超时时间
nb_get_retry 3 # 重连次数
delay_before_retry 3 # 重连间隔时间
connect_port 80 # 健康检查的端口的端口
}
}
}
重启备keepalive的服务
systemctl restart keepalived
5.2.3 配置(202-备),参考上文
重启备keepalive的服务
systemctl restart keepalived
5.2.4 配置转发策略
ipvsadm -C
ipvsadm -A -t 192.168.199.222:80 -s rr
ipvsadm -a -t 192.168.199.222:80 -r 192.168.199.203:80 -g
ipvsadm -a -t 192.168.199.222:80 -r 192.168.199.204:80 -g
查看
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.199.222:80 rr
-> 192.168.199.203:80 Route 1 0 0
-> 192.168.199.204:80 Route 1 0 0
5.3 203 204 配置
两台均需要操作
cat add_vip.sh
#!/bin/bash
SNS_VIP=192.168.199.222
case "$1" in
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $SNS_VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
sh add_vip.sh start
结果如图:
5.4 测试结果
如图可见,轮询成功
六、其他
keepalived命令
systemctl start|stop|restart|status keepalived
查看日志
tail -n300 -f /var/log/messages
OR
systemctl status keepalived