Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器
keepalived工作在IP/TCP协议栈的IP层,TCP层,及应用层,工作原理基于VRRP协议。
centos7
server1:192.168.211.158 (master)
server2:192.168.211.160
vip: 192.168.211.123
两台服务器都需要安装 keepalived服务 以及进行keepalived.conf的配置文件修改, 如下所示:
yum install -y keepalived #安装keepalived服务
#MASTER的keepalived.conf文件如下所示
! Configuration File for keepalived
global_defs {
router_id 1 #设备在组中的标识,设置不一样即可
}
vrrp_instance VI_1 { #VI_1.实例名,两台路由器要相同
state MASTER #主或者从状态
interface ens33 #监控指定心跳网卡
mcast_src_ip 192.168.211.158 #心跳源IP
virtual_router_id 55 #虚拟路由编号,主备机需要一致
priority 100 #优先级 谁大谁优先 只有两台设备的时候,不配置也不影响
advert_int 1 #心跳间隔 秒为单位 每秒探测一次心跳
authentication { #密码认证,防止非法服务器加入集群
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.211.123 #主从共同维护的虚拟IP VIP
}
}
# 在BACKUP那台服务器上只需要修改 router_id, state这两个参数即可, 其它的根据实际情况设置.
实验效果: 通过浏览器访问 http://192.168.211.123, 可以访问到master的web服务, 将master关机之后,仍然可以通过keepalived服务切换到backup主机, 继续访问.
环境:
server1:192.168.211.158 (master)
server2:192.168.211.160
vip: 192.168.211.123
需要先在/etc/keepalived目录下编写一个shell脚本, 用来检查nginx服务是否启动,如果没有启动的话将其启动,如果启动失败的话,将会关闭keepalived服务,让备机来工作.
#!/bin/bash
counter=$(netstat -nltp | grep -i 80 | wc -l)
if [ "${counter}" = "0" ];then
systemctl start nginx
sleep 5
counter=$(netstat -nltp | grep -i 80 | wc -l)
if [ "${counter}" = "0" ];then
systemctl stop keepalived
fi
fi
编写完shell脚本之后,修改keepalived.conf的配置文件, 使其通过执行脚本任务,来感知nginx服务状态!
! Configuration File for keepalived
global_defs {
router_id 1 #设备在组中的标识,设置不一样即可
}
vrrp_script chk_nginx {
script "/etc/keepalived/ck_ngx.sh"
interval 2 # 每隔2s执行脚本
weight -5 #减去优先级
fall 3 #尝试三次, 如果无法启动nginx服务,就会降权
}
vrrp_instance VI_1 { #VI_1.实例名,两台路由器要相同
state MASTER #主或者从状态
interface ens33 #监控指定心跳网卡
mcast_src_ip 192.168.211.158 #心跳源IP
virtual_router_id 55 #虚拟路由编号,主备机需要一致
priority 100 #优先级 谁大谁优先
advert_int 1 #心跳间隔 秒为单位 每秒探测一次心跳
authentication { #密码认证,防止非法服务器加入集群
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.211.123 #主从共同维护的虚拟IP VIP
}
track_script {
chk_nginx #对应上面的执行脚本策论名
}
}
实现效果: 当master的nginx服务器停掉的时候,keepalived会通过执行脚本,将其重新运行,继续保持工作状态,如果拉取失败的话,会将master的keepalived服务停掉. 使其切换到backup服务器进行工作.
环境: 4台服务器(2台作为(LVS+keepalived) 2台作为web真实服务器)
LVS1 + KEEPALIVED1: 192.168.211.158 (ipvsadm安装就行 不需要启动, 因为keepalivd集成了lvs配置)
LVS2 + LEEPALIVED2: 192.168.211.160
WEB1 : 192.168.211.161
WEB2 : 192.168.211.162
步骤1: 配置master的 keepalived文件
! Configuration File for keepalived
global_defs {
router_id Director1 #目录服务器编号
}
vrrp_instance VI_1 { #VI_1.实例名,两台路由器要相同
state MASTER #主或者从状态
interface ens33 #监控指定心跳网卡
virtual_router_id 55 #虚拟路由编号,主备机需要一致
priority 150 #优先级 谁大谁优先
advert_int 1 #心跳间隔 秒为单位 每秒探测一次心跳
authentication { #密码认证,防止非法服务器加入集群
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.211.123/24 dev ens33 # LVS对外服务的VIP
}
}
virtual_server 192.168.211.123 80 { #LVS负载均衡策略配置部分
delay_loop 3 #服务轮询时间间隔
lb_algo rr #使用rr轮询算法
lb_kind DR #使用DR直接路由模式
protocol TCP
real_server 192.168.211.161 80 {
weight 1
TCP_CHECK {
connect_timeout 3 #测试超时时间
}
}
real_server 192.168.211.162 80 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}
master设置完配置文件之后,copy到 backup机子上, 在backup主机上进行相应的修改, 需要修改的参数正常有: router_id, state, priority
backup主机的配置文件如下:
! Configuration File for keepalived
global_defs {
router_id Director2 #目录服务器编号
}
vrrp_instance VI_1 { #VI_1.实例名,两台路由器要相同
state BACKUP #主或者从状态
interface ens33 #监控指定心跳网卡
virtual_router_id 55 #虚拟路由编号,主备机需要一致
priority 100 #优先级 谁大谁优先
advert_int 1 #心跳间隔 秒为单位 每秒探测一次心跳
authentication { #密码认证,防止非法服务器加入集群
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.211.123/24 dev ens33 # LVS对外服务的VIP
}
}
virtual_server 192.168.211.123 80 { #LVS负载均衡策略配置部分
delay_loop 3 #服务轮询时间间隔
lb_algo rr #使用rr轮询算法
lb_kind DR #使用DR直接路由模式
protocol TCP
real_server 192.168.211.161 80 {
weight 1
TCP_CHECK {
connect_timeout 3 #测试超时时间
}
}
real_server 192.168.211.162 80 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}
首先 对web服务器进行回环接口VIP配置,使其能够将相应报文直接回复给客户端.如下:先新增一个虚拟网卡lo:0
[root@localhost network-scripts]# cat ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.211.123
NETMASK=255.255.255.255
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
ONBOOT=yes
其次进行路由规则配置: 确保如果请求的目的地址是VIP, 那么让出去的数据包的源地址也显示为VIP
最后配置sysctl.conf文件,让web主机忽略arp请求,但是可以进行发送.
[root@localhost ~]# vi /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
#忽略arp请求,可以回复
两台web服务器一样配置即可. 最后通过访问192.168.211.123 可以轮询的访问到两台web服务器的httpd页面, 即使其中一台LVS宕机了, 用户仍然可以继续进行访问.