关于keepalived高可用集群的相关问题
一 . 遇到的问题
1. vip 一直在主上, 不会飘到备上
查看keepalived的配置 keepalived.conf
注意点:
① router_id 主备要一样
② virtual_router_id 主备必须一样
③ priority 主备要不一样
④ weight 主备必须不一样
router_id局域网内唯一,主备机不同;virtual_router_id主备机配置一致;priority主机高于备份机; virtual_ipaddress主备机一致
keepalived相关参数
# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
## keepalived 自带的邮件提醒需要开启 sendmail 服务。 建议用独立的监控或第三方 SMTP
router_id liuyazhuang133 ## 标识本节点的字条串,通常为 hostname
}
## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径
interval 2 ## 检测时间间隔
weight -20 ## 如果条件成立,权重-20
}
## 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state MASTER ## 主节点为 MASTER, 对应的备份节点为 BACKUP
interface eth0 ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同, 我的是 eth0
virtual_router_id 33 ## 虚拟路由的 ID 号, 两个节点设置必须一样, 可选 IP 最后一段使用, 相同的 VRID 为一个组,他将决定多播的 MAC 地址
mcast_src_ip 192.168.50.133 ## 本机 IP 地址
priority 100 ## 节点优先级, 值范围 0-254, MASTER 要比 BACKUP 高
nopreempt ## 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样, 默认 1s
## 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass 1111 ## 真实生产,按需求对应该过来
}
## 将 track_script 块加入 instance 配置块
track_script {
chk_nginx ## 执行 Nginx 监控的服务
} #
# 虚拟 IP 池, 两个节点设置必须一样
virtual_ipaddress {
192.168.50.130 ## 虚拟 ip,可以定义多个
}
}
注意:对于virtual_router_id
对于一个主机里的keepalived配置
两个网卡不在一个vlan,virtual_router_id可以一样
反之,两个网卡在一个vlan 上,则virtual_router_id 一定要不一样
如果1个网卡上有多个ip, 也不能一样
如图:


2 . 主上有VIP,飘不到备上
大概率是keepalived相关参数 主备两台参数问题(不一致或者一致)
实际环境中出错情况:
(1).keepalived 报错WARNING - default user ‘keepalived_script‘ for script execution does not exist - please
解决办法:
在配置文件中添加运行健康检查脚本的用户或者组
global_defs {
#添加以下参数即可
script_user root
enable_script_security
}
(2). tcpdump: Couldn't find user 'tcpdump'
解决方法
网上找到的答案清一色的chattr -i /etc/passwd,然后卸载重装。
其实可以直接vim /etc/passwd加入以下一行:
tcpdump:x:72:72::/:/sbin/nologin
UID 72存在,就使用 1~499 范围内的其他数字。
3 . 两台主备上 都有VIP
网络和配置环境:
1、自带防火墙和iptables均已关闭
2、selinux已关闭
3、vmware虚拟机网络连接方式:NAT
4、virtual_router_id主备都确保一致
5、检查nginx状态的track_script中用到的killall命令已安装,且权限是755
6、内核ipv4转发已开启 net.ipv4.ip_forward = 1
通过抓包查找解决问题
42 是主 44 是备
理论上来说,主机处于活跃状态的时候,备份机收到报文之后是不会发送组播消息的,正常的应该是由MASTER服务器发送组播,如果BACKUP收不到MASTER的组播信号了,那么判定MASTER宕机了,BACKUP就会接手VIP。如下图 :是正常的,只有主机发消息, 相应的备份机也一样,只有备份机在发消息

理论上备节点如果收到主节点的通告,通告中优先级高于自己,就不会主动对外发送通告;
确定主备是否有问题的方法:
1. 抓包时, 在备份机上需要看见主机的包,也就是备份机要收到主机的包,会对比包上的权重
2. 查看 主备机 能否收到 vrrp协议的包 采用src 对端ip的方式 组播 没有目的地址
ebdump -i eth1 vrrp -n and src 172.29.228.44
eth1 是主上的网卡 eth0是备上的网卡
如图: 表示 主42的网卡 eth1 收不到对端IP 备44 发的消息

备也同理 可查看
ebdump -i eth0 vrrp -n and src 172.29.228.42
通过抓包分析出 , 备没有收到主的 组播,导致自动升级成主,产生两个主,然后查看虚拟层的安全组设置中vrrp协议的规则是否生效, 发现虚拟层虽然配置了vrrp协议的规则,但并未生效。
于是在虚拟层后台手动将指定的网卡取消安全组(也就是将主的eth1和备的eth0 vrrp协议通信网卡 的安全组关掉)
openstack port set --disable-port-security --no-security-group portID
在配置正确情况下 如图所示:
在备上

遇到这种情况也可以采取查看keepalived 日志的方式
一般日志在 /var/log/messages 或者 /var/log/message
如果主备上都有vip , 一般原因是:
查看BACKUP日志发现根本没有receive advertisement之类的收到VRRP的日志,启动之后的日志产生了之后就再也没有收发VRRP的日志了,由于BACKUP已经变成了MASTER,BACKUP也会向MASTER发送组播,但看了下MASTER的日志也没有任何消息。
分析:BACKUP启动时收不到MASTER的VRRP组播,自动升级成MASTER,产生两个MASTER,查看BACKUP日志也没有任何收到VRRP组播的日志,由于两台机的网卡是可以收到VRRP包的,但不知道是不是CentOS系统没放行VRRP,但自带防火墙和iptables都已经关闭了,大部分情况是 安全组规则没生效 或者 centos有问题
设置keepalived的自启动
keepalived 服务开机自启动
systemctl enable keepalived.service
systemctl disable keepalived.service 取消开机自动启动
systemctl start keepalived.service 启动
systemctl stop keepalived.service停止
systemctl status keepalived.service

keepalived启动后默认去这个(/etc/keepalived/keepalived.conf)位置读取配置文件,除非另行制定,需要将安装文件下带的配置文件拷贝过去。
创建keepalived.service文件
编辑
vim /usr/lib/systemd/system/keepalived.service
[Unit]
Description=Keepalived
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/var/run/keepalived.pid
ExecStart=/home/wangpl/mine/soft/keepalived-1.2.2/sbin/keepalived -D
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
PIDFile=/var/run/keepalived.pid 这个路径是keepalived默认存放pid的位置。
<pre name="code" class="java">ExecStart=/home/wangpl/mine/soft/keepalived-1.2.2/sbin/keepalived 这个是keepalived的启动文件 -D的意思是 输出详细日志
实例:

关于tcpdump的用法:
ebdump -i eth1 vrrp -n host 172.29.228.42 and 172.29.228.44
ebdump -i eth0 host 224.0.0.18 and \( 172.29.228.42 or 172.29.228.44 \)
ebdump -i eth0 -n '((vrrp) and (src host 172.29.228.44))'
ebdump -i \( eth1 or eth0 \) -n host 172.29.228.42 and 172.29.228.44
ebdump -i eth1 or eth0 -n host 172.29.228.42 and 172.29.228.44
ebdump -i eth1 and eth0 -n host 172.29.228.42 and 172.29.228.44
ebdump -i eth0 dst vrrp host 172.29.228.42
ebdump -i eth1 vrrp -n and dst host 172.29.228.42
ebdump -i eth1 vrrp -n and src 172.29.228.42
ebdump -i eth0 -n host 172.29.228.44
ebdump -i et01 vrrp -n
ebdump -i eth0 vrrp -n and src 172.29.228.42
ebdump -i eth0 dst host 172.29.228.42
解决相关问题的方法:
更多推荐
所有评论(0)