keepalived+nginx,haproxy

1.什么是keepalived

keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
 

2.工作原理

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
    虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(VIP = Virtual IP Address,虚拟IP地址,该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
    keepalived主要有三个模块,分别是core、check和VRRP。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。VRRP模块是来实现VRRP协议的。 
 

3.keepalived+nginx实现高可用过程

4 准备

Linux下Nginx+keepalived实现高可用 - 仅此而已-远方 - 博客园

虚拟机两台,安装Nginx,安装 keepalived 可直接使用命令 yum -y install keepalived 。

keepalived 默认配置文件路径:/etc/keepalived/keepalived.conf

keepalived 默认日志存放路径:/var/log/messages

网格划分如下:

名称操作系统IP虚拟IPkeepalived
虚拟机1Centos7.6192.168.20.12192.168.20.100MASTER
虚拟机2Centos7.6192.168.20.16192.168.20.100BACKUP

5、keepalived抢占式配置

MASTER配置如下(默认配置文件:/etc/keepalived/keepalived.conf):

global_defs {               
   router_id keep12             ##路由id,通常为 hostname
}

vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径
        interval 10             ## 检测时间间隔
        weight -20              ## 如果条件成立,权重-20
}

vrrp_instance VI_1 {
    state MASTER                ##主节点为 MASTER,备份节点为 BACKUP
    interface ens32             ##绑定 VIP 的网络接口,与本机IP地址所在网络接口相同
    virtual_router_id 100       ##虚拟路由id,主从节点必须保持一致
    priority 100                ##节点优先级,直范围0-254,MASTER 要比 BACKUP 高
    advert_int 1
    authentication {            ##设置验证信息,两个节点必须一致
        auth_type PASS
        auth_pass 123456
    }
    track_script {
        chk_nginx               ##执行 Nginx 监控
    }
    virtual_ipaddress {
        192.168.20.100          ##VIP,两个节点必须设置一样(可设置多个)
    }
}

BACKUP配置如下(默认配置文件:/etc/keepalived/keepalived.conf):

global_defs {               
   router_id keep16             ##路由id,通常为 hostname
}

vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径
        interval 10              ## 检测时间间隔
        weight -20              ## 如果条件成立,权重-20
}

vrrp_instance VI_1 {
    state BACKUP                ##主节点为 MASTER,备份节点为 BACKUP
    interface ens32             ##绑定 VIP 的网络接口,与本机IP地址所在网络接口相同
    virtual_router_id 100       ##虚拟路由id,主从节点必须保持一致
    priority 90                 ##节点优先级,直范围0-254,MASTER 要比 BACKUP 高
    advert_int 1
    authentication {            ##设置验证信息,两个节点必须一致
        auth_type PASS
        auth_pass 123456
    }
    track_script {
        chk_nginx               ##执行 Nginx 监控
    }
    virtual_ipaddress {
        192.168.20.100          ##VIP,两个节点必须设置一样(可设置多个)
    }
}

其中有几个配置需要注意:

a、router_id,最好配置成hostname(需要在 /etc/hosts 文件中,增加一行,比如:127.0.0.1  keep12)

b、interface,本机IP地址所在网络接口(可以通过 ifconfig 命令查看具体ip所对应的那个接口名称)

c. interval : 心跳检查间隔时间太短了,会报错.  

脚本中的sleep时间是2s,那么interval至少 大于2秒. 我设置10秒

日志提示:/etc/keepalived/nginx_check.sh exited due to signal 15

     原因:心跳检查间隔时间太短了

     解决:interval设置大一点(一定要大于sleep时间)

6、增加检测心跳脚本

在 /etc/keepalived 目录下,新增文件 nginx_check.sh (和上面对应script中对应),然后添加内容

chmod 777   nginx_check.sh 授权

#!/bin/bash

if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
       /usr/sbin/nginx

fi
sleep 2
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
        killall keepalived
fi

7. 启动

[root@localhost /]# service  keepalived start  -- 启动
[root@localhost /]# service keepalived stop    --关闭
[root@localhost /]# ps aux|grep keepalived   --查看进程

我一般kill 

7、测试

nginx的index.html 写上ip,来区分访问的页面

a、分别启动两台机器上的 Nginx 和 keepalived,然后访问虚拟ip:http://192.168.20.100  看到的A机器

b、停掉192.168.20.12上的Nginx服务,在 keepalived的日志文件中可以看到心跳脚本被执行了,最后杀掉了keepalived: (也可以直接停掉keeplived,模拟主机当机)

为了方便测试,最好先将上面心跳脚本文件中的重启nginx注释掉,不然手动停止Nginx后,又会被keepalived复活。

C. 然后访问虚拟ip:http://192.168.20.100   看到是B机器

D. 重启A机器上keeplive 或者nginx. 访问http://192.168.20.100   看到是B机器. 除非把B停掉才会切换回来

8. 遇到报错: 

>>> 心跳脚本没有被执行 

原因: 脚本写错了,所以编辑心跳脚本文件,可以通过sh nginx_check.sh 命令执行一下,看编写的脚本是否正确  

>>> 心跳脚本执行报错,日志提示:WARNING - script '/etc/keepalived/nginx_check.sh' is not executable for uid:gid 0:0 - disabling.

     原因:心跳脚本文件没有执行权限

     解决:chmod +x /etc/keepalived/nginx_check.sh

>>> 心跳脚本执行报错,日志提示:/etc/keepalived/nginx_check.sh exited due to signal 15

     原因:心跳检查间隔时间太短了

     解决:interval设置大一点(一定要大于sleep时间)

9. Keepalived非抢占模式配置

Keepalived非抢占模式配置 - T-BARBARIANS - 博客园

下面直接展示keepalived的非抢占配置。

主机配置如下:

vrrp_instance VI_1
{
  state BACKUP
  nopreempt
  priority 100

  advert_int 1
  virtual_router_id 1
  interface eth0

  authentication
  {
    auth_type PASS
    auth_pass abcd@hehe
  }

  virtual_ipaddress
  {
    100.92.2.110
  }
}



备机配置如下:

vrrp_instance VI_1
{
  state BACKUP
  nopreempt
  priority 90

  advert_int 1
  virtual_router_id 1
  interface eth0

  authentication
  {
    auth_type PASS
    auth_pass abcd@hehe
  }

  virtual_ipaddress
  {
    100.92.2.110
  }
}

重点:

1、两个节点的state都必须配置为BACKUP

2、两个节点都必须加上配置 nopreempt

引用官方文档对nopreempt字段的说明:

"nopreempt" allows the lower priority machine to maintain the master role, even when a higher priority machine comes back online. 

NOTE: For this to work, the initial state of this entry must be BACKUP.

根据上述描述,第一点提到的state必须配置为BACKUP就明白了。

3、其中一个节点的优先级必须要高于另外一个节点的优先级。

10. 配置keeplived日志文件

>> vi /etc/sysconfig/keepalived #修改配置文件

KEEPALIVED_OPTIONS=”-D -d -S 0”

 >> vi /etc/rsyslog.conf #修改配置文件

local0.* /var/log/keepalived.log  #日志保存位置

>> 重启服务

重启 rsyslog 服务:service rsyslog restart 

重启 keepalived 服务:service keepalived restart 

>> 日志可以在  /var/log/keepalived.log 看到

11 如何判断虚ip对应哪台机器

ip addr

 表示再此机器上

表示不再此机器上

12   如果虚ip 在两台机器上就出问题

记一次keepalived和VIP导致的故障 - 腾讯云开发者社区-腾讯云

有2台服务器绑定相同的vip, 出现大面积的不能访问 

问题的根源在于,keepalived为网卡停止后,keepalived为网卡绑定的VIP并没有移除,导致多台机器出现同样的ip。

 解决方案, 通过ip addr delete删除绑定的vip

ip addr delete 172.31.161.42/32 dev eno1
ip addr delete 172.31.161.41/32 dev eno1
ip addr delete 172.31.161.41/0 dev eno1

 顺道介绍如何给网卡绑定vip

ip addr add 172.31.161.41/32 dev eno1

 13 nginx 部署: 

linux安装nginx_我家小宝_朱朱的博客-CSDN博客

14. haproxy 部署:

linux-rabbit集群部署+ha_我家小宝_朱朱的博客-CSDN博客

15 haproxy+nginx的脚本

#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
        /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -D
fi
sleep 2
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
        killall keepalived

fi


if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
       /usr/sbin/nginx

fi
sleep 2
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
        killall keepalived
fi


版权声明:本文为zhuchunyan_aijia原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。