keepalived的HA分为抢占模式和非抢占模式,抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP。下面分别介绍CentOS7下抢占模式和非抢占模式的配置方式:
例子1
1、方案规划
VIP | IP | 主机名 | Nginx端口 |
---|---|---|---|
192.168.1.210 | 192.168.1.201 | nginx-01 | 80 |
192.168.1.210 | 192.168.1.202 | nginx-02 | 80 |
两台服务器的VIP为:192.168.1.210
分别在两台WEB服务器安装nginx和keepalived:
1、安装Nginx,请参考《Nginx源码安装》
2、安装Keepalived,请参考《Keepalived安装与配置》
3、防火墙添加arrp组播规则,或关闭防火墙
1> iptables
-
shell> vi /etc/sysconfig/iptables
-
-A INPUT -p vrrp -d 224.0.0.18/32 -j ACCEPT
2> firewall
-
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface enp4s0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
-
firewall-cmd --reload
4、关闭selinux
-
shell> vi /etc/sysconfig/selinux
-
#修改:
-
SELINUX=disabled
-
#setenforce 0
2、抢占模式配置
编辑/etc/keepalived/keepalived.conf
配置文件
1> MASTER(192.168.1.201):
global_defs {
router_id nginx_01 #标识本节点的名称,通常为hostname
}
## keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
##如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。如果脚本执行结果非0,
##并且weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2 #每2秒检测一次nginx的运行状态
weight -20 #失败一次,将自己的优先级-20
}
vrrp_instance VI_1 {
state MASTER # 状态,主节点为MASTER,备份节点为BACKUP
interface enp0s3 # 绑定VIP的网络接口,通过ifconfig查看自己的网络接口
virtual_router_id 51 # 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,相同的VRID为一个组,他将决定多播的MAC地址
mcast_src_ip 192.168.1.201 # 本机IP地址
priority 100 # 节点优先级,值范围0~254,MASTER要比BACKUP高
advert_int 1 # 组播信息发送时间间隔,两个节点必须设置一样,默认为1秒
# 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP,两个节点设置必须一样。可以设置多个,一行写一个
virtual_ipaddress {
192.168.1.210
}
track_script {
chk_nginx # nginx存活状态检测脚本
}
}
2> BACKUP(192.168.1.202)
global_defs {
router_id nginx_02
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface enp0s3
virtual_router_id 51
mcast_src_ip 192.168.1.202
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.210
}
track_script {
chk_nginx
}
}
3> 创建nginx服务检测脚本
分别在主备服务器/etc/keepalived
目录下创建nginx_check.sh
脚本,并为其添加执行权限chmod +x /etc/keepalived/nginx_check.sh
。用于keepalived定时检测nginx的服务状态,如果nginx停止了,会尝试重新启动nginx,如果启动失败,会将keepalived进程杀死,将vip漂移到备份机器上。
#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
/opt/nginx/sbin/nginx #尝试重新启动nginx
sleep 2 #睡眠2秒
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
killall keepalived #启动失败,将keepalived服务杀死。将vip漂移到其它备份节点
fi
fi
4> 启动keepalived服务
-
shell> service keepalived start
-
shell> ps -ef | grep keepalived
-
[root@localhost ~]# ps -ef | grep keepalived
-
root 865 1 0 23:36 ? 00:00:00 keepalived -D
-
root 869 865 0 23:36 ? 00:00:00 keepalived -D
-
root 870 865 0 23:36 ? 00:00:00 keepalived -D
如果看到如上进程信息,表示keepalived已经启动成功。下面用ip add
命令查看vip绑定的情况,如下图所示:
从上图可以看出,vip地址192.168.1.210绑定在MASTER(192.168.1.201)的enp0s3网卡上。
5> 测试故障转移
将MASTER上的keepalived停止,查看vip是否会漂移到192.168.2.202上。
停止201的keepalived服务:
-
shell> service keepalived stop
-
shell> ip addr
从上图可以看出,vip已经成功从201漂移到了202。此时再将201的keepalived服务启动后,由于201是MASTER,所以会将202的VIP抢占过来。
启动201的keepalived服务:
shell> service keepalived start
结果VIP又回到了201,如下图所示:
3、非抢占模式
master从故障中恢复后,不会抢占备份节点的vip
1> MASTER(192.168.1.201):
global_defs {
router_id nginx_01 #标识本节点的名称,通常为hostname
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface enp0s3
virtual_router_id 51
mcast_src_ip 192.168.1.201
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.210
}
track_script {
chk_nginx # nginx存活状态检测脚本
}
}
2> BACKUP(192.168.1.202)
global_defs {
router_id nginx_02
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface enp0s3
virtual_router_id 51
mcast_src_ip 192.168.1.202
priority 90
advert_int 1
nopreempt #不争抢vip
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.210
}
track_script {
chk_nginx
}
}
和非抢占模式的配置相比,只改了两个地方:
1> 在vrrp_instance块下两个节点各增加了nopreempt指令,表示不争抢vip
2> 节点的state都为BACKUP
两个keepalived节点都启动后,默认都是BACKUP状态,双方在发送组播信息后,会根据优先级来选举一个MASTER出来。由于两者都配置了nopreempt,所以MASTER从故障中恢复后,不会抢占vip。这样会避免VIP切换可能造成的服务延迟。
例子2
实验目标:2台Nginx+Keepalived 2台Lamp构建高可用Web集群
规划:
-
ng1.laoguang.me 192.168.1.22 ng1
-
ng2.laoguang.me 192.168.1.23 ng2
-
lamp1.laoguang.me 192.168.1.24 lamp1
-
lamp2.laoguang.me 192.168.1.25 lamp2
拓扑:
一.基本环境准备
ng1,ng2上安装nginx
lamp1,lamp2上构建LAMP或只安装httpd,我只安装了Httpd,这里不给大家演示了,有需要请看我的其它博文,更改lamp1,lamp2的index.html的内容分别为lamp1和lamp2,以容易区分,实际集群中内容应该是一致的,由共享存储提供。
二.ng1,ng2上安装配置keepalived
下载地址:http://www.keepalived.org/download.html
2.1 安装keepalived
-
tar xvf keepalived-1.2.7.tar.gz
-
cd keepalived-1.2.7
-
./configure --prefix=/usr/local/keepalived
-
##可能会提示安装popt-devel包,yum即可
-
make && make install
2.2 整理配置文件与脚本
-
mkdir /etc/keepalived
-
##keepalived默认配置文件从/etc/keepalived下读取
-
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
-
##就一个二进制文件,直接拷贝过去即可,多的话就更改PATH吧
-
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
-
##脚本的额外配置文件读取位置
-
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
-
##启动脚本你懂得
-
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
-
##我们关键的keepalived配置文件
2.3 修改ng1的/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
ibuler@qq.com ##出故障发送邮件给谁
}
notification_email_from keepalived@localhost ##故障用哪个邮箱发送邮件
smtp_server 127.0.0.1 ##SMTP_Server IP
smtp_connect_timeout 30 ##超时时间
router_id LVS_DEVEL ##服务器标识
}
vrrp_instance VI_1 {
##状态,都为BACKUP,它们会推选Master,如果你写MASTER,它就会是Master,
##当Master故障时Backup会成为Master,当原来的Master恢复后,原来的Master会成为Master
state BACKUP
interface eth0 ##发送VRRP的接口,仔细看你的是不是eth0
virtual_router_id 51 ##虚拟路由标识,同一个组应该用一个,即Master与Backup同一个
priority 100 ##重要的优先级哦
nopreempt ##不抢占,一个故障时,重启后恢复后不抢占意资源
advert_int 1 ##同步间隔时长
authentication { ##认证
auth_type PASS ##认证方式
auth_pass www.laoguang.me ##密钥
}
virtual_ipaddress {
192.168.1.18/24 dev eth0 ##VIP
}
}
##后面的删除吧,LVS上才有用
拷贝到ng2上一份,只修改priority 90 即可
-
scp /etc/keepalived/keepalived.conf 192.168.1.23:/etc/keepalived/
-
##Ng2上
-
vi /etc/keepalived/keepalived.conf priority 90 ##其它一致
2.4 ng1,ng2上启动keepalived
-
service keepalived start
查看日志
-
tail /var/log/messages
-
Nov 27 08:07:54 localhost Keepalived_vrrp[41871]: VRRP_Instance(VI_1) Entering BACKUP STATE
-
Nov 27 08:07:54 localhost Keepalived_vrrp[41871]: VRRP sockpool: [ifindex(2), proto(112), fd(11,12)]
-
Nov 27 08:07:54 localhost Keepalived_healthcheckers[41870]: Using LinkWatch kernel netlink reflector...
-
Nov 27 08:07:54 localhost Keepalived_vrrp[41871]: VRRP_Instance(VI_1) forcing a new MASTER election
-
Nov 27 08:07:55 localhost Keepalived_vrrp[41871]: VRRP_Instance(VI_1) Transition to MASTER STATE
-
Nov 27 08:07:56 localhost Keepalived_vrrp[41871]: VRRP_Instance(VI_1) Entering MASTER STATE
-
Nov 27 08:07:56 localhost Keepalived_vrrp[41871]: VRRP_Instance(VI_1) setting protocol VIPs.
-
Nov 27 08:07:56 localhost Keepalived_healthcheckers[41870]: Netlink reflector reports IP 192.168.1.18 added
-
Nov 27 08:07:56 localhost Keepalived_vrrp[41871]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.18
-
Nov 27 08:08:01 localhost Keepalived_vrrp[41871]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.18
查看vip绑定到哪台机器上了
-
ip addr ##ng1上
-
....省略
-
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
-
link/ether 00:0c:29:e8:90:0b brd ff:ff:ff:ff:ff:ff
-
inet 192.168.1.22/24 brd 192.168.1.255 scope global eth0
-
inet 192.168.1.18/32 scope global eth0
-
inet6 fe80::20c:29ff:fee8:900b/64 scope link
-
valid_lft forever preferred_lft forever
由此可知vip绑定到ng1上了
三,Keepalived测试
3.1 关闭ng1上的keepalived或者直接关闭ng1 查看vip转移情况
-
service keepalived stop
-
ip addr
-
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
-
link/ether 00:0c:29:e8:90:0b brd ff:ff:ff:ff:ff:ff
-
inet 192.168.1.22/24 brd 192.168.1.255 scope global eth0
-
inet6 fe80::20c:29ff:fee8:900b/64 scope link
-
valid_lft forever preferred_lft forever
3.2 查看ng2上是否绑定了vip
-
ip addr
-
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
-
link/ether 00:0c:29:dd:00:77 brd ff:ff:ff:ff:ff:ff
-
inet 192.168.1.23/24 brd 192.168.1.255 scope global eth0
-
inet 192.168.1.18/32 scope global eth0
-
inet6 fe80::20c:29ff:fedd:77/64 scope link
-
valid_lft forever preferred_lft forever
由此可知ip转移正常,keepalived设置成功
四.配置Nginx做反向代理
4.1 修改nginx配置文件
-
vi /etc/nginx/nginx.conf
-
user nginx nginx; ##运行nginx的用户和组
-
worker_processes 2; ##启动进程数
-
error_log /var/log/nginx/error.log notice; ##错误日志记录
-
pid /tmp/nginx.pid; ##pid存放位置
-
worker_rlimit_nofile 65535; ##线程最大打开文件数,须配合ulimit -SHn使用
-
events {
-
use epoll; ##工作模型
-
worker_connections 65536; ##单进程最大连接数
-
}
-
http { ##http模块
-
include mime.types; ##包含进来
-
default_type application/octet-stream; ##默认类型
-
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
-
'$status $body_bytes_sent "$http_referer" '
-
'"$http_user_agent" "$http_x_forwarded_for"';
-
##日志格式
-
access_log /var/logs/nginx/http.access.log main; ##访问日志
-
client_max_body_size 20m; ##最大请求文件大小
-
client_header_buffer_size 16k; ##来自客户端请求header_buffer大小
-
large_client_header_buffers 4 16k; ##较大请求缓冲个数与大小
-
sendfile on; ##内核空间直接发送到tcp队列
-
tcp_nopush on;
-
tcp_nodelay on;
-
keepalive_timeout 65; ##长连接时长
-
gzip on; ##启用压缩
-
gzip_min_length 1k; ##最小压缩大小
-
gzip_buffers 4 16k; ##压缩缓冲
-
gzip_http_version 1.1; ##支持协议
-
gzip_comp_level 2; ##压缩等级
-
gzip_types text/plain application/x-javascript text/css application/xml; ##压缩类型
-
gzip_vary on; ##前端缓存服务器可以缓存压缩过的页面
-
upstream laoguang.me { ##用upstream模块定义集群与RS
-
server 192.168.1.24:80 max_fails=3fail_timeout=10s; ##RS的地址,最大错误数与超时时间,超过了自动剔除
-
server 192.168.1.25:80 max_fails=3fail_timeout=10s;
-
}
-
server {
-
listen 80; ##监听端口
-
server_name 192.168.1.18; ##servername
-
root html; ##根目录
-
index index.html index.htm; ##你懂得
-
#charset koi8-r;
-
access_log logs/192.168.1.18.access.log main;
-
##这个server的访问日志
-
location / {
-
proxy_pass http://laoguang.me; ##反向代理
-
proxy_redirect off;
-
proxy_set_header X-Real-IP $remote_addr;
-
##真实客户ip告诉后端
-
proxy_set_header X-Forwarded-For Proxy_add_x_forwarded_for;
-
}
-
location /nginx {
-
access_log off;
-
stub_status on; ##状态页面
-
}
-
error_page 500 502 503 504 /50x.html;
-
location = /50x.html {
-
root html;
-
}
-
}
-
}
4.2 拷贝到ng2上一份
-
scp /etc/nginx/nginx.conf 192.168.1.23:/etc/nginx/
4.3 测试反向代理能否负载均衡
lamp1,lamp2启动httpd
-
service httpd start
ng1重启nginx
-
service nginx restart
用RealIp访问测试能否轮询
http://192.168.1.22
同样测试ng2,如果都能实现负载均衡,那么继续
五.测试keepalived与nginx配合运行
现在192.168.1.18在 ng2上, 访问 http://192.168.1.18 测试能否轮询
ng2上 service keepalived stop 访问测试 http://192.168.1.18 能否轮询
关闭lamp1上的service httpd stop 访问测试http://192.168.1.18 是否会报错
到此高可用webserver构建完毕,没有单点故障,任何一点故障不影响业务。
例子3
前言
Keepalived 是集群管理中保证集群高可用的一个服务软件,其功能类似于 heartbeat,用来防止单点故障。 本例演示 CentOS 7 下安装和配置 Keepalived 的基本步骤。
Keepalived 是以 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)协议为实现基础的,这个协议可以认为是实现了路由器高可用的协议,将多台提供相同功能的路由器组成一个路由器组。
- 这里面有一个 MASTER 和多个 BACKUP;
- MASTER 上面有一个对外提供服务的 Virtual IP(VIP);
- MASTER 会发组播,当 BACKUP 收不到 VRRP 包时就认为 MASTER 宕机
- 这时需要根据 VRRP 优先级来选举一个 BACKUP 为 MASTER,这样就保证路由器的正常使用了。
环境说明
CentOS 7(Minimal Install)
$ cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
本例演示环境如下
Name | IP Addr | Descprition |
---|---|---|
VIP | 10.0.0.10 | 虚拟 IP |
MASTER | 10.0.0.11 | 主服务器 IP |
BACKUP | 10.0.0.12 | 备服务器 IP |
本例安装 Nginx,使用浏览器查看效果。
步骤
步骤 1: 安装
Keepalived 可以使用 yum 直接安装,在 master 服务器和 backup 服务器执行:
$ sudo yum install keepalived
安装 Nginx, 参考 Install Nginx Binary Releases 。
步骤 2: 配置 Master 服务器
先确认网卡
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 80:18:44:e8:b3:18 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.11/24 brd 10.0.0.255 scope global em1
valid_lft forever preferred_lft forever
inet6 fe80::8218:44ff:fee8:b318/64 scope link
valid_lft forever preferred_lft forever
3: em2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000
link/ether 80:18:44:e8:b3:19 brd ff:ff:ff:ff:ff:ff
本例使用 em1 这块网卡。
$ sudo vi /etc/keepalived/keepalived.conf
如下配置
! Configuration File for keepalived
global_defs {
notification_email {
# email 接收方
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
# email 发送方
notification_email_from Alexandre.Cassen@firewall.loc
# 邮件服务器, smtp 协议
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id app2
vrrp_skip_check_adv_addr
# 使用 unicast_src_ip 需要注释 vrrp_strict,而且也可以进行 ping 测试
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# vrrp实例
vrrp_instance VI_1 {
# 指定 keepalived 的角色,MASTER 表示此主机是主服务器,BACKUP 表示此主机是备用服务器
state MASTER
# 指定网卡
interface em1
# 虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。
# 即同一vrrp_instance下,MASTER和BACKUP必须是一致的
virtual_router_id 51
# 定义优先级,数字越大,优先级越高(0-255)。
# 在同一个vrrp_instance下,MASTER 的优先级必须大于 BACKUP 的优先级
priority 100
# 设定 MASTER 与 BACKUP 负载均衡器之间同步检查的时间间隔,单位是秒
advert_int 1
# 如果两节点的上联交换机禁用了组播,则采用 vrrp 单播通告的方式
unicast_src_ip 10.0.0.11
unicast_peer {
10.0.0.12
}
# 设置验证类型和密码
authentication {
#设置验证类型,主要有PASS和AH两种
auth_type PASS
#设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
#设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
virtual_ipaddress {
# 虚拟 IP
10.0.0.10/24 brd 10.0.0.255
}
}
# 虚拟服务器端口配置
virtual_server 10.0.0.10 80 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 10.0.0.11 80 {
weight 1
}
}
本配置中,最后设置了虚拟 IP 的 80 端口,指向了本地的 80 端口。
步骤 3: 配置 BACKUP 服务器
BACKUP 配置基本跟 MASTER 一致,主要有部分变动
$ sudo vi /etc/keepalived/keepalived.conf
注意以下几点
- state 角色为 BACKUP
- interface 为网卡的 ID,要根据机器确认
- virtual_route_id 要与 MASTER 一致,默认为 51
- priority 要比 MASTER 小
- unicast_src_ip 要设置正确,组播地址设置之后,要注释 vrrp_strict 选项
变动如下
! Configuration File for keepalived
...
...
# vrrp实例
vrrp_instance VI_1 {
# 指定 keepalived 的角色,BACKUP 表示此主机是备用服务器
state BACKUP
# 确认网卡的 ID
interface em1
# 即同一vrrp_instance下,MASTER 和 BACKUP 必须是一致的
virtual_router_id 51
# 比 MASTER 小
priority 99
...
...
# 如果两节点的上联交换机禁用了组播,则采用 vrrp 单播通告的方式
unicast_src_ip 10.0.0.12
unicast_peer {
10.0.0.11
}
...
...
}
# 虚拟服务器端口配置
virtual_server 10.0.0.10 80 {
...
...
real_server 10.0.0.12 80 {
weight 1
}
}
步骤 4: 配置并启动服务
配置 IP 转发
$ sudo echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
$ sudo sysctl -p
防火墙添加规则,因为 VRRP 使用 224.0.0.18
这个组播地址
$ sudo firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface em1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
success
$ sudo firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface em1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
success
$ sudo firewall-cmd --reload
success
可以查看一下这两条规则
$ sudo firewall-cmd --direct --get-rules ipv4 filter INPUT
0 --in-interface em1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
$ sudo firewall-cmd --direct --get-rules ipv4 filter OUTPUT
0 --out-interface em1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
启动 MASTER 和 BACKUP 的 keepalived 服务
$ sudo systemctl start keepalived
设置开机启动
$ sudo systemctl enalbe keepalived
此时查看 MASTER 的网卡
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 80:18:44:e8:b3:18 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.11/24 brd 10.0.0.255 scope global em1
valid_lft forever preferred_lft forever
inet 10.0.0.10/24 brd 10.0.0.255 scope global secondary em1
valid_lft forever preferred_lft forever
inet6 fe80::8218:44ff:fee8:b318/64 scope link
valid_lft forever preferred_lft forever
3: em2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000
link/ether 80:18:44:e8:b3:19 brd ff:ff:ff:ff:ff:ff
可以发现 MASTER 服务器的 em1 网卡上多了 10.0.0.10
这个虚拟 IP 地址。
漂移规则如下:
- 默认使用 MASTER 服务器(
10.0.0.11
),虚拟 IP 为10.0.0.10
,此时 MASTER 服务器会有 2 个IP。 - 当 MASTER 出问题时,IP 会漂移到 BACKUP 服务器(
10.0.0.12
),此时 BACKUP 服务器会有 2 个IP。 - 当 MASTER 重新启动后,虚拟 IP 又会漂移回 MASTER 服务器。
步骤 5: 服务测试
查看 IP 的变化可用如下命令(MASTER 和 BACKUP 都在线):
在 MASTER 服务器上执行
$ sudo tcpdump -i em1 vrrp -n
02:16:07.739305 IP 10.0.0.11 > 10.0.0.12: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
02:16:08.740362 IP 10.0.0.11 > 10.0.0.12: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
02:16:09.741401 IP 10.0.0.11 > 10.0.0.12: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
...
...
这表明 MASTER 在向 BACKUP 广播,MASTER 在线。此时虚拟 IP 时挂在 MASTER 上的,如果想退出, 按 Ctrl+C
。
如果 MASTER 停止 keepalived,虚拟 IP 会漂移到 BACKUP 服务器上。
我们可以测试一下:
首先,停止 MASTER 的 keepalived
$ sudo systemctl stop keepalived
然后,在 MASTER 服务器上查看 VRRP 服务
$ sudo tcpdump -i em1 vrrp -n
02:19:08.874676 IP 10.0.0.12 > 10.0.0.11: VRRPv2, Advertisement, vrid 51, prio 99, authtype simple, intvl 1s, length 20
02:19:09.875710 IP 10.0.0.12 > 10.0.0.11: VRRPv2, Advertisement, vrid 51, prio 99, authtype simple, intvl 1s, length 20
02:19:10.876742 IP 10.0.0.12 > 10.0.0.11: VRRPv2, Advertisement, vrid 51, prio 99, authtype simple, intvl 1s, length 20
...
...
这表明 MASTER 收到 BACKUP 的广播,此时虚拟 IP 时挂在 BACKUP 服务器上。
步骤 6: 配置日志
注意
此配置为可选步骤。
keepalived 默认将日志输出到系统日志/var/log/messages
中,因为系统日志很多,查询问题时相对麻烦。
我们可以将 keepalived 的日志单独拿出来,这需要修改日志输出路径。
修改 Keepalived 配置
$ sudo vi /etc/sysconfig/keepalived
更改如下:
# Options for keepalived. See `keepalived --help' output and keepalived(8) and
# keepalived.conf(5) man pages for a list of all options. Here are the most
# common ones :
#
# --vrrp -P Only run with VRRP subsystem.
# --check -C Only run with Health-checker subsystem.
# --dont-release-vrrp -V Dont remove VRRP VIPs & VROUTEs on daemon stop.
# --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.
# --dump-conf -d Dump the configuration data.
# --log-detail -D Detailed log messages.
# --log-facility -S 0-7 Set local syslog facility (default=LOG_DAEMON)
#
KEEPALIVED_OPTIONS="-D -d -S 0"
把 KEEPALIVED_OPTIONS=”-D” 修改为 KEEPALIVED_OPTIONS=”-D -d -S 0”,其中 -S 指定 syslog 的 facility
修改 /etc/rsyslog.conf
末尾添加
$ sudo vi /etc/rsyslog.conf
local0.* /var/log/keepalived.log
重启日志记录服务
$ sudo systemctl restart rsyslog
重启 keepalived
$ sudo systemctl restart keepalived
此时,可以从 /var/log/keepalived.log
查看日志了。
结论
本文演示了 CentOS 7 下 Keepalived 的安装,配置虚拟 IP 地址,,启动服务等。
参考资料
keepalived实现双机热备
centos7 keepalived以及防火墙配置
Keepalived日志
转自:https://qizhanming.com/blog/2018/05/17/how-to-config-keepalived-on-centos-7