nginx
服务器
VPC
ECS
高可用
配置
测试
控制台
HA
keepalived
主备
专有网络 VPC
EIP
灾备
主备双机
摘要: 原作者: 阿里云解决方案架构师, 袖手本文告诉你, 如何通过 keepalived, 在 VPC 中搭建一套主备双机高可用架构
1. 测试资源准备
VPC 环境内
- a) ECS HA1: 172.16.0.224
- b) ECS HA2: 172.16.0.225
- c) EIP: 139.196.75.13
- d) HAVIP: 172.16.0.222
2.Nginx 安装
分别在两台 ECS 中安装 Nginx, 安装过程不再赘述
更改相应的 nginx index.html, 以便测试时方便识别主机
3.keepalived 安装
3.1 安装依赖包
- yum -y install gcc gcc+ gcc-c++
- yum install popt-devel openssl openssl-devel libssl-dev libnl-devel popt-devel
3.2 建立 kernel 的软连接
ln -s /usr/src/kernels/2.6.32-431.23.3.el6.x86_64/ /usr/src/linux
3.3 安装配置 keepalived
yum install keepalived
配置 keepalived.conf
Keepalived 会定期检查服务器的健康情况, 并通过 VRRP 协议互通监控情况 (默认为组播方式) 一旦任何一个服务出现故障, Keepalived 会广播 ARP 包告诉大家, 这台故障的服务器不再拥有这个虚拟 IP, 而是另一台健康的资源服务器才是这个虚拟 IP 的真正归属这样所有发送给故障服务的请求就发送给另外一台资源服务器了
但在阿里云 VPC 环境中, 目前网络环境并不支持 VRRP 的组播方式, 需要将 keepalived 的通信方式改为单播
VRRP 组播可能导致脑裂, 争抢 IP, 频繁切换, 无法连接等情况典型的错误如下:
正确编辑配置文件, 需要注意以下几点:
1) 两台机器的 vrrp_instance State 应根据主备需求, 分别设置为 MASTER 或 BACKUP
2) virtual_ipaddress 为绑定的 havip, 并且需要指定绑定的虚拟网卡(如 eth0:1)
3) 务必使用 unicast_src_ip 和 unicast_peer, 将 vrrp 通信方式改为单播, 否则两台机器无法通信
4) 注意配置文件中 virtual_ipaddress 与 unicast_src_ip/unicast_peer 的顺序, 否则会影响互备切换
同理配置 ECS HA2
完整的 keepalived.conf 配置文件如下所示(文件路径:/etc/keepalived/keepalived.conf):
- #### 主服务器配置文件 ##########
- ! Configuration File for keepalived
- global_defs {
- notification_email {
- acassen@firewall.loc
- failover@firewall.loc
- sysadmin@firewall.loc
- }
- notification_email_from Alexandre.Cassen@firewall.loc
- smtp_server 192.168.200.1
- smtp_connect_timeout 30
- router_id LVS_DEVEL
- }
- vrrp_instance VI_1 {
- state MASTER
- interface eth0
- virtual_router_id 51
- priority 120
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 172.16.0.222/16 dev eth0 label eth0:1
- }
- unicast_src_ip 172.16.0.224
- unicast_peer {
- 172.16.0.225
- }
- }
- virtual_server 172.16.0.222 80 {
- delay_loop 6
- lb_algo rr
- lb_kind NAT
- nat_mask 255.255.0.0
- persistence_timeout 50
- protocol TCP
- real_server 172.16.0.224 80 {
- weight 1
- TCP_CHECK {
- connect_timeout 10
- nb_get_retry 3
- delay_before_retry 3
- connect_port 80
- }
- }
- }
- ####### 备服务器配置文件 #########
- ! Configuration File for keepalived
- global_defs {
- notification_email {
- acassen@firewall.loc
- failover@firewall.loc
- sysadmin@firewall.loc
- }
- notification_email_from Alexandre.Cassen@firewall.loc
- smtp_server 192.168.200.1
- smtp_connect_timeout 30
- router_id LVS_DEVEL
- }
- vrrp_instance VI_1 {
- state BACKUP
- interface eth0
- virtual_router_id 51
- priority 120
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 172.16.0.222/16 dev eth0 label eth0:1
- }
- unicast_src_ip 172.16.0.225
- unicast_peer {
- 172.16.0.224
- }
- }
- virtual_server 172.16.0.222 80 {
- delay_loop 6
- lb_algo rr
- lb_kind NAT
- nat_mask 255.255.0.0
- persistence_timeout 50
- protocol TCP
- real_server 172.16.0.225 80 {
- weight 1
- TCP_CHECK {
- connect_timeout 10
- nb_get_retry 3
- delay_before_retry 3
- connect_port 80
- }
- }
- }
4. 绑定 HaVIP
在管理控制台把两台 ECS 分别绑上 HAVIP
分别在两台机器上启动 nginx 和 keepalived
- # /usr/local/nginx/nginx
- #/etc/init.d/keepalived start
此时可看到, 绑定资源界面主实例一侧链接线已由虚线变为实线, 说明链接成功
在管理控制台中可看到实例 i-113xhadtu 为主实例, i-11kf0kbv7 为备实例
在主实例上, 通过 ifconfig, 可以看到, havip 已经被绑定到 eth0:1 上生效
5. 绑定 EIP
在管理控制台专有网络高可用虚拟 IP -- 绑定资源界面中, 将 HaVIP 绑上弹性公网 EIP 弹性公网与高可用虚拟 IP 连接线由虚线变为实线, 连接成功
6. 测试
1)访问测试, 浏览器中访问 EIP 地址, 可见 nginx 的欢迎界面, 且欢迎界面来自 HA1
2)将 i-113xhadtu 实例关机
在高可用虚拟 IP 界面看到, 原来的 i-113xhadtu 实例已经变为备实例, 主实例切换为了 i-11kf0kbv7
同时, 图形界面里的绑定的虚实关系也发生变化, 实线连到了当前的新主实例 i-11kf0kbv7
3) 仍然访问 EIP 地址, nginx 欢迎界面已切换至 HA2 实例
至此, 在 VPC 环境中, 利用 HaVip+keepalived 配置主备双机高可用完成
7. 小结
由于 HaVIP 目前还处于有限用户公测阶段, 使用时的限制小结如下:
1) 目前 VPC 中的网络通信不支持多播和广播, 只支持单播; 在使用 keepalived 之类的第三方软件实现高可用, 需要通过配置文件把通信方式改成单播;
2) 如果是使用 keepalived 之类的第三方软件, 需要把信条消息的源 IP 改成 ECS 的私网 IP(而不要用 HaVip 的私网 IP 进行心跳检查), 否则可能造成脑裂;
3) 如使用 HaVip 做自建 SNAT 网关的高可用时, SNAT 实例上配置的 SNAT 规则中, source IP 应该是 havip 的私网 IP 而不是 ECS 自己的私网 IP
4) 目前尚不支持利用 LVS 搭建负责均衡
5) 目前每个 VPC 中最多只能同时存在 5 个 havip 对象;
来源: https://yq.aliyun.com/articles/438705