开发者社区 > 博文 > 干货 | 基于Keepalived实现京东云内网服务组件高可用
分享
  • 打开微信扫码分享

  • 点击前往QQ分享

  • 点击前往微博分享

  • 点击复制链接

干货 | 基于Keepalived实现京东云内网服务组件高可用

  • 京东科技开发者
  • 2019-02-27
  • IP归属:北京
  • 99360浏览

  

     摘 要  

《基于Keepalived实现京东云接入服务高可用》介绍了利用Keepalived、京东云命令行实现公网IP在两台云主机之间自动切换的实现方法,从而提高公网接入服务(比如基于Nginx或HAProxy的负载均衡服务)可用性,避免单台云主机不可用导致整个服务不可用。

本文将介绍京东云内网IP在不同云主机之间自动漂移的方法。该方法通过在主备云主机之间切换内网IP,可以提高在云主机上自建MySQL、RabbitMQ等中间件服务的可用性。

本文将以提高Nginx服务可用性为示例,在两台云主机上安装Ningx,并通过一个内网IP提供服务。当主Nginx服务器出现不可用时,该内网IP将自动切换到备Nginx服务器,由备Nginx服务器处理请求,保证了服务连续性。

具体内容包括:

  • 准备实验环境

  • 配置Keepalived实现内网IP漂移

  • 测试内网IP漂移


准备实验环境


1

通过控制台创建并配置主、备云主机

本实验将在京东云华东-上海区域创建创建两台云主机,这两台云主机通过京东云提供的高可用组功能在可用区A和可用区B创建。

下图是创建的两台云主机信息:

222.jpg

要实现内网IP在不同云主机之间的漂移,需要首先在主云主机的主网卡上绑定一个辅IP。同时,为了便于测试内网IP漂移效果,在主、备云主机上安装Nginx,并修改/usr/share/nginx/html/index.html内容来区分主、备云主机。具体信息如下:

444.png

京东云云主机支持一个网卡绑定多个内网IP是实现内网IP在两台云主机之间切换的基础。基于上述配置的Nginx服务将通过10.0.1.20地址向外提供服务。


 2 

在云主机操作系统中配置辅IP

京东云云主机在创建后,将自动绑定主网卡以及主网卡的主IP,但即使在控制台上配置了辅IP,操作系统缺省也不会绑定辅IP。下面是操作系统未绑定辅IP时的信息。其中eth0是该云主机绑定的主网卡,10.0.1.18是该主网卡上绑定的主IP。因此,需要在主、备云主机上完成辅IP绑定:

 1[root@jdcoe-nginx-master ~]# ip addr 21: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 3    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 4    inet 127.0.0.1/8 scope host lo 5       valid_lft forever preferred_lft forever 6    inet6 ::1/128 scope host  7       valid_lft forever preferred_lft forever 82: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP group default qlen 1000 9    link/ether fa:16:3e:c1:4a:45 brd ff:ff:ff:ff:ff:ff10    inet 10.0.1.18/24 brd 10.0.1.255 scope global noprefixroute dynamic eth011       valid_lft 84996sec preferred_lft 84996sec12    inet6 fe80::f816:3eff:fec1:4a45/64 scope link noprefixroute 13       valid_lft forever preferred_lft forever

为了在操作系统中绑定主网卡的辅IP,需要修改网卡的配置文件/etc/sysconfig/network-scripts/ifcfg-eth0 ,在该配置文件末尾增加如下内容。其中IPADDR1="10.0.1.20"是设置辅IP,PREFIX1=24是设置IP的掩码:

1IPADDR1="10.0.1.20"2PREFIX1=24

在修改完配置文件后,重新启动网络服务,将看到已经绑定辅IP 10.0.1.20:

 1[root@jdcoe-nginx-master ~]# systemctl restart network 2[root@jdcoe-nginx-master ~]# ip addr 31: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 4    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 5    inet 127.0.0.1/8 scope host lo 6       valid_lft forever preferred_lft forever 7    inet6 ::1/128 scope host  8       valid_lft forever preferred_lft forever 92: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP group default qlen 100010    link/ether fa:16:3e:c1:4a:45 brd ff:ff:ff:ff:ff:ff11    inet 10.0.1.18/24 brd 10.0.1.255 scope global noprefixroute dynamic eth012       valid_lft 86398sec preferred_lft 86398sec13    inet 10.0.1.20/24 brd 10.0.1.255 scope global secondary noprefixroute eth014       valid_lft forever preferred_lft forever15    inet6 fe80::f816:3eff:fec1:4a45/64 scope link noprefixroute 16       valid_lft forever preferred_lft forever

虽然在主、备云主机都绑定了10.0.1.20地址,但由于10.0.1.20当前通过控制台绑定在主云主机10.0.1.18上,所以http://10.0.1.20请求是由主云主机提供服务。 

1[root@jdcoe-bastion ~]# curl http://10.0.1.202<h1>Master Server</h1>


配置Keepalived实现内网IP漂移


在配置主、备云主机前,首先确保两台云主机的root口令相同,然后安装Keepalived服务,并配置京东命令行jdc,详细过程请参考《基于Keepalived实现京东云接入服务高可用》。

 1 

配置主云主机(Master)

修改修改主云主机的/etc/keepalived/keepalived.conf。该配置的逻辑是,每两秒中检测10.0.1.19云主机上的nginx进程是否存在。

 1[root@jdcoe-nginx-master keepalived]# more keepalived.conf 2vrrp_script chk_nginx { 3 script "/usr/sbin/pidof nginx" 4 interval 2 5} 6 7vrrp_instance VI_1 { 8 debug 2 9 interface eth0 # interface to monitor1011 state MASTER12 virtual_router_id 1 # Assign one ID for this route13 priority 101 # 101 on master, 100 on backup14 unicast_src_ip 10.0.1.18 # My IP15 unicast_peer {16   10.0.1.1917 }1819 track_script {20   chk_nginx21 }22 notify_master /etc/keepalived/master.sh23}


当VRRP_Instance进入MASTER状态时,将执行如下master.sh脚本,在主云主机的主网卡上绑定辅助IP:

 1[root@jdcoe-nginx-master keepalived]# more /etc/keepalived/master.sh 2#!/bin/bash 3 4VIP=[10.0.1.20] # The Virtual IP  5 6MASTER_INTERFACE_ID=port-cwex5204wm 7SLAVE_INTERFACE_ID=port-et38k7x3l6 8 9jdc vpc unassign-secondary-ips --network-interface-id $SLAVE_INTERFACE_ID --secondary-ips $VIP1011jdc vpc assign-secondary-ips  --network-interface-id $MASTER_INTERFACE_ID --secondary-ips $VIP --secondary-ip-count 1


 2 

配置备云主机(Slave)

修改备云主机的keepalived.conf文件。该文件大部分和主云主机的配置相同,但有如下几个参数需要修改:

  • state BACKUP——表示在备云主机上Keepalived服务启动后缺省进入BACKUP状态;

  • priority 100——主云主机上的priority是101,这样当备云主机提供服务时,如果主云主机可用,将自动把主云主机切换为MASTER状态,而将备服务器切换为BACKUP状态;

  • unicast_src_ip和unicast_peer地址将做对调。

 1[root@jdcoe-nginx-slave keepalived]# cat  /etc/keepalived/keepalived.conf  2vrrp_script chk_nginx { 3  script "/usr/sbin/pidof nginx" 4  interval 2 5} 6 7vrrp_instance VI_1 { 8  debug 2 9  interface eth0 # interface to monitor1011  state BACKUP12  virtual_router_id 1 # Assign one ID for this route13  priority 100 # 101 on master, 100 on backup14  unicast_src_ip 10.0.1.19 # My IP15  unicast_peer {16    10.0.1.1817  }1819  track_script {20    chk_nginx21  }22  notify_master /etc/keepalived/master.sh23}


其中备云主机进入MASTER状态时,将执行如下脚本:

 1[root@jdcoe-nginx-slave keepalived]# cat /etc/keepalived/master.sh 2#!/bin/bash 3 4VIP=[10.0.1.20] # The Virtual IP  5 6MASTER_INTERFACE_ID=port-cwex5204wm 7SLAVE_INTERFACE_ID=port-et38k7x3l6 8 9jdc vpc unassign-secondary-ips --network-interface-id $MASTER_INTERFACE_ID --secondary-ips $VIP1011jdc vpc assign-secondary-ips  --network-interface-id $SLAVE_INTERFACE_ID --secondary-ips $VIP --secondary-ip-count 1


 3 

测试内网IP漂移

首先在主云主机和备云主机上重新启动keepalived和nginx服务:

1[root@jdcoe-nginx-slave keepalived]# service keepalived restart2Redirecting to /bin/systemctl restart keepalived.service3[root@jdcoe-nginx-slave keepalived]# service nginx restart4Redirecting to /bin/systemctl restart nginx.service


然后在一台云主机机器上通过执行“ while true; do curl http://10.0.1.20; sleep 2; done”命令,同时在主云主机上停止和启动nginx服务。当主服务器的nginx服务不可用时候,10.0.1.20地址将被绑定到备服务器,http://10.0.1.20 请求将由备服务器的Nginx服务处理;当重新启动云服务器的Nginx服务时,10.0.1.20地址将被重新绑定到主服务器,http://10.0.1.20 请求将重新由主服务器上的Nginx服务处理。


通过curl命令访问Nginx服务的响应内容:

 1[root@jdcoe-bastion ~]# while true; do curl http://10.0.1.20; sleep 2; done 2<h1>Master Server</h1> 3<h1>Master Server</h1> 4<h1>Master Server</h1> 5<h1>Master Server</h1> 6<h1>Master Server</h1> 7curl: (7) Failed connect to 10.0.1.20:80; Connection refused 8curl: (7) Failed connect to 10.0.1.20:80; Connection refused 9<h1>Slave Server</h1>10<h1>Slave Server</h1>11<h1>Slave Server</h1>12<h1>Master Server</h1>13<h1>Master Server</h1>14curl: (7) Failed connect to 10.0.1.20:80; Connection refused15curl: (7) Failed connect to 10.0.1.20:80; Connection refused16<h1>Slave Server</h1>17<h1>Slave Server</h1>18<h1>Slave Server</h1>19<h1>Slave Server</h1>20<h1>Slave Server</h1>21<h1>Master Server</h1>22<h1>Master Server</h1>

在主服务器上通过停止和启动Nginx服务来模拟主服务器故障:

1[root@jdcoe-nginx-master keepalived]# service nginx stop2Redirecting to /bin/systemctl stop nginx.service3[root@jdcoe-nginx-master keepalived]# service nginx start4Redirecting to /bin/systemctl start nginx.service5[root@jdcoe-nginx-master keepalived]# service nginx stop6Redirecting to /bin/systemctl stop nginx.service7[root@jdcoe-nginx-master keepalived]# service nginx start8Redirecting to /bin/systemctl start nginx.service


总结:

京东云的云主机网卡可以绑定多个辅助IP的能力,可以自动实现一个虚拟IP在不同云主机之间的自动漂移,这为某些用户因特殊需求而不能直接采用京东云PaaS服务,不得不采取在云主机上自建的中间件服务(比如数据库、消息中间件等)提供了高可用保证。

参考文献:

http://www.keepalived.org/doc/introduction.html

https://docs.jdcloud.com/cn/virtual-machines/assign-secondary-ips