锁定老帖子 主题:J2EE集群之failover小点子
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-08-22
michael.softtech 写道 想法不错,不过有些地方还需商榷。 就我个人来看,存在如下问题: 1. 就像楼主说的,tomcat多的时候session 复制存在问题。假设现在有1000台Tomcast Server,楼主觉得应该 用多少memcached ? 如果少的话,每个memcached需要维护大量的session信息,而sessin本身是频繁变化的(通常情 况下session过期时间不会太久),那么memcached的工作就十分沉重. 如果memcached多的话,从楼主的思路来看,因为负载层面可能是在fail-over的情况下面随机选择另一个tomcat,那么为了保证肯定能取到session,就需要每个memcached-1都备份一份,这个备份效率能接受吗? 2. 此外,多备份情况下,如何保证多备份数据在偶然情况下的session一致性? 比如某台memcached偶然网络出问题了, 恰好在这时进行了session invalidate操作,于是就产生了不一致性。这种不一致某些情况下会带来意想不到的后果。 所以我觉得这种思路研究研究还不错,如果真要使用的话,尚需验证。 我的想法是每个Tomcat对应一个Memcached、 这个Memcached不需要多大, 内存可能需要占用几十M吧。 它的CPU占用也是很低的,网上有过类似测试。 就是如果1000台Tomcat的话, 每台Tomcat上都安装一个Memcached(基本不占用多少系统资源,可能几十MB的内存,5%的CPU吧)。 然后每台Tomcat都将自己的 Session 按哈希码平均分布在其他999台Tomcat所在电脑的 Memcached 上。 也就是每台 Memcached 的真实Session备份数量是一台Tomcat的Session数量。 另外你说的备份时invalidate、 我的构思是Session备份是异步的, 即每个会话结束之后,都将需要更新缓存的Session放在一个队列里面, 这个队列由其他的后台线程负责更新缓存。 在Tomcat不宕机的情况下、 Tomcat是不需要从Memcached中读取Session的,只需要写入Session(备份)。 只有在某台Tomcat宕机了,才尝试从Memcached中读取宕机Tomcat中的Session备份。 嘿嘿, 不知道你明白我的意思没有, 表达能力挺挫的我 |
|
返回顶楼 | |
发表时间:2011-08-22
michael.softtech 写道 想法不错,不过有些地方还需商榷。 就我个人来看,存在如下问题: 1. 就像楼主说的,tomcat多的时候session 复制存在问题。假设现在有1000台Tomcast Server,楼主觉得应该 用多少memcached ? 如果少的话,每个memcached需要维护大量的session信息,而sessin本身是频繁变化的(通常情 况下session过期时间不会太久),那么memcached的工作就十分沉重. 如果memcached多的话,从楼主的思路来看,因为负载层面可能是在fail-over的情况下面随机选择另一个tomcat,那么为了保证肯定能取到session,就需要每个memcached-1都备份一份,这个备份效率能接受吗? 2. 此外,多备份情况下,如何保证多备份数据在偶然情况下的session一致性? 比如某台memcached偶然网络出问题了, 恰好在这时进行了session invalidate操作,于是就产生了不一致性。这种不一致某些情况下会带来意想不到的后果。 所以我觉得这种思路研究研究还不错,如果真要使用的话,尚需验证。 红色部分的就是属于 XMemcached 将数据的散列分布问题了。 据我对XMemcached的了解, 它应该不会将同一个数据存入不同Memcached服务器中, 它会根据哈希码求余数, 然后放入余数相对应的Memcached中(这些Memcached都是有顺序的) 也就是整个Memcached集群中,一般不会有数据在多个节点重复存在的情况。 |
|
返回顶楼 | |
发表时间:2011-08-22
学习了,备份,以后用到时 测试,貌似现在看起来很深奥
|
|
返回顶楼 | |
发表时间:2011-08-22
最后修改:2011-08-22
引用 假设 Memcached_A 宕机,那么整个集群中保存在 Memcached_A 中的Session备份就丢失,那么 Tomcat_B 和 Tomcat_C 中的Session就没有了备份。 如果这时这两台服务器再挂断的话,Session就真的丢失了(用户感情伤不起啊)。为了保证 “整个集群中随时都存有同一个Session的备份 ”, Tomcat_B 和 Tomcat_C 应该为自身的Session负责。他们应该主动把自己的 Session 再备份一次(可以采用临时新建线程的方式, 毕竟宕机不是频繁的么。属于特殊情况),再次备份到其他的可用 Memcached 节点中。 有几个地方不解,希望楼主解答一下: 1.Tomcat_A的session在MEMCACHE_B和MEMCACHE_C上存在完整的备份吗 2.如果如1所说是完整的交叉备份,那么如果MEMCACHE_A挂了,为什么说Tomcat_B和Tomcat_C的备份就丢了?MEMCACHE_C应该还有Tomcat_B的备份啊,MEMCACHE_B应该还有Tomcat_C的备份啊。 这样如果 Memcached_A 宕机 Tomcat_B 和 Tomcat_C 也宕机,只剩下Tomcat_A和MEMCACHE_B、MEMCACHE_C 负载均衡全部将请求转发给Tomcat_A,原属于B和C的请求,A也可以在MEMCACHE_B(可以找到C的session)、MEMCACHE_C(可以找到B的session)中找到session,为何说“Session就真的丢失了(用户感情伤不起啊)” |
|
返回顶楼 | |
发表时间:2011-08-22
Dark-Mraz 写道 引用 假设 Memcached_A 宕机,那么整个集群中保存在 Memcached_A 中的Session备份就丢失,那么 Tomcat_B 和 Tomcat_C 中的Session就没有了备份。 如果这时这两台服务器再挂断的话,Session就真的丢失了(用户感情伤不起啊)。为了保证 “整个集群中随时都存有同一个Session的备份 ”, Tomcat_B 和 Tomcat_C 应该为自身的Session负责。他们应该主动把自己的 Session 再备份一次(可以采用临时新建线程的方式, 毕竟宕机不是频繁的么。属于特殊情况),再次备份到其他的可用 Memcached 节点中。 有几个地方不解,希望楼主解答一下: 1.Tomcat_A的session在MEMCACHE_B和MEMCACHE_C上存在完整的备份吗 2.如果如1所说是完整的交叉备份,那么如果MEMCACHE_A挂了,为什么说Tomcat_B和Tomcat_C的备份就丢了?MEMCACHE_C应该还有Tomcat_B的备份啊,MEMCACHE_B应该还有Tomcat_C的备份啊。 这样如果 Memcached_A 宕机 Tomcat_B 和 Tomcat_C 也宕机,只剩下Tomcat_A和MEMCACHE_B、MEMCACHE_C 负载均衡全部将请求转发给Tomcat_A,原属于B和C的请求,A也可以在MEMCACHE_B(可以找到C的session)、MEMCACHE_C(可以找到B的session)中找到session,为何说“Session就真的丢失了(用户感情伤不起啊)” Q&A: 1、 是的,Tomcat_A的Session在Memcached_B和Memcached_C上是平均分布的,如果TomcatA宕机的话, Tomcat_B或Tomcat_C就可以从Memcached_B或Memcached_C中将这些备份Session读取出来。 这样可以始终保持Session在Tomcat集群和Memcached集群中保存两份。 2、Tomcat_B的Session是随机分布在Memcached_A或Memcached_C中的。 如果Memcached_A宕机的话, 这些Session中分布在Memcached_A上的Session是不是就丢失了么。这时候Tomcat_B中在Memcached_A中备份的Session没有了。 如果紧接着Tomcat_B也宕机了、 这个Session就是从内存中彻底清除了 |
|
返回顶楼 | |
发表时间:2011-08-22
这个对TOMCAT 版本有限制吗?
|
|
返回顶楼 | |
发表时间:2011-08-22
8210 写道 这个对TOMCAT 版本有限制吗? 我使用的是Tomcat6、 原理很简单的, 就是替换了原来的Manager。 应该其他的Tomcat也可以使用, 我感觉只要是J2EE的服务器都可以基于这种原理进行优化 |
|
返回顶楼 | |
发表时间:2011-08-22
好的,谢谢,我试一下
|
|
返回顶楼 | |
发表时间:2011-08-22
s929498110 写道 michael.softtech 写道 想法不错,不过有些地方还需商榷。 就我个人来看,存在如下问题: 1. 就像楼主说的,tomcat多的时候session 复制存在问题。假设现在有1000台Tomcast Server,楼主觉得应该 用多少memcached ? 如果少的话,每个memcached需要维护大量的session信息,而sessin本身是频繁变化的(通常情 况下session过期时间不会太久),那么memcached的工作就十分沉重. 如果memcached多的话,从楼主的思路来看,因为负载层面可能是在fail-over的情况下面随机选择另一个tomcat,那么为了保证肯定能取到session,就需要每个memcached-1都备份一份,这个备份效率能接受吗? 2. 此外,多备份情况下,如何保证多备份数据在偶然情况下的session一致性? 比如某台memcached偶然网络出问题了, 恰好在这时进行了session invalidate操作,于是就产生了不一致性。这种不一致某些情况下会带来意想不到的后果。 所以我觉得这种思路研究研究还不错,如果真要使用的话,尚需验证。 我的想法是每个Tomcat对应一个Memcached、 这个Memcached不需要多大, 内存可能需要占用几十M吧。 它的CPU占用也是很低的,网上有过类似测试。 就是如果1000台Tomcat的话, 每台Tomcat上都安装一个Memcached(基本不占用多少系统资源,可能几十MB的内存,5%的CPU吧)。 然后每台Tomcat都将自己的 Session 按哈希码平均分布在其他999台Tomcat所在电脑的 Memcached 上。 也就是每台 Memcached 的真实Session备份数量是一台Tomcat的Session数量。 另外你说的备份时invalidate、 我的构思是Session备份是异步的, 即每个会话结束之后,都将需要更新缓存的Session放在一个队列里面, 这个队列由其他的后台线程负责更新缓存。 在Tomcat不宕机的情况下、 Tomcat是不需要从Memcached中读取Session的,只需要写入Session(备份)。 只有在某台Tomcat宕机了,才尝试从Memcached中读取宕机Tomcat中的Session备份。 嘿嘿, 不知道你明白我的意思没有, 表达能力挺挫的我 哦,你这样一说我就明白了。呵呵。 我开始以为不同memcached之间也有部分Session冗余哪。 其实你这个有点像独立的Session服务器了。最大的区别就是结合了tomcat的本地session进行了优化。 如果本地有,那么就不需要从Session服务器读取。 比单纯使用Session独立服务器有一定的效率提高。 我觉得这种情况下memcached最好单独部署,尤其是和tomcat的部署分开来. 同时Memcached的数量最好有一个合理的值。 每台Tomcat一个Memcached....这个应该还能优化吧呵呵。 完全可以把Tomcat和Memcached独立开来。 |
|
返回顶楼 | |
发表时间:2011-08-22
michael.softtech 写道 s929498110 写道 michael.softtech 写道 想法不错,不过有些地方还需商榷。 就我个人来看,存在如下问题: 1. 就像楼主说的,tomcat多的时候session 复制存在问题。假设现在有1000台Tomcast Server,楼主觉得应该 用多少memcached ? 如果少的话,每个memcached需要维护大量的session信息,而sessin本身是频繁变化的(通常情 况下session过期时间不会太久),那么memcached的工作就十分沉重. 如果memcached多的话,从楼主的思路来看,因为负载层面可能是在fail-over的情况下面随机选择另一个tomcat,那么为了保证肯定能取到session,就需要每个memcached-1都备份一份,这个备份效率能接受吗? 2. 此外,多备份情况下,如何保证多备份数据在偶然情况下的session一致性? 比如某台memcached偶然网络出问题了, 恰好在这时进行了session invalidate操作,于是就产生了不一致性。这种不一致某些情况下会带来意想不到的后果。 所以我觉得这种思路研究研究还不错,如果真要使用的话,尚需验证。 我的想法是每个Tomcat对应一个Memcached、 这个Memcached不需要多大, 内存可能需要占用几十M吧。 它的CPU占用也是很低的,网上有过类似测试。 就是如果1000台Tomcat的话, 每台Tomcat上都安装一个Memcached(基本不占用多少系统资源,可能几十MB的内存,5%的CPU吧)。 然后每台Tomcat都将自己的 Session 按哈希码平均分布在其他999台Tomcat所在电脑的 Memcached 上。 也就是每台 Memcached 的真实Session备份数量是一台Tomcat的Session数量。 另外你说的备份时invalidate、 我的构思是Session备份是异步的, 即每个会话结束之后,都将需要更新缓存的Session放在一个队列里面, 这个队列由其他的后台线程负责更新缓存。 在Tomcat不宕机的情况下、 Tomcat是不需要从Memcached中读取Session的,只需要写入Session(备份)。 只有在某台Tomcat宕机了,才尝试从Memcached中读取宕机Tomcat中的Session备份。 嘿嘿, 不知道你明白我的意思没有, 表达能力挺挫的我 哦,你这样一说我就明白了。呵呵。 我开始以为不同memcached之间也有部分Session冗余哪。 其实你这个有点像独立的Session服务器了。最大的区别就是结合了tomcat的本地session进行了优化。 如果本地有,那么就不需要从Session服务器读取。 比单纯使用Session独立服务器有一定的效率提高。 我觉得这种情况下memcached最好单独部署,尤其是和tomcat的部署分开来. 同时Memcached的数量最好有一个合理的值。 每台Tomcat一个Memcached....这个应该还能优化吧呵呵。 完全可以把Tomcat和Memcached独立开来。 嘿嘿、 是吧。 但是我感觉为Memcached单独配置一台服务器不划算 |
|
返回顶楼 | |