nginx+keepalived配置踩过的坑

学习搭建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都要配置
  • 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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值