高可用集群架构 Keepalived


1. Keepalived 概念

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

    虚拟路由冗余协议 VRRP
    Virtual Router Redundancy Protocol
    解决内网单机故障的路由协议
    构建有多个路由器 MASTER BACKUP
    虚拟IP - VIP(Virtual IP Address)

2. Keepalived 双机主备原理

Keepalived实现高可用服务之间故障转移、故障切换的本质就是通过VRRP协议实现
主节点向备用节点定期发送心跳检测,如备用机未收到心跳信息,判断主节点停机,则接管主节点
Keepalived 双机主备原理

3. 安装 Keepalived

  • 首先去官网下载安装包
    Keepalived官网
  • 上传安装包至服务器并解压
    tar -zxvf keepalived-2.0.20.tar.gz
  • 使用configure命令配置安装目录与核心配置文件所在位置
    ./configure --prefix=/usr/local/keepalived --sysconf/etc

    配置过程中可能会出现警告信息,如下所示
    PVS with IPv6. Please install libnl/libnl-3 dev libraries to support...
    安装 libnl/libnl-3依赖
    yum -y install libnl libnl-devel
    重新configure一下

  • 安装keepalived
    make && make install
  • 查看keepalived目录
    whereis keepalived

    配置文件 /etc/keepalived/keepalived.conf

4. 配置 keepalived

假设当前内网ip地址:192.168.1.171

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

# 计算机节点
vrrp_instance VI_1 {
    # 表示的状态,当前为主节点,MASTER/BACKUP
    state MASTER
    # 当前实例绑定的网卡(需要根据实际网卡名配置)
    interface eth0
    # 保证主备节点一致
    virtual_router_id 51
    # 优化级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MATER
    priority 100
    # 主备之间同步检查的时间间隔,默认1s
    avert_int 1
    # 认证授权的密码,防止非法节点的进入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟ip地址
    virtual_ipaddress {
        192.168.1.161
    }
}

5. 启动 keepalived

cd /usr/local/keepalived/sbin/
./keepalived

ip addr,查看当前网络信息
此时会多一个虚拟ip:192.168.1.161(上方配置)

6. 把 keepalived 注册为系统服务

在此操作之前,应停用已启动的 keepalived 进程
把相应配置文件拷贝至系统目录

  • 在 keepalived 软件包解压后的根目录,进入keepalived/etc/目录
cd keepalived/etc
# 拷贝文件
cp init.d/keepalived /etc/init.d/
cp sysconfig/keepalived /etc/sysconfig/
# 刷新系统配置
systemctl daemon-reload
# 启动
systemctl start keepalived.service
# 重启
systemctl  restart keepalived.service
# 停止
systemctl stop keepalived.service

至此,已成功注册为系统服务

7. Keepalived 实现双机主备高可用

上面我们已经配置了主节点MASTER,接下来配置备用节点BACKUP
在另一台服务器上安装 keepalived,步骤和上方主节点一致,就不再赘述

  • 配置备节点 keepalived vim /etc/keepalived/keepalived.conf

    假设当前内网ip地址:192.168.1.172

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

# 计算机节点
vrrp_instance VI_1 {
    # 表示的状态,当前为主节点,MASTER/BACKUP
    state BACKUP
    # 当前实例绑定的网卡(需要根据实际网卡名配置)
    interface eth0
    # 保证主备节点一致
    virtual_router_id 51
    # 优化级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MATER
    priority 80
    # 主备之间同步检查的时间间隔,默认1s
    avert_int 1
    # 认证授权的密码,防止非法节点的进入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟ip地址
    virtual_ipaddress {
        192.168.1.161
    }
}
  • 启动 keepalived
cd /usr/local/keepalived/sbin/
./keepalived

7.1 测试 keepalived 双机主备高可用

上面我们已经配置了两台 keepalived, 主备节点
主:192.168.1.171
备:192.168.1.172
虚拟ip:192.168.1.161

测试方法:
停用主节点,观察主备节点ip addr,是否有虚拟ip:192.168.161,
再启动主节点,观察主备节点ip addr,是否有虚拟ip:192.168.161,
有虚拟ip的一方,为正常绑定运行方

8. Keepavlied 配置Nginx自动重启

当前主备双机可用仅能作为 keepalived 节点服务,当Nginx发生故障,并不能保证服务的可用
所以接下来让 keepalived 保证 nginx 的运行,实现7x24不间断服务

  • 增加 Nginx 重启检测脚本
cd /etc/keepalived
vim check_nginx_alive_or_not.sh
#!/bin/bash

A=`ps -C nginx --no-header | wc,-1`
# 判断nginx是否宕机,如果宕机了,尝试重启
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    # 等待一小会儿再次检查nginx, 如果没有启动成功,则停止keepalived, 使其启动备用机
    sleep 3
    if[ `ps -C nginx --no--header | wc -1` -eq 0 ];then
        killall keepalived
    fi
fi
  • 增加运行权限
chmod +x /etc/keepavlied/check_nginx_alive_or_not.sh
  • 配置 keepalived 监听 nginx 脚本
vrrp_script check_nginx_alive {
    script "/etc/keepalived/check_nginx_alive_or_not.sh"
    interval 2  # 每隔2秒运行上一行脚本
    weight 10 # 如果脚本运行成功,则升级权重+10
    # weight -10 # 如果脚本运行失败,则升级权重-10
}

# 计算机节点
vrrp_instance VI_1 {
    # 省略其它内容

    track_script {
        check_nginx_alive   # 追踪 nginx 脚本
    }
}
  • 重启 keepalived 使配置文件生效
systemctl restart keepalived

9. Keepalived 实现双主热备高可用

前面我们实现了双机主备,这种架构从成本上来说,是不太经济的
因为,主、备机硬件配置上一致,都是生产级,如果主机一致很稳定,那么会造成备用机的资源浪费
解决:Keepalived 实现双主热备高可用
如下图,以DNS作负载均衡,保证双机互为主备,一方面保证了服务的高可用,另一方面提高资源的利用率
Keepalived 实现双主热备

9.1. 配置 Keepalived 双主热备

规则:以一个虚拟ip分组归为同一个路由

  • 主节点配置
global_defs {
    # 路由id:当前安装keepalived节点主机的标识符,全局唯一
    router_id keep_171
}

# 计算机节点
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    avert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.161
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 80
    avert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.162
    }
}
  • 备用节点配置
global_defs {
    router_id keep_172
}

# 计算机节点
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 80
    avert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.161
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 52
    priority 100
    avert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.162
    }
}

10. 总结

以上,我们利用 keepalived,分别实现了双机主备、双主热备,应对大环境的高可用架构


文章作者: 小动物不困
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小动物不困 !
评论
 上一篇
高可用集群架构 LVS 负载均衡 高可用集群架构 LVS 负载均衡
1. LVS 负载均衡 Linux Virtual Server章文嵩博士主导的开源的负载均衡项目LVS(ipvs)已被集成到Linux内核中负载均衡调度器 2. 为什么要使用 LVS + Nginx? LVS 基于四层负载均衡,工作效率
2020-09-14
下一篇 
Nginx配置SSL证书提供https访问 Nginx配置SSL证书提供https访问
1. 安装SSL模块 要在 Nginx 中配置https,就必须安装ssl模块,也就是:http_ssl_module 进入到 Nginx 的解压目录:xxx/nginx-1.16.1 新增ssl模块(原来的模块需要保留) ./con
2020-09-12
  目录