keepalived实现nginx高可用

keepalived是什么?

  • Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。为Linux系统和基于Linux的基础架构提供简单而强大的负载平衡和高可用性设施。
  • 可以检测服务器(TCP)状态,将有故障的服务器剔除,并启用备用服务器,等故障服务器解决故障时,恢复。
  • 内部基于 VRRP协议 实现,即虚拟路由冗余协议,该协议本身是用于保证实现路由节点高可用的(冗余路由节点,当被冗余节点故障时,使用冗余节点替换该节点)。
  • 下面通过和nginx搭配实现nginx高可用来演示。

怎么做?

  • 安装:在主nginx服务器(假设为192.168.117.129)和备用nginx(假设为192.168.117.128)安装keepalived和nginx,nginx这里使用tengine。keepalived安装 : yum -y install keepalived;tengine安装如下:
#在 http://tengine.taobao.org/download_cn.html 找到要下载版本的下载地址,如2.3.0
wget http://tengine.taobao.org/download/tengine-2.3.0.tar.gz
#[可选]检查安装或更新一些依赖等
yum install gcc-c++  && yum -y install pcre pcre-devel  && yum -y install zlib zlib-devel  && yum -y install openssl openssl-devel
#tar解压
tar -zxvf tengine-2.3.0.tar.gz
#进入目录
cd tengine-2.3.0
#配置安装路径
./configure --prefix=/nginx
#编译&编译安装
make && make install
#使用默认配置,启动tengine
/nginx/sbin/nginx && /nginx/sbin/nginx -s reload

访问服务器地址,看到下图说明tengine安装&启动成功
keepalived实现nginx高可用_第1张图片

  • 配置主服务器keepalived并运行vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {   #全局配置
   notification_email {
       [email protected]     #定义报警邮件地址
       [email protected]     #定义报警邮件地址
   }
   notification_email_from [email protected]  #设置邮件的发送地址
   smtp_server 127.0.0.1          #邮箱服务器 
   smtp_connect_timeout 30    #定义超时时间
   router_id LVS_DEVEL             #定义路由标识信息,相同局域网唯一,发邮件时显示在邮件主题的信息
}
vrrp_script chk_nginx 
{
     script "/nginx/check_nginx.sh"   #该脚本检测ngnix的运行状态,并在nginx进程不存在时尝 试重新启动ngnix,如果启动失败则停止keepalived,准备让其它机器接管。
    interval 2              #每2s检测一次
    weight 2               #检测失败(脚本返回非0)则优先级2
}
vrrp_instance VI_1 {         #定义实例
    state MASTER             #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
    interface ens33              #虚IP地址放置的网卡位置
    virtual_router_id 55     #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
    priority 100                # 优先级决定是主还是备    越大越优先
    advert_int 1            #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
    authentication {        #设置验证类型和密码
        auth_type PASS      #设置验证类型,主要有PASS和AH两种
        auth_pass shenshaoqin  #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
    }
    virtual_ipaddress {     #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
        192.168.0.130
    }
    track_script {
        chk_nginx           #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
    }
}

检查tengine状态的脚本,检查nginx状态有几种方式:1)进程 2)端口 3)url能否访问等。这里简单使用检查进程去简单判断 vi /nginx/check_nginx.sh

#!/bin/bash
count=`ps -ef | grep "nginx: master process"| grep -v grep|wc -l`
echo "$count"
if [ $count -eq 0 ];then
        service keepalived stop  # 或使用pkill keepalived
fi

给脚本赋权限等

chmod 777 /nginx/check_nginx.sh
setenforce 0 # 关闭selinux
# tail -f /var/log/messages # 可以看到keepalived的输出。

keepalived启动前ip addr 结果keepalived实现nginx高可用_第2张图片
service keepalived start启动后 ip addr 结果
keepalived实现nginx高可用_第3张图片
启动后192.168.117.130访问结果:
keepalived实现nginx高可用_第4张图片
由于我们还没有配置从服务器,因此service keepalived stop关闭keepalived后再访问192.168.117.130 就没有上面效果了。重新启动keepalived,我们接下来开始配置从服务器。

  • 配置从keepalived,基本一样。
! Configuration File for keepalived

global_defs {   #全局配置
   notification_email {
       [email protected]     #定义报警邮件地址
       [email protected]     #定义报警邮件地址
   }
   notification_email_from [email protected]  #设置邮件的发送地址
   smtp_server 127.0.0.1          #邮箱服务器 
   smtp_connect_timeout 30    #定义超时时间
   router_id LVS_DEVEL             #定义路由标识信息,相同局域网唯一,发邮件时显示在邮件主题的信息
}
vrrp_script chk_nginx 
{
    script "/nginx/check_nginx.sh"   #该脚本检测ngnix的运行状态,并在nginx进程不存在时尝 试重新启动ngnix,如果启动失败则停止keepalived,准备让其它机器接管。
    interval 2              #每2s检测一次
    weight 2               #检测失败(脚本返回非0)则优先级2
}
vrrp_instance VI_1 {         #定义实例
    state BACKUP             #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
    interface ens33               #虚IP地址放置的网卡位置
    virtual_router_id 55     #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
    priority 50                # 优先级决定是主还是备    越大越优先
    advert_int 1            #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
    authentication {        #设置验证类型和密码
        auth_type PASS      #设置验证类型,主要有PASS和AH两种
        auth_pass shenshaoqin  #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
    }
    virtual_ipaddress {     #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
        192.168.0.130
    }
    track_script {
        chk_nginx           #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
    }
}

从服务器同样也需要tengine的检查脚本,以及赋权等操作。 配置完成启动keepalived。启动前 ip addr 结果:keepalived实现nginx高可用_第5张图片
由于主服务器目前现在正常运行,因此,keepalived启动后ip addr也是一样的效果。我们现在模拟故障,关闭主服务器的nginxpkill nginx 即可,可以发现主服务器的 keepalived也随之关闭了,但是 192.168.117.130却仍可以访问。现在查看从服务器ip ip addr , 可以发现从服务器的ip多了 192.168.117.130,如图
keepalived实现nginx高可用_第6张图片
去除故障后,重新启动主服务器的nginx服务和keepalived。再检查从服务器的ip可以发现,从服务器的ip变回初始的状态了

脑裂

  • 产生原因:当主备无法互相连接时(即认为对方都‘挂’了),可能会造成脑裂
  • 对于无状态的主备,如nginx本身不保留状态,脑裂问题没有大的影响,对有状态服务如MySQL,需要防止异常脑裂。
  • 思路:增加类似上面检查nginx的脚本检测,检测方向:检查服务器是否连接网关;检查是否能够连接外界某个服务等。如果不行,则说明是本服务器出了问题,应该关闭自己。

文章参考:
keepalived实现服务高可用
High Availability Support for NGINX Plus in On-Premises Deployments

你可能感兴趣的:(工具,Linux)