第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"
- 参数说明:
- -d:--dump-conf,导出备份配置数据
- -D:--log-detail,详细日志
- -S:--log-facility,设置本地的syslog设备,编号0-7(default=LOG_DAEMON)
- -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
- 配置说明:
- 42行:表示来自local0设备的所有日志信息不再记录于/var/log/messages中。
- 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进行轮询,防止单个日志文件过大。
