看了好多关于Nginx,LVS等的文章,跟很多朋友讨论,自己的项目组也实现了一个demo,今天终于搞清了关系。
LVS是一个四层负载均衡,四层就是OSI模型的第四层,TCP/IP层,它是根据cip,cport,sip,sport等做负载均衡,并不理解HTTP等请求内容(因为那是第七层应用层管的事),所以对于海量请求,最前面比较适合搞个LVS做负载,分发请求
Nginx是一个有很多功能的Server,它首先是一个反向代理Web服务器,然后可以做七层负载均衡器,还有重写URL,静态缓存等功能。由于其工作在应用层,因此能够理解HTTP协议,因此可以通过URL做分发,可以实现动静分离,比如把动态请求转给tomcat,相当于apache服务器的mod_jk。其可以自己处理静态内容。当然这都是因为其可以通过指定location参数配置的,你想实现怎么样的分发都可以。其还有内置模块基于ip分发。其还支持健康检查,有机器挂了就自动不再发到那台机器了。
KeepAlived是用来心跳负载均衡器的,这只有当负载均衡器是集群时才用到的,当一个负载均衡器挂了,可以无缝切换到其他负载均衡器上。
Session保持依靠两个机制,一个是session sticky,基于nginx使用它的一个插件jvm_route,LVS的看来应该是采用source hash这种策略。另外就是当后面的应用服务器挂了,session怎么办,一种方案是session复制,tomcat自己的方式;一种方案是共享存储session,可以是memcache等,我们选用了Terracotta,优点是对代码没有侵入性,不需要实现序列化接口,堆级复制,对变化同步,跟memcache比性能会差些,差多少没测过。
Squid静态缓存服务器,现在Nginx基本可以搞定这个事情了,效率甚至更高。
所以大网站的策略是 LVS+Squid+Nginx+Memcache+Tomcat+Terracotta
Memcache或是Redis这种东东来替代数据库加速数据访问。
LVS高效的负载均衡到各个Nginx上,Ngtinx再分发,做动静分离。
对于大量读的网站,大多数请求估计到不了Tomcat,都被Nginx转到静态页面缓存的服务器上去了。
CDN技术可以帮助网站路由到离用户最近的CDN节点,读取上面的内容。
这些都是针对大量读的网站,读写分离,对并发事务的锁要求非常低,并发事务并不可怕,可怕的是锁。
下面是一个大牛的blog,讲了好多经验,人家都是处理数十亿pv的
下面是将Redis的