1 基于Keepalived的高可用支持
Keepalived开源项目提供Linux服务器的Keepalive后台进程,一个管理虚拟路由(虚拟IP地址)的虚拟路由冗余协议(VRRP)实现,和一个健康检查设施决定是否一个服务(例如,Web服务器,PHP后端或数据库服务器)是可用的。如果服务失败,Keepalived将主(活跃)节点重新分配虚拟IP地址到备用节点。
VRRP确保同时只有一个主节点。备用节点监听VRRP来自主节点的广播。如果超过三倍广播时间间隔没有收到广播包,备用节点接管主节点和虚拟IP地址。
2 配置高可用
注意:该解决方案设计的工作环境是能通过标准操作系统调用控制IP地址,通常不会再通过使用云设施的接口控制IP地址的云环境中工作。
运行nginx-ha-setup脚本(在nginx-ha-keepalived包中)两个节点作为root用户。脚本配置高可用主备Nginx环境。它提示输入以下数据:
-
本地IP地址和远程节点(将配置为主备的节点)
-
一个自由的IP地址用作集群终端的(漂浮)虚拟IP地址
Keepalived后台的配置记录在/etc/keepalived/keepalived.conf文件中。文件中的配置块控制通知设置、虚拟IP地址和健康监测。以下是CentOS7上的nginx-ha-setup脚本创建的配置文件。
vrrp_script chk_nginx_service {
script "/usr/libexec/keepalived/nginx-ha-check"
interval 3
weight 50
}
vrrp_instance VI_1 {
interface eth0
state BACKUP
priority 101
virtual_router_id 51
advert_int 1
unicast_src_ip 192.168.100.100
unicast_peer {
192.168.100.101
}
authentication {
auth_type PASS
auth_pass f8f0e5114cbe031a3e1e622daf18f82a
}
virtual_ipaddress {
192.168.100.150
}
track_script {
chk_nginx_service
}
notify "/usr/libexec/keepalived/nginx-ha-notify"
}
配置描述:
-
在HA安装的每个节点需要一个配置文件备份,使用适合节点角色(主/备)的priority、unicast_src_ip和unicast_peer指令的值。
-
priority指令控制成为主节点的主机,下一节中描述。
-
notify指令指定通知脚本,当状态过渡或发生错误时用于产生系统消息(或其它通知)。
-
vrrp_instance VI_1块中的virtual_router_id的值是51;必须在环境中唯一。
如果你有多对Keepalived实例(或其它VRRP实例)运行在本地网络,为每个实例使用唯一名称(像VI_1)和virtual_router_id号创建一个vrrp_instance块。
3 使用健康检查脚本控制主控权
如果两个节点成对不知道对方,每个节点假设自己是主节点并分配虚拟IP地址给自己。为了避免这种情况,配置文件定义可执行脚本机制,chk_nginx_service运行一个脚本定期检查是否Nginx是运行的,基于脚本的返回代码调整本地节点的优先级。代码0表示正确运行,代码1(或任意非0代码)表示错误。
在脚本的配置实例中,weight指令设置为50,意味着当检查脚本成功(返回代码0):
-
第一个节点的优先级设置为151(基础优先级是101)
-
第二个节点的优先级设置为150(基础优先级是100)
第一个节点有更高的优先级(151),成为主节点。
interval指令指定检查脚本多久执行一次,单位为秒。注意,如果超时检查失败(默认,超时时间与检查周期相同)。
rise和fall指令(实例中没有使用)指定脚本必须成功或失败多少次才采取行动。
4 禁用节点状态
为了查看当前那个节点是指定虚拟IP地址的主节点,运行ip addr show命令:
centos7-1 # ip addr show eth0
2: eth0: <BROADCAST ,MULTICAST ,UP,LOWER_UP > mtu 1500 qdisc pfifo_fast state
UP qlen 1000
link/ether 52:54:00:33:a5:a5 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.100/24 brd 192.168.122.255 scope global dynamic eth0
valid_lft 3071sec preferred_lft 3071sec
inet 192.168.100.150/32 scope global eth0
valid_lft forever preferred_lft forever
centos7-2 # ip addr show eth0
2: eth0: <BROADCAST ,MULTICAST ,UP,LOWER_UP > mtu 1500 qdisc pfifo_fast state
UP qlen 1000
link/ether 52:54:00:33:a5:87 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.101/24 brd 192.168.122.255 scope global eth0
valid_lft forever preferred_lft forever
在该输出中,centos7-1的第二个inet表示它是主节点——定义虚拟IP地址(192.168.100.150)分配给它。另一个inet行显示它的真实IP地址(192.168.100.100),备份节点的Ip地址(192.168.100.101)。
节点的当前状态记录在本地/var/run/nginx-ha-keepalived.state文件中。你能使用cat命令显示它:
centos7-1 # cat /var/run/nginx-ha-keepalived.state
STATE=MASTER
centos7-2 # cat /var/run/nginx-ha-keepalived.state
STATE=BACKUP
5 强制改变状态
为了强制主节点变为备用节点,运行以下命令:
# service keepalived stop
因为它关闭,Keepalived使用优先级0发送VRRP包给备用节点,导致备用节点接管虚拟IP地址。
6 添加更多虚拟IP地址
通过nginx-ha-setup脚本创建配置是非常基础的,产生单个IP地址的高可用。为了产生更多的高可用IP地址,添加新的IP地址到virtual_ipaddress块中。
virtual_ipaddress {
192.168.100.150
192.168.100.200
1234:5678:9abc:def::1/64
}
运行service Keepalived reload命令重载Keepalived服务:
centos7-1 # service keepalived reload
centos7-2 # service keepalived reload
如上所示,Keepalived能利用IPv4/IPv6双协议栈环境。
7 Keepalived和VRRP排错
Keepalived守护进程使用系统日志工具记录日志。在基于CentOS、RHEL和SLES的系统,输出通常写入/var/log/messages,然而在基于Ubuntu和Debian的系统,写入/var/log/syslog。日志条目记录事件,例如Keepalived守护进程启动和状态转变。
Feb 27 14:42:04 centos7-1 systemd: Starting LVS and VRRP High Availability Monitor...
Feb 27 14:42:04 Keepalived [19242]: Starting Keepalived v1.2.15 (02/26,2015)
Feb 27 14:42:04 Keepalived [19243]: Starting VRRP child process, pid=19244
Feb 27 14:42:04 Keepalived_vrrp [19244]: Registering Kernel netlink reflector
Feb 27 14:42:04 Keepalived_vrrp [19244]: Registering Kernel netlink command channel
Feb 27 14:42:04 Keepalived_vrrp [19244]: Registering gratuitous ARP shared channel
Feb 27 14:42:05 systemd: Started LVS and VRRP High Availability Monitor.
Feb 27 14:42:05 Keepalived_vrrp [19244]: Opening file '/etc/keepalived/keepalived.conf '.
Feb 27 14:42:05 Keepalived_vrrp [19244]: Truncating auth_pass to 8 characters
Feb 27 14:42:05 Keepalived_vrrp [19244]: Configuration is using: 64631 Bytes
Feb 27 14:42:05 Keepalived_vrrp [19244]: Using LinkWatch kernel netlink reflector...
Feb 27 14:42:05 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Entering BACKUP STATE
Feb 27 14:42:05 Keepalived_vrrp [19244]: VRRP sockpool: [ifindex(2), proto(112), unicast(1), fd(14,15)]
Feb 27 14:42:05 nginx -ha-keepalived: Transition to state 'BACKUP ' on VRRP instance 'VI_1 '.
Feb 27 14:42:05 Keepalived_vrrp [19244]: VRRP_Script(chk_nginx_service) succeeded
Feb 27 14:42:06 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) forcing a new MASTER election
Feb 27 14:42:06 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) forcing a new MASTER election
Feb 27 14:42:07 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 27 14:42:08 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 27 14:42:08 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) setting protocol VIPs.
Feb 27 14:42:08 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.100.150
Feb 27 14:42:08 nginx -ha-keepalived: Transition to state 'MASTER ' on VRRP instance 'VI_1 '.
Feb 27 14:42:13 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.100.150
如果系统日志没有说明问题源,使用以下参数运行tcpdump命令显示发送到本地网络的VRRP广播:
# tcpdump -vvv -ni eth0 proto vrrp
如果你有多个VRRP实例在本地网络,你只想输出通信节点和关注指定的服务,包括host参数并使用unicast_peer块指定关注着的IP地址:
centos7-1 # tcpdump -vvv -ni eth0 proto vrrp and host 192.168.100.101
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
14:48:27.188100 IP (tos 0xc0, ttl 255, id 382, offset 0, flags [none],
proto VRRP (112), length 40)
192.168.100.100 > 192.168.100.101: vrrp 192.168.100.100 >
192.168.100.101: VRRPv2 , Advertisement , vrid 51, prio 151,
authtype simple , intvl 1s, length 20, addrs: 192.168.100.150 auth
"f8f0e511"
几个对调试输出有用的字段:
- authtype——使用的验证类型(通过authentication指令设置)
-
vrip——虚拟路由ID(通过virtual_router_id指令设置)
-
prio——节点的优先级(通过priority指令设置)
-
intvl——发送广播频率(通过advert_int指令设置)
-
auth——身份验证令牌(通过auth_pass指令设置)
8 保持Nginx配置文件同步
Nginx配置文件在两个节点必须定义服务高可用。保持配置文件同步是集群软件之外的范围。配置例子在/usr/share/doc/nginx-ha-keepalived/目录中。