Nginx+Tomcat+lvs+Keepalived搭建的高可用架构

Nginx+Tomcat+lvs+Keepalived搭建的高可用架构
上图所示是用Nginx做前端服务器,Tomcat做后端服务器搭建的高可用架构,其中Memcache用来缓存session,后端服务器都从memcache中获取session,避免了session不一致的问题。但是这个架构存在明显的两个问题:
一、如果前端的Nginx服务器挂了,系统就挂了
二、因为上形、下形流量都要走前端Nginx服务器,所以Nginx服务器的带宽和IO将会是系统的瓶颈所在。
解决问题一:添加一个Nginx的从服务器,使用Keepalived来监听主Nginx服务器。若主Nginx挂机,则将虚拟IP“切换”到从服务器。其核心是vrrp协议(虚拟IP漂移协议)。当然也可以编写一个shell脚本来监听。
解决问题二:核心的思想是“分流”,如下图:
Nginx+Tomcat+lvs+Keepalived搭建的高可用架构
就是说,从后端服务器响应的数据直接返回到客户端浏览器,而不经过Nginx前端服务器,瓶颈就不在Nginx前端服务器了。但是这里又有一个问题,就是,客户端会接收直接从后端服务器返回的数据吗?答案是不会。因为http协议的底层是tcp协议,而tcp协议是基于握手的协议,第一次客户端是与Nginx前端服务器进行握手并提交请求的,所以,它只能接受Nginx前端服务器的响应数据。所以,为了让客户端能够接收后端服务器的响应数据,我们采取一种“IP欺骗的技术”。
简单地说就是响应数据包的包头中会有目的IP和原IP,我们只需要将原IP改为Nginx前端服务器中的虚拟IP即可(前端服务器与客户端是基于虚拟IP握手的)。但是为了达到这个目的,就需要在后端服务器中都绑定那个虚拟IP,这样就又会有新的问题,就是因为前端服务器与后端服务器是通过内部局域网通信的,那么由于后端服务器有同样的虚拟IP,就会导致前端服务器的广播出现紊乱,(因为所有机器的IP都一样),为了解决这个问题,需要将后端服务器中的绑定的虚拟IP“隐藏起来”。具体的方法可以在绑定虚拟IP时添加错误的子网掩码,这样就不会在路由器中注册了,即“隐藏”了。
这个过程还是挺复杂的,而LVS就可以通过简单的配置来达到IP欺骗的目的。
Nginx+Tomcat+lvs+Keepalived搭建的高可用架构
这就是一个使用lvs的DR模式搭建的高可用架构。其中后端服务器可以使用Tomcat、Nginx、Httpd等。具体的配置见lvs官网
其中LVS-BACKUP与LVS-ACTIVE仍然是通过Keepalived监听的。这样同时可以达到对后端服务器的健康检查的目的。