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

最近更新时间:2021-03-02 11:28:15

查看PDF

简介

Keepalived通常用来搭建高可用服务,比如Nginx、Haproxy、MySQL,DNS等。由于云网络和传统网络的差异,云网络(VPC)里使用keepalived方式会略有差异。

本文通过给出若干keepalived 配置和脚本文件,帮助用户在云主机上作本次实践。

主备高可用集群基本原理

通常高可用主备集群包含 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. 金山云提供预留IP功能。
  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

        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,将VIP指向到另一台主机。

  1. 云 API 密钥获取:登陆金山云控制台-》Access Keys-》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中。

文档内容是否对您有帮助?

根本没帮助
文档较差
文档一般
文档不错
文档很好

在文档使用中是否遇到以下问题

  • 内容不全,不深入
  • 内容更新不及时
  • 描述不清晰,比较混乱
  • 系统或功能太复杂,缺乏足够的引导
  • 内容冗长

更多建议

0/200

评价建议不能为空

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

问题反馈