keepalived在设计之初是为了配合LVS结合单点失败问题,并在后期加入了VRRP协议,进而为Nginx、HAProxy和MySQL等集群服务提供高可用解决方法,此篇主要看一下keepalived如何结合Nginx实现高可用。
此次实验,笔者准备了5台主机,2台作为后端web服务器,取名web-server1和web-server2;2台作为keepalived服务器,取名node1和node2;1台作为客户端测试工具,取名client。
- 后端web服务器准备
两台后端服务器均安装并启动Apache服务,并在web首页显示各自IP。
两台keepalived服务器均需安装Nginx服务和keepalived服务,keepalived在实现服务集群高可用方面可采用主备模式或双主模式等。
- 主备模式
2.1 安装并Nginx服务
node1和node2安装Nginx服务后,需在配置文件中添加upstream模块,都将后端两台web服务器加入到反向代理转发的分组中。为了区分,笔者将node2上反代时的web-server2权重设为2。
此时客户端通过两台keepalived服务器已经能访问到后端服务器,并且node1采用的是默认的轮询调度,node2是按照1:2的比例向后端服务器进行调度。
2.2 安装并配置keepalived服务
node1和node2均安装keepalived服务。
在主备模式中,笔者以node1为MASTER,node2为BACKUP,并添加VIP地址10.0.0.100/24,期望客户端通过VIP地址来访问到后端web服务器。此时node1和node2的keepalived配置文件需做如下图所示设置,两个节点的设置基本相同,区别在于router_id为各自的hostname,而且node1初始状态设为了MASTERE,且优先级为100。
2.3 客户端测试
2.3.1 启动服务并查看IP
此时node1和node2启动keepalived服务,按照笔者在两个节点配置文件中的设置,目前VIP地址是飘在初始状态为MASTER、优先级为100的node1上。
2.3.2 客户端访问
客户端访问VIP地址时,能正常访问到后端web服务器,说明在当前环境中,笔者配置的VIP地址是生效的,从返回页面的占比能看出是经过node1反向代理到后端web服务器的。
2.3.3 模拟MASTER节点故障
为了验证主备模式下的高可用,笔者停掉node1的keepalived服务模拟主节点出现故障情况。node1停掉keepalived服务后,查看node2的IP变化,可以看到VIP地址已自动飘过来了,实现了VIP地址的自动切换,此时客户端访问VIP地址时,依旧可以访问到后端web服务器,而且响应的内容占比为1:2,说明此时是通过node2来做反向代理的。
2.3.4 MASTER节点重回集群
当node1重回集群时,由于主备模式配置文件中node1的优先级为100,而node2的优先级为80,查看IP时,VIP又重新飘到了node1节点上,并且客户端通过VIP访问时的响应首页内容占比为1:1,说明是经过node1反向代理到后端服务器的。
- 双主模式
在双主模式下,node1和node2都保持正常服务时,客户端可以通过两个节点同时访问到后端对应的服务器,只有当某一个节点出现故障时,才会将飘在该故障节点的VIP地址切换到备用节点上。
3.1 keepalived配置文件设置
双主模式下,笔者的后端web服务器和两个节点上的Nginx服务配置保持不变,主要是在keepalived配置文件中添加新的vrrp_instance,并让VIP地址10.0.0.101在初始状态下飘到node2上。
在以上的主备模式下,vrrp_instance名称为VI_1,那笔者将node2作为主节点的vrrp_instance名称定为VI_2,在VI_2中,node2初始状态要定为MASTER,并且优先级要高于node1。每个路由服务器的virtual_router_id是唯一的,要区别开。此外如果给VIP地址设定了标签的话,需要保证标签是不冲突的。
3.2 客户端测试
3.2.1 启动服务并查看IP
node1和node2重启keepalived服务后,查看IP时可以看到各自都有了一个VIP地址。
3.2.2 客户端访问
客户端可通过两个VIP地址进行后端服务器的访问,并且通过返回内容的占比可看出是各VIP对应的节点进行的反向代理。
3.2.3 模拟某一个主节点出现故障
此时停掉node1上的keepalived服务来模拟双主模式下的一个主节点出现故障的情况,查看IP时,node1上绑定的VIP地址飘到了node2上,客户端访问时,依旧还能通过之前飘在node1上的10.0.0.100这个VIP地址来进行后端web访问,但是返回的页面内容占比变成了1:2,可见是由node2反向代理过去的。
3.2.4 故障节点重回集群
与主从模式一样,虽然是双主模式,但在vrrp_instance名称为VI_1虚拟路由器中,node2为node1的BACKUP节点,所以当node1重启keepalived服务后,10.0.0.100的VIP地址又会飘回到node1上,客户端通过该VIP访问后端服务器时又是经过了node1节点的。