iMisty的技术栈

iMisty的技术栈

Keepalived原理与实战

1487
2020-06-30

高可用集群架构 Keepalived 双机主备原理

Nginx高可用HA(High Availability):当主节点故障,备用机充当主节点,用户请求会访问到nginx备用机,但是同一个时刻只有一个节点提供服务
img

Keepalived

  • 解决单点故障
  • 组件免费
  • 可以实现高可用HA机制
  • 基于VRRP协议

虚拟路由冗余协议VRRP:协议全称Virtual Router Redundancy Protocol,是用于解决内网单机故障的路由协议,构建有多个路由器MASTER-BACKUP ,虚拟IP-VIP(virtual ip address)

Keepalived双机主备原理
主节点会定时向备用机发送心跳,当备用机没有收到心跳说明主节点故障,那么此时Nginx备用机会绑定到虚拟IP,切换到备用Nginx节点提供服务,当主节点恢复正常,那么会重新接管备用机的任务对外提供服务

img

注意主备的主机硬件配置需要一样,不然当主nginx异常备用机无法负载会影响正常提供服务;

安装 keepalived

  1. 下载keepalived 官方地址

  2. 上传到服务器 img

  3. 解压 tar -zxvf keepalived-2.0.18.tar.gz;

  4. 解压后进入到解压出来的目录,看到会有configure,那么就可以做配置了(配置安装和nginx一模一样)img

  5. 使用configure命令配置安装目录与核心配置文件所在位置:
    ./configure --prefix=/usr/local/keepalived --sysconf=/etc

    • prefix:keepalived安装的位置
    • sysconf:keepalived核心配置文件所在位置,固定位置,改成其他位置则keepalived启动不了,/var/log/messages中会报错
      5.1 配置过程中可能会出现警告信息,如下所示:
*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.

5.2 安装libnl/libnl-3依赖 yum -y install libnl libnl-devel
5.3 重新configure一下,此时OK。

6. 安装keepalived make && make install

**7.**进入到/etc/keepalived,该目录下为keepalived核心配置文件
img

如果忘记安装配置的目录,则通过如下命令找到:
img

Keepalived 核心配置文件- keepalived.conf

核心配置文件在/etc/keepalived/keepalived.conf

配置keepalived-主节点

双机主备原理:
两台配置相同的主机,分别配置Nginx主备和keepalive主备,在keepalive主节点异常关闭的时候,则虚拟IP绑定到备用keepalive节点通过备用Nginx对外提供服务,如果keepalive检测脚本检测到nginx异常关闭,则脚本尝试重新启动Nginx,如果启动失败,则关闭keepalive主节点,备用节点生效;
img

1. 编辑主配置文件 vim keepalived.conf

global_defs {
   # 路由id:当前安装keepalived的节点主机标识符,保证全局唯一
   router_id keep_dev
}

vrrp_instance VI_1 {
    # 表示状态是MASTER主机还是备用机BACKUP
    state MASTER
    # 该实例绑定的网卡
    interface eth0
    # 保证主备节点一致即可
    virtual_router_id 66
    # 权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选
    priority 100
    # 主备之间同步检查时间间隔,单位秒
    advert_int 2
    # 认证权限密码,防止非法节点进入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟出来的ip,可以有多个(vip)
    virtual_ipaddress {
        192.168.43.111
        #192.168.43.112
    }
}
  • 查看网卡名称:
    img

2. 启动 Keepalived
在sbin目录中进行启动(同nginx),然后检查进程是否启动成功ps -ef|grep keepalived
img

3. 查看vip
在keepalived启动成功之后,在网卡eth0下,多了一个192.168.43.111,这个就是虚拟ip
img

把Keepalived 注册为系统服务

重新加载keepalies配置文件:需要先关闭再启动
img

但是,这种方式不太好,操作麻烦且太过粗暴不够优雅,可以将keepalived注册为系统服务

1. 打开keepalived解压目录,进入如下子目录 cd /home/parallels/Desktop/keepalived-2.0.20/keepalived/etc/,目录结构如下:
img
2. 执行如下操作将配置文件导入系统服务配置目录,如果已经存在直接覆盖即可

[root@localhost etc]# cp init.d/keepalived /etc/init.d/
[root@localhost etc]# cp sysconfig/keepalived /etc/sysconfig/

img
3. 重新刷新一下系统服务配置 systemctl daemon-reload

完成上述操作即可通过系统服务命令管理keepalived服务了

  • systemctl start|stop|restart|status keepalivied.service
  • service keepalived status|start|stop|restart|reload

Keepalived实现双机主备高可用

一.在备用机上安装keepalived然后如下配置

global_defs {
   # 路由id:当前安装keepalived的节点主机标识符,保证全局唯一,和主节点一致
   router_id keep_dev
}

vrrp_instance VI_1 {
    # 备用机设置为BACKUP
    state BACKUP
    # 该实例绑定的网卡
    interface eth0
    # 保证主备节点一致即可
    virtual_router_id 66
    # 备用机权重要低于MASTER
    priority 80
    # 主备之间同步检查时间间隔,单位秒,这个要和主节点一致,实际部署过程中发现:主节点为2,备用为1无法实现切换
    advert_int 2
    # 认证权限密码,防止非法节点进入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟出来的ip,可以有多个(vip)
    virtual_ipaddress {
    # 注意:主备两台的vip都是一样的,绑定到同一个vip
        192.168.43.111
        #192.168.43.112
    }
}

二.启动keepalivied

# 启动keepalived
systemctl start keepalived
# 停止keepalived
systemctl stop keepalived
# 重启keepalived
systemctl restart keepalived

三.查看进程
ps -ef|grep keepalived

四.测试主备切换

  • 当主备节点的keepalived都启动之后,正常情况下虚拟ip绑定在主节点
    img
  • 此时模拟主节点异常退出,在主keepalived节点所在主机执行
    systemctl stop keepalived
  • 此时通过浏览器访问虚拟ip或者虚拟ip绑定的虚拟域名www.vip.com会访问到备用节点
  • 通过ip addr查看备用机ip信息,会发现虚拟ip绑定到了备用节点;
    img

Keepalived配置Nginx自动重启,实现7x24不间断服务

一.增加Nginx重启检测脚本vim /etc/keepalived/check_nginx_alive.sh

#!/bin/bash

A=`ps -C nginx --no-header |wc -l`
# 判断nginx是否宕机,如果宕机了,尝试重启
if [ $A -eq 0 ];then
    #重新启动nginx
    /usr/local/nginx/sbin/nginx
    # 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机
    sleep 3
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then  
        killall keepalived
    fi
fi
  • 增加运行权限chmod +x /etc/keepalived/check_nginx_alive.sh

二.配置keepalived监听nginx脚本

global_defs {
...
}
vrrp_script check_nginx_alive {
    script "/etc/keepalived/check_nginx_alive.sh"
    interval 2 # 每隔两秒运行上一行脚本
    weight 10 # 如果脚本运行成功,则升级权重+10
    # weight -10 # 如果脚本运行失败,则升级权重-10
}
vrrp_instance VI_1 {...}

三.在vrrp_instance中新增监控的脚本

global_defs {
...
}
vrrp_script check_nginx_alive {
   ...
}
vrrp_instance VI_1 {
    ...
    track_script {
        # 追踪 nginx 脚本
        check_nginx_alive   
    }
}

四.重启Keepalived使得配置文件生效
systemctl restart keepalived

高可用集群架构 Keepalived 双主热备原理

鉴于双机主备会存在很严重的资源浪费问题,因为正常情况下只有一台服务器对外提供服务,另一台配置需要相同,但是却长期闲置;所以需要充分利用硬件资源,用到让两台主机互为主备的双主热备方案

img

云服务的DNS解析配置与负载均衡

首先添加域名解析,主机记录为www,记录类型为A,分别解析到不同的主机下面,并且设置负载均衡的策略,这样通过DNS服务器按照设置的负载均衡策略解析到对应的的ip,访问服务器的内容然后响应给客户端
img

实现keepalived双主热备

规则:以一个虚拟ip分组归为同一个路由,virtual_router_id需要主备一致

global_defs {
   router_id keep_dev1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 66
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.111
    }
}
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 80
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.112
    }
}

备用节点配置

global_defs {
   router_id keep_dev2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 66
    priority 80
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.111
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 77
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    192.168.1.112
    }
}

分别重启两条Keepalived
systemctl restart keepalived

测试双主热备

  1. 因为局域网下无法配置dns服务器,所以只有通过虚拟主机访问,两个虚拟IP分别对应 www.vip.comwww.vip2.com,直接访问分别可以访问到两个路由的主nginx;
  2. 关闭第一台主机(对应nginx1和keepalived1)的keepalived服务,service keepalived stop
  3. 通过ip addr命令查看另一台主机(对应Nginx2和keepalived2)的IP的信息,发现两个虚拟ip都绑定到了另一台主机的网卡上,此时,通过该两个虚拟ip都会访问到第二台主机
    img

注意:需要各个节点内网互通,先测试单节点的Nginx服务,然后再添加到集群环境启动keepalived服务,另外,需要注意如果设置了开机自启防火墙,重启主机之后需要关闭防火墙或者添加防火墙规则,不然虚拟ip无法访问;