Tomcat+Nginx+Keepalived+Redis集群

来源:互联网 发布:韩服数据 编辑:程序博客网 时间:2024/05/22 15:06
    当一个web项目的用户量增大以至于单个节点无法承担访问压力时,我们首先需要对代码进行优化,查看代码中是否有内存泄漏,是否有资源没有关闭,是否有算法可以优化等等,另外我们需要优化数据库,是否是查询性能低,可以建立索引等。当代码层面的问题我们都处理过之后,下面就需要考虑系统架构了。
    我们首先要做的就是数据库与web应用分离。数据库服务器用户提供数据库服务,而web服务器仅仅对外提供web服务。这个时候,如果web服务器的访问压力依然很大,我们可能就需要考虑web服务的集群问题,也就是Tomcat的集群问题。
    tomcat集群就是由多个服务器中部署tomcat应用(一台服务器可以部署一个或多个tomcat),多个tomcat上部署同一个web应用。用户就可以尝试访问多个tomcat来缓解压力。当然,让用户选择服务器的方式毕竟是不好的,第一是用户选择具有不确定性,可能很多人都选择第一个服务器,这样就会造成第一个服务器的压力过大,而集群中其他的服务器浪费,第二用户的体验度不好。那么不让用户选择,又能均匀的分摊到每台服务器,我们该怎么办呢?这个时候负载均衡就出现了。
    所谓的负载均衡就是在众多的tomcat前面再加一台服务器,这个服务器不做具体的业务操作,仅仅是接收用户的请求,然后将用户请求均匀的分摊到对外提供服务的tomcat中。Web服务的集群第一层负载均衡我们一般使用nginx,nginx提供了强大的路径匹配规则。当用户访问我们的网站时,首先到达的是nginx,然后由nginx根据相应的负载均衡算法选择指定的tomcat,然后由nginx来访问tomcat并由nginx来给用户响应结果。但这种方式是有一定的问题的。
    第一个是所有的访问都会走nginx,会造成nginx节点的访问压力大。对于这个问题,虽然看上去压力会比较大,但实际上处理的信息并不多,因此不会很大。如果确实压力比较大怎么办呢,我们可以使用lvs或者硬件设备F5来做负载均衡。lvs的dr模式可以非常轻松的解决这个问题。具体的dr模式这里不过多的解释,就是请求来的时候走lvs节点,数据返回的时候直接由真实提供服务的机器来返回数据,不走lvs节点。这样就大大降低了负载均衡节点的压力。
    第二个是如果一旦nginx节点宕机,那么整个服务都不能对外提供服务。这个问题涉及到了Ha(High available),可以通过keepalived进行心跳探测,一旦服务器宕机立马切换为备用节点。
    第三个是session同步问题,我们知道http是无状态的,为了表示一次会话,引入了session,在这里不深入session的原理,我们知道,每次会话都会产生一个session存储到服务端,我们也就是根据session来做一些验证,比如用户登录等等。如果使用了多台服务器集群,比如我们第一次请求了第一个机器,做了登录,第二次负载均衡设备给我们路由到了第二台机器,那么session是存到了第一台机器上,第二台机器依然不认为登录,这就造成了问题。解决这个问题的关键就在于需要将集群中的多个tomcat看成一个,然后提供一个公共的场所来保存session。这就是共享session。如何来做到共享session呢?我们可以把session存到数据库中,然后来请求就到数据库中去检索。这样是比较耗费性能的,另外session不用一段时间需要销毁,使用数据库来处理需要来使用定时任务,依然不是很方便。这个时候我们可以使用内存数据库Redis,它可以为我们提供方便的读写。
    Redis是一个内存数据库,存储的是键值对的形式。这样就把session从tomcat维护放到了有Redis来维护了。这样对于一个tomcat+nginx+redis架构也就完成了