keepalived+lvs+nginx
在微服务项目中前段的负载均衡的稳定性是一个非常大的考验,这里我们使用keepalived+lvs+nginx完成我们前段的负载均衡
什么是高可用?
nginx做负载均衡,能达到分发请求的目的,但是不能很好的避免单点故障。
1、Nginx集群单点问题
分发器宕机
假如nginx服务器挂掉了,那么所有的服务也会跟着瘫痪 。
一种方法是人为监控,发现主分发器宕机后,立马登录备分发器,并给它分配虚ip。
另一种办法是用软件来替代人来监控,自动登录备分发器,分配虚ip。数据服务器宕机
分发器可以自动判断数据服务器的存活状态,不对宕机服务器要数据。
2、keepalived介绍
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使 其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
总结来说:Keepalived软件是一个监控+自愈的软件。
运行协议是VRRP,主分发器的keepalived会向网络中发组播,宣告自己还活着,组播地址:224.0.0.18。
3、LVS
在keepalived+nginx的主备容灾高可用的架构中,nginx是作为外部访问系统的唯一入口,理论上一台nginx的最大并发量可以高达50000,但是当并发量更大的时候,keepalived+nginx的高可用机制是没办法满足需求的,因为keepalived+nginx的架构中确确实实是一台nginx在工作,只有当master宕机或异常的时候,备份机才会上位。那么如何解决更大的高并发问题呢,也许你会问能不能搭建nginx集群,直接对外提供访问?很显然这是欠妥当的,因为当nginx作为外部的唯一访问入口,没办法直接以集群的形式对外提供服务,没有那么多的公网ip资源可用,既太浪费也不友好。但是在内网环境下,是可以用nginx集群(nginx横向扩展服务集合)的,当然总得有一个对外入口,所以需要在nginx集群之上,在加一层负载均衡器LVS,作为系统的唯一入口。
环境准备
| 主机名 | IP | 作用 |
|---|---|---|
| node1 | 192.168.31.145 | 虚拟IP(VIP) |
| node2(lvskeepalived1) | 192.168.31.93 | LVS+ Keepalived Master(LVS将请求负载至nginx1 或者 nginx2) |
| node3(lvskeepalived2) | 192.168.31.91 | LVS+ Keepalived Backup (lvskeepalived1的备机) |
| node4(nginx1) | 192.168.31.165 | Nginx1(将请求负载至后端web1 或者 web2) |
| node5(nginx2) | 192.168.31.179 | Nginx2(将请求负载至后端web1 或者 web2) |
| node6(web1) | 192.168.31.97 | Web1(静态web服务器) |
| node7(web2) | 192.168.31.86 | Web2(静态web服务器) |
软件安装
1、在lvskeepalived1 和 lvskeepalived2 机器上面安装 ipvsadm 和 keepalived:
1 | [root@node1 ~]# yum -y install ipvsadm keepalived |
查看两台负载均衡机器是否支持lvs
1 | [root@node1 ~]# lsmod |grep ip_vs |
2、在Nginx1和Nginx2机器上安装Nginx
自行安装Nginx
3、在web1和web2上面安装Apache
1 | yum -y install httpd |
配置网页:
实际配置网页内容应该一样,但是为了演示nginx负载均衡效果,我们将网页内容一个配置成web1, 一个配置成web2。
1 | 在web1配置如下: |
4、配置keepalived
- 在lvskeepalived1(master)上配置:
1 | [root@node2 ~]# vim /etc/keepalived/keepalived.conf |
在lvskeepalived2(backup)上配置:
lvs_id director1 改成 lvs_id director2
state MASTER 改成 state BACKUP
priority 151 改成 priority 101
1 | [root@node3 ~]# vim /etc/keepalived/keepalived.conf |
5、配置Nginx
在nginx1 和 nginx2 机器上面配置负载均衡:(两台机器一模一样的配置)
实现将访问本机80端口的请求轮询定向到后端的两台apache服务器:
我们这里只演示两台apache web 服务器, 你也可以配置多台。
1 | [root@node5 conf]# vim /usr/local/nginx/conf/nginx.conf |
在nginx1 和 nginx2 机器上面配置虚拟IP: (两台nginx机器, 一模一样的配置)
因为我们使用的lvs调度器是DR模式,前面我们讲到过,这种模式下,对客户端的响应是真实服务器直接返回给客户端的,而真实服务器需要将响应报文中的源ip修改为虚拟ip,这里配置的虚拟ip就是起这个作用的。我们编辑/etc/init.d/lvsrs文件,写入如下内容:
1 | [root@node4 conf]# vim /etc/init.d/lvsrs |
然后执行脚本:(两台Nginx)
1 | [root@node4 init.d]# chmod 755 lvsrs |

查看ip lo:0 和路由是否添加成功:
1 | [root@node4 init.d]# ip a | grep -i lo:0 |


如果可以看到上述结果,证明 lo:0和路由都已经配置成功。
测试
1、启动Nginx服务,验证Nginx负载功能
1 | [root@node4 init.d]# /usr/local/nginx/sbin/nginx |
测试分别访问nginx1和nginx2的网页, 可以看到请求轮询定向到后端的两台web服务器上, 所以Nginx 负载功能验证成功。
1 | [root@node2 ~]# while [ TRUR ]; do curl http://192.168.31.165:80; sleep 2 ; done |

2、启动keepalived
在lvskeepalived1 和 lvskeepalived2 服务器上启动keepalived.
1 | systemctl start keepalived |
过几秒就可以看到VIP在master和backup机器上面
1 | [root@node2 ~]# ip a | grep -i ens33 |

通过VIP访问网页:


访问成功, 可见LVS 成功将请求转发到了后端web server 上。
3、keepalived高可用测试
- 停掉主keepalived,备份keepalived还是可以运行的
4、LVS监控真实服务测试
- 查看最新的虚拟ip对应的RealServer的情况
VIP:192.168.31.145
Realserver1 IP: 192.168.31.165
Realserver2 IP: 192.168.31.179
1 | [root@node2 ~]# ipvsadm -Ln |

停掉其中一个Nginx也可以正常运行
注意:
1 | 开启端口 |
docker方式
1 | [root@VM-24-12-centos ~]# docker run -itd --name lvsKeepalived1 --privileged=true -p 101:22 centos:7 |
全部容器
1 | [root@VM-24-12-centos ~]# docker ps |
ip地址情况
1 | 172.17.0.5 # nginx1 |
配置lvskeepalived时,宿主机要开启ipvsadm,否则容器内会报错