Keepalived优化(三)

第1章 解决服务监听的网卡上不存在IP地址的问题

1.1 问题介绍

如果配置 “listen 10.0.0.12:80;”的方式指定IP监听服务,而本地网卡上没有10.0.0.12这个IP,Nginx就会报错:

[root@lb02 ~]# nginx -s stop
[root@lb02 ~]# nginx
nginx: [emerg] bind() to 10.0.0.12:80 failed (99: Cannot assign requested address)

如果要实施双卡即主备同时跑不同的业务,配置文件里指定了IP监听,备节点则会因为网卡实际不存在VIP也报错。

1.2 问题原因

出现上面问题的原因就是在物理网卡上没有与配置文件里监听的IP相对应的IP。

1.3 解决办法

1.3.1 临时方法

更改 /proc/sys/net/ipv4/ip_nonlocal_bind文件内容为1。

echo "1" >/proc/sys/net/ipv4/ip_nonlocal_bind

1.3.2 永久方法

是在/etc/sysctl.cof中加入“net.ipv4.ip_nonlocal_bind = 1”

[root@lb02 ~]# echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
[root@lb02 ~]# tail -1 /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1  #此项表示启动nginx而忽略配置中监听的VIP是否存在,同样适用于Haproxy
[root@lb02 ~]# sysctl -p       #使配置生效

第2章 解决高可用服务只针对物理服务器的问题

2.1 问题介绍

默认情况下Keepalived软件仅针对服务器宕机(即物理停机)或Keepalived服务停掉的时候才会接管业务,但是实际工作中,如果只是服务器中某个业务(服务)停止了而服务器仍然运作的时候,Keepalived是不会切换备用主机的,这就会导致用户访问的VIP无法找到对应的服务。

2.2 解决方法

2.2.1 方法一:写守护进程脚本处理

当Nginx业务有问题时就停掉本地的Keepalived服务,实现IP漂移到备用服务器继续提供服务。

2.2.1.1 编写脚本

[root@lb01 ~]# vim /server/scripts/check_nginx.sh
#!/bin/bash

while true
do
    if [ `netstat -lntup|grep -c nginx` -ne 1 ];then
        /etc/init.d/keepalived stop
    fi
    sleep 5
done
  • 脚本说明:

此脚本的基本思想是若没有80端口存在就停掉Keepalived服务实现释放本地的VIP。

2.2.1.2 后台执行脚本并检查

[root@lb01 ~]# sh /server/scripts/check_nginx.sh &
[1] 33909
[root@lb01 ~]# ps -ef | grep check
root      33909  33843  0 19:27 pts/2    00:00:00 sh /server/scripts/check_nginx.sh
root      33927  33843  0 19:27 pts/2    00:00:00 grep check

2.2.1.3 确认Nginx和Keepalived服务正常

[root@lb01 ~]# netstat -lntup | grep 80
tcp        0      0 10.0.0.12:80                0.0.0.0:*                   LISTEN      32679/nginx        
[root@lb01 ~]# service keepalived status
keepalived (pid  33894) is running...

2.2.1.4 模拟Nginx服务挂掉

[root@lb01 ~]# nginx -s stop
[root@lb01 ~]# Stopping keepalived:                        [  OK  ]     #停掉nginx后此处提示输出

[root@lb01 ~]# service keepalived status
keepalived is stopped
[root@lb01 ~]# netstat -lntup | grep 80

[root@lb02 ~]# ip addr | grep 10.0.0.12                 #此时备节点已经接管业务
    inet 10.0.0.12/24 scope global secondary eth0:1

2.2.2 方法二:使用Keepalived的配置文件参数触发写好的检测服务脚本

2.2.2.1 监测脚本示例

[root@lb01 ~]# vim /server/scripts/chk_nginx_proxy.sh
#!/bin/bash

if [ `netstat -lntup|grep -c nginx` -ne 1 ];then
     /etc/init.d/keepalived stop
fi

2.2.2.2 检测脚本增加执行权限

[root@lb01 ~]# chmod +x /server/scripts/ chk_nginx_proxy.sh
[root@lb01 ~]# ll /server/scripts/chk_nginx_proxy.sh
-rwxr-xr-x 1 root root 99 Sep 18 19:35 /server/scripts/chk_nginx_proxy.sh

2.2.2.3 编辑keepalived配置文件

[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from Alexandre.Cassen@firew
all.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb01
}

vrrp_script chk_nginx_proxy {
    script "/server/scripts/chk_nginx_proxy.sh"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 55
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.12/24 dev eth0 label eth0:1
    }

    track_script {
        chk_nginx_proxy
    }
}

2.2.2.4 检查nginx和keepalived状态

[root@lb01 ~]# lsof -i:80
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   34921  root    6u  IPv4  78788      0t0  TCP 10.0.0.12:http (LISTEN)
nginx   34922 nginx    6u  IPv4  78788      0t0  TCP 10.0.0.12:http (LISTEN)
[root@lb01 ~]# service keepalived status
keepalived (pid  34943) is running...

2.2.2.5 实验测试

[root@lb01 ~]# nginx -s stop                #模拟nginx服务意外停止
[root@lb02 ~]# ip addr | grep 10.0.0.12     #已经切换为备节点
    inet 10.0.0.12/24 scope global secondary eth0:1

第3章 解决多组Keepalived服务器在一个局域网的冲突问题

3.1 问题介绍

当在同一个局域网内部署了多组Keepalived服务器对,而又未使用专门的心跳线通信时,可能会发生高可用接管的严重故障问题。如果同一局域网内存在多组Keepalived服务器对就会造成IP多播地址冲突问题,导致接管错乱,不同组的Keepalived都会使用默认的224.0.0.18作为多播地址。

3.2 解决办法

在同组的Keepalived服务器所有的配置文件中指定独一无二的多播地址。配置如下:

global_defs {
router_id LVS_19
vrrp_mcast_group4 224.0.0.19    #这里指定多播地址的配置
}
提示:1、不同的实例的通信认证密码也最好不同,确保接管正常。
2、Heartbeat如果采用多播方式实现主备通信,同样会有多播地址冲突问题。

第4章 配置指定文件接收Keepalived服务日志

4.1 问题介绍

默认情况下Keepalived服务日志会输出到系统日志/var/log/messages,和其他日志信息混合在一起很不方便,可以将其调整成由独立的文件记录Keepalived服务日志。

4.2 修改方法:

4.2.1 编辑配置文件/etc/sysconfig/keepalived

将第14行的 KEEPALIVED_OPTIONS="-D" 修改为 KEEPALIVED_OPTIONS="-D -d -S 0"

[root@lb01 ~]# sed -i '14s#KEEPALIVED_OPTIONS="-D"#KEEPALIVED_OPTIONS="-D -d -S 0"#g' /etc/sysconfig/keepalived
[root@lb01 ~]# sed -n '14p' /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -d -S 0"
  • 参数说明:
  1. -d:–dump-conf,导出备份配置数据
  2. -D:–log-detail,详细日志
  3. -S:–log-facility,设置本地的syslog设备,编号0-7(default=LOG_DAEMON)
  4. -S 0:表示指定为local 0 设备

4.2.2 修改rsyslog的配置文件

在第42行结尾添加“;local0.none”

在结尾加入一行“local0.* /var/log/keepalived.log”

[root@lb01 ~]# vim /etc/rsyslog.conf

42 *.info;mail.none;authpriv.none;cron.none;local0.none                /var/log/messages

82 #keepalived
83 local0.*        /var/log/keepalived.log
  • 配置说明:
  1. 42行:表示来自local0设备的所有日志信息不再记录于/var/log/messages中。
  2. 83行:表示来自local0设备的所有日志信息都记录到/var/log/keepalived.log文件。

4.2.3 重启rsyslog服务

[root@lb01 ~]# /etc/init.d/rsyslog restart
Shutting down system logger:                    [  OK  ]
Starting system logger:                         [  OK  ]

4.2.4 测试Keepalived日志记录结果

重启keepalived服务后就会把日志信息输出到rsyslog定义的/var/log/keepalived.log文件中。

[root@lb01 ~]# service keepalived restart       #此处需执行重启操作,不可平滑重启
Stopping keepalived:                                       [  OK  ]
Starting keepalived:                                       [  OK  ]
[root@lb01 ~]# tail -5 /var/log/keepalived.log
Sep 18 17:37:15 lb01 Keepalived_healthcheckers[33034]: Removing service [192.168.201.100]:443 from VS [192.168.200.100]:443
Sep 18 17:37:15 lb01 Keepalived_healthcheckers[33034]: Lost quorum 1-0=1 > 0 for VS [192.168.200.100]:443
Sep 18 17:37:15 lb01 Keepalived_healthcheckers[33034]: SMTP connection ERROR to [127.0.0.1]:25.
Sep 18 17:37:19 lb01 Keepalived_healthcheckers[33034]: Timeout connect, timeout server [192.168.200.5]:1358.
Sep 18 17:37:36 lb01 Keepalived_healthcheckers[33034]: Timeout connect, timeout server [192.168.200.4]:1358.
提示:还可以设置对/var/log/keepalived.log进行轮询,防止单个日志文件过大。
温馨提示:本文最后更新于2022-12-20 20:57:54,已超过486天没有更新。某些文章具有时效性,若文章内容或图片资源有错误或已失效,请联系站长。谢谢!
转载请注明本文链接:https://blog.leonshadow.cn/763482/340.html
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享