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


     摘         要    

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

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

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

具体内容包括:

  • 准备实验环境

  • 配置Keepalived实现内网IP漂移

  • 测试内网IP漂移

准备实验环境

1

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

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

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

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

京东云云主机支持一个网卡绑定多个内网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:ff
10    inet 10.0.1.18/24 brd 10.0.1.255 scope global noprefixroute dynamic eth0
11       valid_lft 84996sec preferred_lft 84996sec
12    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 1000
10    link/ether fa:16:3e:c1:4a:45 brd ff:ff:ff:ff:ff:ff
11    inet 10.0.1.18/24 brd 10.0.1.255 scope global noprefixroute dynamic eth0
12       valid_lft 86398sec preferred_lft 86398sec
13    inet 10.0.1.20/24 brd 10.0.1.255 scope global secondary noprefixroute eth0
14       valid_lft forever preferred_lft forever
15    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.20
2<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 monitor
10
11 state MASTER
12 virtual_router_id 1 # Assign one ID for this route
13 priority 101 # 101 on master, 100 on backup
14 unicast_src_ip 10.0.1.18 # My IP
15 unicast_peer {
16   10.0.1.19
17 }
18
19 track_script {
20   chk_nginx
21 }
22 notify_master /etc/keepalived/master.sh
23}

当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 $VIP
10
11jdc 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 monitor
10
11  state BACKUP
12  virtual_router_id 1 # Assign one ID for this route
13  priority 100 # 101 on master, 100 on backup
14  unicast_src_ip 10.0.1.19 # My IP
15  unicast_peer {
16    10.0.1.18
17  }
18
19  track_script {
20    chk_nginx
21  }
22  notify_master /etc/keepalived/master.sh
23}

其中备云主机进入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 $VIP
10
11jdc 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 restart
2Redirecting to /bin/systemctl restart keepalived.service
3[root@jdcoe-nginx-slave keepalived]# service nginx restart
4Redirecting 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 refused
15curl: (7) Failed connect to 10.0.1.20:80; Connection refused
16<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 stop
2Redirecting to /bin/systemctl stop nginx.service
3[root@jdcoe-nginx-master keepalived]# service nginx start
4Redirecting to /bin/systemctl start nginx.service
5[root@jdcoe-nginx-master keepalived]# service nginx stop
6Redirecting to /bin/systemctl stop nginx.service
7[root@jdcoe-nginx-master keepalived]# service nginx start
8Redirecting 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


每一次分享,都是在为你想要的世界投票▼

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值