学习搭建nginx高可用集群过程中的一些问题,通过搜索资料解决了,记录一下
(1)安装
yum -y install keepalived
安装出现以下错误,参考https://blog.csdn.net/weixin_44015158/article/details/118616360解决:
2:postfix-2.10.1-6.el7.x86_64 有缺少的需求 libmysqlclient.so.18()(64bit)
2:postfix-2.10.1-6.el7.x86_64 有缺少的需求 libmysqlclient.so.18(libmysqlclient_18)(64bit)
-
原因:没有安装mysql-community-libs-compat-5.7.26-1.el7.x86_64.rpm
-
解决方案:到安装mysql的目录中执行:
-
rpm -ivh mysql-community-libs-compat-5.7.26-1.el7.x86_64.rpm
1:libkkc-0.3.1-9.el7.x86_64 有缺少的需求 libmarisa.so.0()(64bit)
-
原因:centos7.6自带的类mysql数据库是mariadb,会跟mysql冲突,删除了mariadb
-
解决方案:单纯下载一个 marisa-0.2.4-4.el7.x86_64.rpm 而不去装整个mariadb
-
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/marisa-0.2.4-4.el7.x86_64.rpm rpm -ivh marisa-0.2.4-4.el7.x86_64.rpm
(2)配置主机
#/etc/keepalived/keepalived.conf
#全局配置
global_defs {
#设置主机
smtp_server 192.xxx.xxx.x
#设置虚拟机与主机连接超时时间
smtp_connect_timeout 30
#唯一标识信息,可以设置为/etc/hosts中配置的主机名
router_id host01
#设置脚本的用户为root
script_user root
#开启脚本安全模式
enable_script_security
}
#脚本配置
vrrp_script chk_http_port
{
#设置监控脚本
script "/usr/local/src/nginx_check.sh"
#设置监控脚本执行间隔
interval 2
#监控脚本执行异常则-20权重
weight -20
}
#vrrp实例配置
vrrp_instance VI_1 {
#设置状态,主机MASTER、从机BACKUP
state MASTER
#接口,也就是物理网卡,主从可以设置同名的网卡
interface ens33
#虚拟路由器的id,主从必须相同
virtual_router_id 51
#设置本机优先级为100,可以为0~254,主要比从高
priority 100
#组播信息发送间隔,也就是心跳时间,两个节点设置必须一样,默认 1s
advert_int 1
#设置验证信息,主从必须一致
authentication {
#设置验证类型,主要有PASS和AH两种
auth_type PASS
#设置验证密码,同一个vrrp_instance下,MASTER和BACKUP的密码必须一致才能正常通信
auth_pass 1111
}
#设置虚拟路由器地址,即vip漂移地址
virtual_ipaddress {
192.xxx.xxx.x
}
#引入脚本,名字比如与上面一致,如果不加,脚本不会运行
track_script {
chk_http_port
}
}
#/usr/local/src/nginx_check.sh
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
#判断Nginx是否存活,如果不存活则尝试启动Nginx
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
#等待2秒后再次获取Nginx状态,该值应该要不大于nginx_check.sh中执行脚本的interval
sleep 2
#再次判断,如果Nginx还不存活则停止keepalived,让地址进行漂移,并退出脚本
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
(3)配置从机
#/etc/keepalived/keepalived.conf
#全局配置
global_defs {
#设置主机
smtp_server 192.xxx.xxx.x
#设置虚拟机与主机连接超时时间
smtp_connect_timeout 30
#标识信息,可以设置为/etc/hosts中配置的主机名
router_id host02
#添加运行健康检查脚本的用户或者组
script_user root
enable_script_security
}
#脚本配置
vrrp_script chk_http_port
{
#设置监控脚本
script "/usr/local/src/nginx_check.sh"
#设置监控脚本执行间隔
interval 2
#监控脚本执行异常则-20权重
weight -20
}
#vrrp实例配置
vrrp_instance VI_1 {
#设置状态,主机MASTER、从机BACKUP
state BACKUP
#接口,也就是物理网卡,主从可以设置同名的网卡
interface ens33
#虚拟路由器的id,主从必须相同
virtual_router_id 51
#设置本机优先级为100,可以为0~254,主要比从高
priority 80
#组播信息发送间隔,也就是心跳时间,两个节点设置必须一样,默认 1s
advert_int 1
#设置验证信息,主从必须一致
authentication {
#设置验证类型,主要有PASS和AH两种
auth_type PASS
#设置验证密码,同一个vrrp_instance下,MASTER和BACKUP的密码必须一致才能正常通信
auth_pass 1111
}
#设置虚拟路由器地址,即vip漂移地址,可以为多个,一行一个
virtual_ipaddress {
192.xxx.xxx.x
}
#引入脚本,名字比如与上面一致,如果不加,脚本不会运行
track_script {
chk_http_port
}
}
#/usr/local/src/nginx_check.sh
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
#判断Nginx是否存活,如果不存活则尝试启动Nginx
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
#等待2秒后再次获取Nginx状态,该值应该要不大于nginx_check.sh中执行脚本的interval
sleep 2
#再次判断,如果Nginx还不存活则停止keepalived,让地址进行漂移,并退出脚本
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
(4)踩坑历程
-
**global_defs中要添加运行健康检查脚本的用户或者组,不然会报错。**参考https://blog.csdn.net/u013302898/article/details/107169682/、https://blog.csdn.net/Kangyucheng/article/details/110122893
WARNING - default user ‘keepalived_script‘ for script execution does not exist - please global_defs { #添加以下参数即可 script_user root enable_script_security } -
**vrrp_script开始和结尾的{}要独占一行。**参考https://blog.csdn.net/zhmailm/article/details/81905739、https://blog.csdn.net/heiYeBuZaiLai/article/details/106352914
-
interval 2后面不能有空格。

- 大括号前必须有空格隔开。
- **必须要在vrrp_instance中通过track_script引入脚本。**参考https://blog.csdn.net/natureqiu/article/details/117887620
- **windows和linux里面的换行符不一样导致脚本出错的问题。**可以用vim打开文件,在命令行模式下输入set ff=unix设置代码模式,然后输入:wq保存代码。再次查看发现代码变成了unix。同样参考上面的https://blog.csdn.net/natureqiu/article/details/117887620

-
/usr/local/src/nginx_check.sh脚本需要有可执行权限。
chmod 744 /usr/local/src/nginx_check.sh -
**解决selinux阻止脚本开启nginx。修改/etc/selinux/config文件将SELINUX=enforcing改成disabled,然后重启。**参考https://blog.csdn.net/Bb15070047748/article/details/106276491、https://blog.51cto.com/bguncle/957315,更多selinux知识参考https://blog.csdn.net/yanjun821126/article/details/80828908

-
**防火墙开启指定网卡的vrrp协议,如果不开启主从无法通过组播检测对方心跳信息,从而抢占vip,导致脑裂现象。**参考https://blog.csdn.net/liu1160848595/article/details/104653226、https://blog.csdn.net/ichen820/article/details/113408400、https://blog.csdn.net/weixin_44619313/article/details/111838236
sudo tcpdump -i ens33 vrrp -n #抓包查看,如果主从轮询往224.0.0.18(vrrp的组播地址)发送报文,则问题锁定在主备机与组播ip之间的通信问题上。理论上来说,主机处于活跃状态的时候,备份机收到报文之后是不会发送组播消息的,这个很明显就是备份机没收到主机的组播报文。 #防火墙开启指定网卡的vrrp协议 firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT #刷新防火墙 firewall-cmd --reload;- 针对无法检测对方心跳的信息,参考https://bbs.csdn.net/topics/380230947/、http://www.splaybow.com/post/linux-wangka-hunza-moshi.html将网卡ens33开启混杂模式,但是问题并没有解决
- 另外,参考https://www.cnblogs.com/xiaobaozi-95/p/11497295.html、https://www.cnblogs.com/arsn/p/13443158.html,可以将组播改为单播,在没开启防火墙做单播无法解决脑裂现象,开启防火墙后未尝试。
-
keepalived更多详细使用参照:https://blog.51cto.com/u_13322786/2162618(双主配置)
-
大部分踩坑可参考:https://blog.csdn.net/weixin_44619313/article/details/111838236
-
查看keepalived日志以及修改日志位置:https://blog.csdn.net/weixin_43135696/article/details/115609374
(5)其他配置说明
- 1⃣️ 脚本的目的是为了防止脑裂现象:
- 由于某些原因,导致两台keepalived高可用服务器在指定的时间内,无法检测到对方存活心跳信息,从而导致互相抢占对方的资源和服务所有权,然而此时两台服务器都还有存活。可能的原因有:
- 服务器网线松动等故障
- 服务器硬件故障损坏而崩溃
- 主备都开启了firewalld防火墙
- 当Nginx宕机,会导致用户请求失败,但是keepalived不会进行切换
- 所以要编写一个检测nginx存活状态都脚本,如果nginx不存在,则kill掉宕机的nginx主机上的keepalived
- 对所有keepalived都要配置
- 由于某些原因,导致两台keepalived高可用服务器在指定的时间内,无法检测到对方存活心跳信息,从而导致互相抢占对方的资源和服务所有权,然而此时两台服务器都还有存活。可能的原因有:
- 2⃣️ vrrp_script脚本中weight这个值必须指定,否则有时候重启服务后该节点被显示为fault 状态。weight值分为正值和负值,假定weight值为W,初始的优先级为P。https://blog.csdn.net/qq_41814635/article/details/84166700
- 当weight值小于0时:
- 如果检测脚本返回值=0,则节点最终优先级不改变;
- 如果检测脚本返回值≠0,则节点最终优先级=P-W,优先级会减小。
- 当weight值大于0时:
- 如果检测脚本返回值=0,则节点最终优先级=P+W,优先级会增加;
- 如果检测脚本返回值≠0,则节点最终优先级不改变。
- 其他参考:如果未设置weight时,weight默认值为0,此时当vrrp_script连续检测失败时,vrrp实例进入FAULT状态。会导致VIP转移。https://blog.csdn.net/qq_33317586/article/details/84262120
- shell脚本返回值为0则执行成功,其他返回值参照https://www.jb51.net/article/141998.htm
- 当weight值小于0时:
1320

被折叠的 条评论
为什么被折叠?



