通过 keepalived 在VPC搭建高可用服务

最近更新时间:2018-05-23 18:23:33

通过 keepalived 在VPC内云主搭建高可用服务

简介

Keepalived通常用来搭建高可用服务,比如Nginx、Haproxy、MySQL,DNS等。由于云网络和传统网络的差异,云网络(VPC)里使用keepalived方式会略有差异。本文首先对 keepalived 简述,并说明其在云主机的应用与物理网络的区别。 然后具体介绍keepalived的常见使用模式: 无常主模式,即双机选举主设备的优先级相同;

本文通过给出若干 keepalived 配置和脚本文件 ,帮助用户在云主机上作本次实践。 本文主要介绍 keepalived 的 VRRP Instance 配置为单播 VRRP 报文的用法。

主备高可用集群基本原理

通常高可用主备集群包含 2 台服务器,一台主服务器处于某种业务的激活状态(即 Active 状态),另一台备服务器处于该业务的备用状态(即 Standby 状态),它们共享同一个 VIP(Virtual IP),同一时刻 VIP 只在一台主设备上生效,当主服务器出现问题,备用服务器接管 VIP 继续提供服务。

云上网络与物理网络差异

在传统的物理网络中可以通过 keepalived 的 VRRP 协议协商主备状态,主节点和备节点之间通过多播或者单播的方式发送心跳消息来选举主节点,主节点周期性发送免费 ARP 报文刷新上联交换机的 MAC 表或终端 ARP 表,触发 VIP 的迁移到主设备上。

金山云VPC 支持部署 keepalived 来搭建主备高可用集群,与物理网络相比,主要区别是:VIP迁移后在VPC Domain内生效需要调用OPENAPI调整路由后生效。

云上部署详细步骤

前提条件

云主机需要能访问公网(通过公网EIP或者公网NAT)

步骤 1. 从VPC内选择 VIP

在某个VPC内创建子网后,可选择子网内未使用的任意IP作为VIP,可以从VPC控制台->子网页面查看已使用IP,子网网段内未使用IP即可作为VIP使用。

注意:

  1. 建议选择子网内数字较大的地址作为VIP,避免因新创建主机占用该VIP。
  2. 后期迭代会开放用户申请VIP,并保留VIP地址功能。
  3. VIP不会自动配置到任何云主机上,需要结合keepalived配置才能生效。

本文部署环境示例如下,用户需按照自身网络配置修改。

VPC 172.18.0.0/16

主机1 172.18.0.10

主机2 172.18.0.20

预留VIP 172.18.0.253 

步骤 2. 所需软件准备

  1. 主备云主机安装 keepalived(1.3.5 版本以上) 以 CentOS 为例: yum –y install keepalived
  2. 准备脚本 notify_action.sh, nexthop.py 和keepalived 配置文件

step1: git clone https://github.com/KscSDK/ksc-sdk-python.git

step2: python setup.py install 按装 KSCSDK,某些环境下需执行更新 yum install python-pip;pip install -U pip setuptools

step3:从ksc-sdk-python/examples中 copy nexthop.py,keepalived.conf,notify_action.sh 到/etc/keepalived目录

  1. chmod +x notify_action.sh 为可执行文件

步骤 3. 修改配置 keepalived.conf

本文介绍常用的无常主模式,即双机选举主设备的优先级相同;
(常主常备模式,即需要让其中一台设备在无故障时尽量当主的场景。
常主常备模式较无常主模式增加了主备倒换次数,不推荐使用)
   非常主常备,按照如下修改 keepalived.conf: 
        0) state            初始角色,均填写 BACKUP
        1) interface        改成本机网卡名 例如 eth0
        2) priority         两台设备配置大小相同的整数,如 50
        3) unicast_src_ip   改成本机内网 IP
        4) unicast_peer     改成对端机器内网 IP
        5) virtual_ipaddress    改成内网 VIP  
        6) track_interface  改成本机网卡名 例如 eth0

注意:需要配置单播模式是很重要的,即指定对端设备的 IP 地址。单播模式需从配置文件中删除vrrp_strict

步骤 4. 根据自身环境修改 nexthop.py 主备切换时,keepalived 触发 notify_action.sh 程序执行 云API 操作

nexthop.py:云 OPENAPI 主备切换程序,通过调用VPC路由修改OPENAPI,让VPC Domain 感知VIP的漂移。

1) 云 API 密钥获取:登陆金山云控制台-》身份与管理-》设置-》AK密钥管理,新建或使用已有密钥。 2)vpcId,主备实例的Id 可以从金山云控制台获取。 2) 按照自身环境修改 nexthop.py 中如下部分

##################需修改部分Begin####################
region='cn-beijing-6'   #region code,云服务所在的金山云区域
vpcId = '1858a08a-6cc9-4278-8d0c-d536f441fe8e'  #vpcId
ks_access_key_id = '您的ak'
ks_secret_access_key = '您的sk'
vip = "172.18.0.253" #改成您的本机内网 VIP
DestinationCidrBlock = '172.18.0.253/32' #修改为VIP 
thisInstanceId = '1cf963ff-7847-4859-8462-5405f0facc1d' #当前主机的Id
thatInstanceId = 'b141da5f-8e3e-44c0-ac0f-a0feccba78c7' #迁移前所在主机Id
interface = {"eth0":"172.18.0.13"} #当前机器主网卡和主IP
##################需修改部分End######################

步骤 5. 验证主备倒换时 VIP 及外网 IP 是否正常切换

  1. 启动 keepalived: /etc/init.d/keepalived start 或 systemctl start keepalived 或 service keepalived start 注意:生产环境请将 启动方式添加到 /etc/rc.local 以保持自启动。
  2. 验证主备切换容灾效果:通过重启 keepalived 进程、重启子机等方式模拟主机故障,检测 VIP 是否能迁移。/var/log/keepalived.log中同时会留下相应的日志。通过 ping VIP 的方式,可以查看网络中断到恢复的时间间隔。
    说明:
    1) 由于路由重定向 以云 API
    方式异
    步实现,路由生效在1分钟以内,跨子网访问VIP可能会存在分钟以内的访问不通。同子网访问VIP只受限于keepalived自身的切换时间。
    2) 脚本日志将会写到
    /var/log/keealived.log
    中。日志会占用您的磁盘空间。您可以自行借助 logrotate
    等工具处理日志累积的问题。keepalived 进程的日志仍会写到
    /var/log/message
    中。

金山云,开启您的云计算之旅

立即注册