使用虚拟ip和keepalived搭建高可用web集群-九游平台
应用场景
虚拟ip(virtual ip address)是从vpc子网网段中划分的一个内网ip地址,通常搭配高可用软件(比如keepalived)使用,主要用来搭建高可用的主备集群。多个云服务器形成主备集群,当主云服务器发生故障无法对外提供服务时,系统动态将虚拟ip切换到备云服务器,通过备云服务器继续对外提供服务。本文档为您详细介绍使用虚拟ip和keepalived搭建高可用web集群的方法。
方案架构
- ecs-ha1作为主云服务器,通过与虚拟ip绑定的eip对外提供服务,ecs-ha2作为备云服务器不承载实际业务。
- 当ecs-ha1发生故障时,此时会自动启用ecs-ha2,ecs-ha2将会接管业务并对外提供服务,实现业务不中断的高可用需求。

方案优势
基于虚拟ip和keepalived能力,采用“一主一备”或“一主多备”的方法组合使用云服务器,这些云服务器对外呈现为一个虚拟ip。当主云服务器故障时,备云服务器可以转为主云服务器并继续对外提供服务,以此达到高可用性ha(high availability)的目的,可以解决用户由于云服务器故障导致的对外服务中断问题。
约束与限制
使用虚拟ip搭建的高可用集群,所有服务器必须位于同一个虚拟私有云的子网内。
资源规划说明
本示例中,虚拟私有云vpc和子网、虚拟ip、弹性公网ip以及弹性云服务器ecs等资源只要位于同一个区域内即可,可用区可以任意选择,无需保持一致。

以下资源规划详情仅为示例,您可以根据需要自行修改。
资源类型 |
资源数量 |
说明 |
---|---|---|
虚拟私有云vpc和子网 |
1 |
|
弹性云服务器ecs |
2 |
本示例中,需要两个ecs作为主备倒换,配置说明如下:
|
虚拟ip |
1 |
在子网subnet-a01中申请虚拟ip地址:
|
弹性公网ip |
1 |
|
步骤一:创建云服务资源
- 创建1个vpc和1个子网。
具体方法请参见创建虚拟私有云和子网。
- 创建2个ecs,分别作为主ecs和备ecs。
具体方法请参见。
本示例中,ecs的网络配置详情如下:- 网络:选择已创建的虚拟私有云和子网,vpc-a和subnet-a01。
- 安全组:新建一个安全组sg-a,并添加入方向和出方向规则。您在创建安全组的时候,系统会自动添加部分规则,您需要根据实际情况进行检查修改。
本示例中,ecs-ha1和ecs-ha2属于同一个安全组,您需要确保表2中的规则均已正确添加。
表2 安全组sg-a规则说明 方向
策略
类型
协议端口
源地址/目的地址
描述
入方向
允许
ipv4
tcp: 22
源地址:0.0.0.0/0
放通安全组内ecs的ssh(22)端口,用于远程登录linux ecs。
入方向
允许
ipv4
tcp: 3389
源地址:0.0.0.0/0
放通安全组内ecs的rdp(3389)端口,用于远程登录windows ecs。
入方向
允许
ipv4
tcp: 80
源地址:0.0.0.0/0
放通安全组内ecs的http(80)端口,用于外部通过http协议访问ecs上部署的网站。
入方向
允许
ipv4
全部
源地址:当前安全组sg-a
针对ipv4,用于安全组内ecs之间网络互通。
入方向
允许
ipv6
全部
源地址:当前安全组sg-a
针对ipv6,用于安全组内ecs之间网络互通。
出方向
允许
ipv4
全部
目的地址:0.0.0.0/0
针对ipv4,用于安全组内ecs访问外部,允许流量从安全组内ecs流出。
出方向
允许
ipv6
全部
目的地址:::/0
针对ipv6,用于安全组内ecs访问外部,允许流量从安全组内ecs流出。
本示例中,源地址设置为0.0.0.0/0表示允许所有外部ip远程登录云服务器,为了确保安全,建议您遵循最小原则,根据实际情况将源ip设置为特定的ip地址,比如,源地址设置为您的本地pc地址。
如果您的ecs位于不同的安全组,比如ecs-ha1属于sg-a,ecs-ha2属于sg-b,则除了在两个安全组中分别配置表2中的规则,您还需要添加表3中的规则,放通两个安全组之间的内网网络流量。
表3 安全组sg-a和sg-b规则说明 安全组
方向
策略
类型
协议端口
源地址/目的地址
描述
sg-a
入方向
允许
ipv4
全部
源地址:sg-b
针对全部ipv4协议,允许来自sg-b内实例的流量访问sg-a内的实例。
sg-b
入方向
允许
ipv4
全部
源地址:sg-a
针对全部ipv4协议,允许来自sg-a内实例的流量访问sg-b内的实例。
- 弹性公网ip:选择“暂不购买”。
- 在子网subnet-a01内,申请虚拟ip地址。
具体方法请参见。
- 申请弹性公网ip。
具体方法请参见购买弹性公网ip。
步骤二:为主备ecs配置keepalived
- 执行以下操作,为ecs-ha1配置keepalived。
- 将eip绑定至ecs-ha1。
具体方法请参见。
- 远程登录ecs-ha1。
ecs有多种登录方法,具体请参见。
- 执行以下命令,安装nginx、keepalived软件包及相关依赖包。
yum install nginx keepalived -y
回显类似如下信息,表示安装完成。[root@ecs-ha1 ~]# yum install nginx keepalived -y loaded plugins: fastestmirror determining fastest mirrors base | 3.6 kb 00:00:00 epel | 4.3 kb 00:00:00 extras | 2.9 kb 00:00:00 updates | 2.9 kb 00:00:00 (1/7): epel/x86_64/group | 399 kb 00:00:00 (2/7): epel/x86_64/updateinfo | 1.0 mb 00:00:00 (3/7): base/7/x86_64/primary_db | 6.1 mb 00:00:00 (4/7): base/7/x86_64/group_gz | 153 kb 00:00:00 (5/7): epel/x86_64/primary_db | 8.7 mb 00:00:00 (6/7): extras/7/x86_64/primary_db | 253 kb 00:00:00 (7/7): updates/7/x86_64/primary_db ..... dependency installed: centos-indexhtml.noarch 0:7-9.el7.centos gperftools-libs.x86_64 0:2.6.1-1.el7 lm_sensors-libs.x86_64 0:3.4.0-8.20160601gitf9185e5.el7_9.1 net-snmp-agent-libs.x86_64 1:5.7.2-49.el7_9.4 net-snmp-libs.x86_64 1:5.7.2-49.el7_9.4 nginx-filesystem.noarch 1:1.20.1-10.el7 openssl11-libs.x86_64 1:1.1.1k-7.el7 complete!
- 执行以下操作,修改nginx配置文件,添加80端口相关配置。
- 执行以下命令,打开“/etc/nginx/nginx.conf”文件。
vim /etc/nginx/nginx.conf
- 按i进入编辑模式。
- 将文件中原有的内容,全部替换成以下内容。
user root; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
- 按esc退出,并输入:wq!保存配置。
- 执行以下命令,打开“/etc/nginx/nginx.conf”文件。
- 执行以下操作,修改index.html文件内容,用来验证网站的访问情况。
- 执行以下命令,打开“/usr/share/nginx/html/index.html”文件。
vim /usr/share/nginx/html/index.html
- 按i进入编辑模式。
- 将文件中原有的内容,全部替换成以下内容。
welcome to ecs-ha1
- 按esc退出,并输入:wq!保存配置。
- 执行以下命令,打开“/usr/share/nginx/html/index.html”文件。
- 执行以下命令,设置nginx服务开机自启动,并启动nginx服务。
systemctl enable nginx
systemctl start nginx.service
回显类似如下信息:[root@ecs-ha1 ~]# systemctl enable nginx created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service. [root@ecs-ha1 ~]# systemctl start nginx.service
- 打开浏览器,并输入eip地址(124.x.x.187),验证nginx单节点的访问情况。
网页如下图所示,表示ecs-ha1的nginx配置成功。图3 ecs-ha1访问验证
- 执行以下操作,修改keepalived配置文件。
- 执行以下命令,打开“/etc/keepalived/keepalived.conf”文件。
vim /etc/keepalived/keepalived.conf
- 按i进入编辑模式。
- 根据实际情况,替换配置文件中的ip参数,并将文件中原有的内容,全部替换成以下内容。
- mcast_src_ip和unicast_src_ip:替换为ecs-ha1的私有ip地址,本示例为192.168.0.195。
- virtual_ipaddress:替换为虚拟ip地址,本示例为192.168.0.177。
! configuration file for keepalived global_defs { router_id master-node } vrrp_script chk_http_port { script "/etc/keepalived/chk_nginx.sh" interval 2 weight -5 fall 2 rise 1 } vrrp_instance vi_1 { state backup interface eth0 mcast_src_ip 192.168.0.195 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type pass auth_pass 1111 } unicast_src_ip 192.168.0.195 virtual_ipaddress { 192.168.0.177 } track_script { chk_http_port } }
- 按esc退出,并输入:wq!保存配置。
- 执行以下命令,打开“/etc/keepalived/keepalived.conf”文件。
- 执行以下操作,配置nginx监控脚本。
- 执行以下命令,打开“/etc/keepalived/chk_nginx.sh”文件。
vim /etc/keepalived/chk_nginx.sh
- 按i进入编辑模式。
- 将文件中原有的内容,全部替换成以下内容。
#!/bin/bash counter=$(ps -c nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then systemctl start nginx.service sleep 2 counter=$(ps -c nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then systemctl stop keepalived.service fi fi
- 按esc退出,并输入:wq!保存配置。
- 执行以下命令,打开“/etc/keepalived/chk_nginx.sh”文件。
- 执行以下命令,为“chk_nginx.sh”文件添加执行权限。
chmod x /etc/keepalived/chk_nginx.sh
- 执行以下命令,设置keepalived服务开机自启动,并启动keepalived服务。
systemctl enable keepalived
systemctl start keepalived.service
- 将eip和ecs-ha1解绑定。
具体方法请参见解绑弹性公网ip。
- 将eip绑定至ecs-ha1。
- 执行以下操作,为ecs-ha2配置keepalived。
- 将eip绑定至ecs-ha2。
具体方法请参见。
- 远程登录ecs-ha2。
ecs有多种登录方法,具体请参见。
- 执行以下命令,安装nginx、keepalived软件包及相关依赖包。
yum install nginx keepalived -y
回显类似如下信息,表示安装完成。[root@ecs-ha2 ~]# yum install nginx keepalived -y loaded plugins: fastestmirror determining fastest mirrors base | 3.6 kb 00:00:00 epel | 4.3 kb 00:00:00 extras | 2.9 kb 00:00:00 updates | 2.9 kb 00:00:00 (1/7): epel/x86_64/group | 399 kb 00:00:00 (2/7): epel/x86_64/updateinfo | 1.0 mb 00:00:00 (3/7): base/7/x86_64/primary_db | 6.1 mb 00:00:00 (4/7): base/7/x86_64/group_gz | 153 kb 00:00:00 (5/7): epel/x86_64/primary_db | 8.7 mb 00:00:00 (6/7): extras/7/x86_64/primary_db | 253 kb 00:00:00 (7/7): updates/7/x86_64/primary_db ..... dependency installed: centos-indexhtml.noarch 0:7-9.el7.centos gperftools-libs.x86_64 0:2.6.1-1.el7 lm_sensors-libs.x86_64 0:3.4.0-8.20160601gitf9185e5.el7_9.1 net-snmp-agent-libs.x86_64 1:5.7.2-49.el7_9.4 net-snmp-libs.x86_64 1:5.7.2-49.el7_9.4 nginx-filesystem.noarch 1:1.20.1-10.el7 openssl11-libs.x86_64 1:1.1.1k-7.el7 complete!
- 执行以下操作,修改nginx配置文件,添加80端口相关配置。
- 执行以下命令,打开“/etc/nginx/nginx.conf”文件。
vim /etc/nginx/nginx.conf
- 按i进入编辑模式。
- 将文件中原有的内容,全部替换成以下内容。
user root; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
- 按esc退出,并输入:wq!保存配置。
- 执行以下命令,打开“/etc/nginx/nginx.conf”文件。
- 执行以下操作,修改index.html文件内容,用来验证网站的访问情况。
- 执行以下命令,打开“/usr/share/nginx/html/index.html”文件。
vim /usr/share/nginx/html/index.html
- 按i进入编辑模式。
- 将文件中原有的内容,全部替换成以下内容。
welcome to ecs-ha2
- 按esc退出,并输入:wq!保存配置。
- 执行以下命令,打开“/usr/share/nginx/html/index.html”文件。
- 执行以下命令,设置nginx服务开机自启动,并启动nginx服务。
systemctl enable nginx
systemctl start nginx.service
回显类似如下信息:[root@ecs-ha2 ~]# systemctl enable nginx created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service. [root@ecs-ha2 ~]# systemctl start nginx.service
- 打开浏览器,并输入eip地址(124.x.x.187),验证nginx单节点的访问情况。
网页如下图所示,表示ecs-ha2的nginx配置成功。图4 ecs-ha2访问验证
- 执行以下操作,修改keepalived配置文件。
- 执行以下命令,打开“/etc/keepalived/keepalived.conf”文件。
vim /etc/keepalived/keepalived.conf
- 按i进入编辑模式。
- 根据实际情况,替换配置文件中的ip参数,并将文件中原有的内容,全部替换成以下内容。
- mcast_src_ip和unicast_src_ip:替换为ecs-ha2的私有ip地址,本示例为192.168.0.233。
- virtual_ipaddress:替换为虚拟ip地址,本示例为192.168.0.177。
! configuration file for keepalived global_defs { router_id master-node } vrrp_script chk_http_port { script "/etc/keepalived/chk_nginx.sh" interval 2 weight -5 fall 2 rise 1 } vrrp_instance vi_1 { state backup interface eth0 mcast_src_ip 192.168.0.233 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type pass auth_pass 1111 } unicast_src_ip 192.168.0.233 virtual_ipaddress { 192.168.0.177 } track_script { chk_http_port } }
- 按esc退出,并输入:wq!保存配置。
- 执行以下命令,打开“/etc/keepalived/keepalived.conf”文件。
- 执行以下操作,配置nginx监控脚本。
- 执行以下命令,打开“/etc/keepalived/chk_nginx.sh”文件。
vim /etc/keepalived/chk_nginx.sh
- 按i进入编辑模式。
- 将文件中原有的内容,全部替换成以下内容。
#!/bin/bash counter=$(ps -c nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then systemctl start nginx.service sleep 2 counter=$(ps -c nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then systemctl stop keepalived.service fi fi
- 按esc退出,并输入:wq!保存配置。
- 执行以下命令,打开“/etc/keepalived/chk_nginx.sh”文件。
- 执行以下命令,为“chk_nginx.sh”文件添加执行权限。
chmod x /etc/keepalived/chk_nginx.sh
- 执行以下命令,设置keepalived服务开机自启动,并启动keepalived服务。
systemctl enable keepalived
systemctl start keepalived.service
- 将eip和ecs-ha2解绑定。
具体方法请参见解绑弹性公网ip。
- 将eip绑定至ecs-ha2。
步骤三:将虚拟ip绑定至主备ecs及eip
- 将虚拟ip分别绑定至主备ecs上,本示例中需要绑定ecs-ha1和ecs-ha2。
具体操作请参见。
- 关闭主备ecs网卡的“源/目的检查”功能。
将虚拟ip绑定至ecs时,系统会自动关闭ecs网卡的“源/目的检查”功能,您需要参考以下操作检查关闭情况。如果未关闭,则请关闭该功能。
- 在ecs列表中,单击目标ecs的名称。
进入ecs详情页。
- 选择“弹性网卡”页签,并单击
展开ecs的网卡详情区域,可以查看“源/目的检查”功能。
如图5所示,表示“源/目的检查”功能已关闭。
图5 关闭网卡的“源/目的检查”功能
- 在ecs列表中,单击目标ecs的名称。
- 将虚拟ip绑定至eip上,本示例中需要绑定eip-a。
具体操作请参见。
步骤四:关闭备ecs的ip转发功能
使用虚拟ip构建主备场景的高可用集群时,需要关闭备ecs的ip转发功能,当主备ecs切换后,则需要确保新的备ecs也关闭ip转发功能。
为了避免ecs主备切换后遗漏配置,建议您将主备ecs的ip转发功能全都关闭。
- 打开浏览器,并输入eip地址(124.x.x.187),通过网页确认主ecs。
网页如下图所示,表示此时主ecs是ecs-ha1。图6 主ecs验证
- 远程登录备ecs,本示例是ecs-ha2。
ecs有多种登录方法,具体请参见。
- 请根据ecs的操作系统,在表4中选择关闭ip转发功能的操作,本示例ecs为linux操作系统。
表4 关闭ip转发功能 操作系统
操作指导
linux系统
- 执行以下命令,切换root用户。
su root
- 执行以下命令,查看ip转发功能是否已开启。
cat /proc/sys/net/ipv4/ip_forward
回显结果:1为开启,0为关闭,默认为0。
- 回显为0,任务结束。
- 回显为1,继续执行以下操作。
- 以下提供两种方法修改配置文件,二选一即可。
方法一:
- 执行以下命令,打开“/etc/sysctl.conf”文件。
vim /etc/sysctl.conf
- 按i进入编辑模式。
- 修改net.ipv4.ip_forward = 0。
- 按esc退出,并输入:wq!保存配置。
方法二:
执行sed命令,命令示例如下:
sed -i '/net.ipv4.ip_forward/s/1/0/g' /etc/sysctl.conf
- 执行以下命令,打开“/etc/sysctl.conf”文件。
- 执行以下命令,使修改生效。
sysctl -p /etc/sysctl.conf
windows系统
- 在搜索框中输入cmd,打开windows系统的“命令提示符”窗口,执行以下命令。
ipconfig/all
- 回显结果中,“ip 路由已启用”为 “否”, 表示ip转发功能已关闭。
- 回显结果中,“ip 路由已启用”为 “是”, 表示ip转发功能未关闭,继续执行以下操作。
- 在搜索框中输入regedit,打开注册表编辑器。
- 编辑hkey_local_machine\system\currentcontrolset\services\tcpip\parameters下的ipenablerouter值为0。
- 指定值为 0:关闭 ip 转发。
- 指定值为 1:启用 ip 转发。
- 执行以下命令,切换root用户。
步骤五:验证主备ecs的自动切换功能
- 执行以下操作,分别重启主备ecs。
- 执行以下操作,验证主ecs的网页访问情况。
- 打开浏览器,并输入eip地址(124.x.x.187),验证主ecs的网页访问情况。
网页如下图所示,表示此时主ecs是ecs-ha1,且网页访问正常。图7 主ecs验证(ecs-ha1)
- 远程登录ecs-ha1,并执行以下命令,查看虚拟ip是否已绑定到ecs-ha1的eth0网卡上。
ip addr show
回显类似如下信息,可以看到虚拟ip(192.168.0.177)已绑定至eth0网卡上,再次确认ecs-ha1为主ecs。[root@ecs-ha1 ~]# ip addr show 1: lo:
mtu 65536 qdisc noqueue state unknown group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: mtu 1500 qdisc mq state up group default qlen 1000 link/ether fa:16:3e:fe:56:19 brd ff:ff:ff:ff:ff:ff inet 192.168.0.195/24 brd 192.168.0.255 scope global noprefixroute dynamic eth0 valid_lft 107898685sec preferred_lft 107898685sec inet 192.168.0.177/32 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::f816:3eff:fefe:5619/64 scope link valid_lft forever preferred_lft forever - 执行以下命令,停止主ecs的keepalived服务,本示例中主ecs为ecs-ha1。
systemctl stop keepalived.service
- 打开浏览器,并输入eip地址(124.x.x.187),验证主ecs的网页访问情况。
- 执行以下命令,验证主ecs是否切换成ecs-ha2。
- 远程登录ecs-ha2,并执行以下命令,查看虚拟ip是否已绑定到ecs-ha2的eth0网卡上。
ip addr show
回显类似如下信息,可以看到虚拟ip(192.168.0.177)已绑定至eth0网卡上,此时确认ecs-ha2为主ecs。[root@ecs-ha2 ~]# ip addr show 1: lo:
mtu 65536 qdisc noqueue state unknown group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: mtu 1500 qdisc mq state up group default qlen 1000 link/ether fa:16:3e:fe:56:3f brd ff:ff:ff:ff:ff:ff inet 192.168.0.233/24 brd 192.168.0.255 scope global noprefixroute dynamic eth0 valid_lft 107898091sec preferred_lft 107898091sec inet 192.168.0.177/32 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::f816:3eff:fefe:563f/64 scope link valid_lft forever preferred_lft forever - 打开浏览器,并输入eip地址(124.x.x.187),验证ecs-ha2作为主ecs时的网页访问情况。
网页如下图所示,表示此时主ecs是ecs-ha2,且网页访问正常。图8 主ecs验证(ecs-ha2)
- 远程登录ecs-ha2,并执行以下命令,查看虚拟ip是否已绑定到ecs-ha2的eth0网卡上。
相关文档
意见反馈
文档内容是否对您有帮助?
如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨