Keepalived实现nginx主备切换(一)

nginx+keepalived配置

基本配置

  • 两台CentOS 7,192.168.1.2192.168.1.3,2为主,3为辅
  • 虚拟ip:192.168.1.1
  • keepalive使用vrrp协议
  • 配置文件使用rsync+crontab单向同步

环境准备

  • 最小安装CentOS7
  • yum update -y
  • yum install vim wget -y
  • 关闭selinux
  • 安装zabbix-agent

Keepalived安装

使用编译安装,不复杂,参考以下就行了。

记得一定要打开防火墙!

wget https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
tar xvzf keepalived-2.2.7.tar.gz 
cd keepalived-2.2.7
yum install gcc* openssl-devel libnl-devel net-snmp net-snmp-devel
./configure --enable-snmp --enable-snmp-vrrp
make;make install
keepalived -v
vim /usr/local/etc/keepalived/keepalived.conf
systemctl restart keepalived
firewall-cmd --add-protocol=vrrp --permanent
firewall-cmd --reload

Keepalived基本配置

参考文档

https://www.keepalived.org/manpage.html

基本配置

  • 配置文件地址:/etc/keepalived/keepalived.conf
    • priority越高越好
    • STATE部分,是MASTERBACKUP,参考官方文档

      Initial state, MASTER|BACKUP
      If the priority is 255, then the instance will transition immediately
      to MASTER if state MASTER is specified; otherwise the instance will
      wait between 3 and 4 advert intervals before it can transition,
      depending on the priority.

      • 有些文档写的是SLAVE,但会报错Dec 29 22:15:20 nginx-32 Keepalived_vrrp[1808]: (VI_1): unknown state 'SLAVE', defaulting to BACKUP
    • PASS中,PASS要大写,不然不识别
    • virtual_router_id 101,同一个VRRP实例下的节点(主节点和备份节点)具有相同值,而且同一网段中virtual_router_id的值不能重复
    • enable_script_security,这个需要加上,因为需要执行刷新ARP的脚本

主机master

备机BACKUP照着他改一下就行了,记住谁优先级高谁厉害。

! Configuration File for keepalived
! And I AM 2-with MASTER

global_defs {
   enable_script_security 
   router_id vrrp-31
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0.1
   max_auto_priority 1
   vrrp_gna_interval 0.1
}

vrrp_instance nginx-ke {
    state MASTER
    priority 100
    nopreempt
    interface ens192
  virtual_router_id 31
    notify /root/arp.sh root
!    use_vmac uvmac
  advert_int 1
    authentication {
        auth_type PASS
      auth_pass goodxin
    }
      virtual_ipaddress {
           192.168.1.1/24
    }
}

关于ARP的刷新

我的配置文件中,可以看到VIP使用的是当前工作的Linux的MAC,这对于同网段来说没啥问题,但是对于跨网段三层设备,如果ARP表不能及时更新,就会造成虽然VIP所在主机切换了,但是实际上还是无法访问的情况。

解决办法是加一个通知脚本,当出现任何变化的时候,通知网关刷新ARP表。

我这里使用的是notify /root/arp.sh root,当然也可以是notify masternotify_fault等等。我第一次抄的文章是notify_master,结果我重启master的服务的时候无论如何都无法修改,干脆直接通知所有得了。

脚本如下,使用了linux的arping命令。

#!/bin/bash
VIP=192.168.1.1
GATEWAY=192.168.1.1
/sbin/arping -I ens192 -c 5 -s $VIP $GATEWAY &>/dev/null

总结

其实看起来简单的Keepalived,遇到好多坑,主要如下:

  • 首先是防火墙没开vrrp协议,所以我折腾半天虽然看起来生效了,但是其实两台主机都是MASTER状态,怀疑了一堆东西。防火墙处理完之后,就能看到这个提示了,不然每台机器都会显示是MASTER STATE,其实两个都有具体的VIP,其实是…冲突了…
Dec 30 18:26:29 nginx-32 Keepalived_vrrp[3331]: (nginx-nau) Entering BACKUP STATE
Dec 30 18:26:29 nginx-32 Keepalived_vrrp[3331]: (nginx-nau) removing VIPs.
Dec 30 18:26:29 nginx-32 Keepalived_vrrp[3331]: (nginx-nau) removing E-VIPs.
  • 另外一个问题就是VIP使用的MAC地址实际上是当前所在主机的网卡MAC,那么就意味着如果L3设备没有及时更新ARP表(很不幸,我的M9006就遇到了)就会出现内网正常,外网死活不通的问题。解决办法就是使用keepalive的notify功能去执行脚本。这个脚本还可以加参数实现切换提醒,后续在研究了。
  • 下面要做的,是实现nginx的冗余。实际上做到这里,nginx已经实现冗余了,加上我的nginx主要是反代,也不需要本地保存文件,那么问题就在如何同步nginx的配置文件上了。等第二篇吧~

Ref

  • https://www.redhat.com/sysadmin/keepalived-basics

https://tobru.ch/keepalived-check-and-notify-scripts/

你可能感兴趣的:(数据中心,nginx,运维,linux,服务器)