论坛首页 Java企业应用论坛

J2EE集群之failover小点子

浏览 20085 次
该帖已经被评为良好帖
作者 正文
   发表时间: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备份。

嘿嘿, 不知道你明白我的意思没有, 表达能力挺挫的我
0 请登录后投票
   发表时间: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集群中,一般不会有数据在多个节点重复存在的情况。
0 请登录后投票
   发表时间:2011-08-22  
学习了,备份,以后用到时 测试,貌似现在看起来很深奥
0 请登录后投票
   发表时间: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就真的丢失了(用户感情伤不起啊)”
0 请登录后投票
   发表时间: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就是从内存中彻底清除了
0 请登录后投票
   发表时间:2011-08-22  
这个对TOMCAT 版本有限制吗?
0 请登录后投票
   发表时间:2011-08-22  
8210 写道
这个对TOMCAT 版本有限制吗?

我使用的是Tomcat6、

原理很简单的, 就是替换了原来的Manager。

应该其他的Tomcat也可以使用, 我感觉只要是J2EE的服务器都可以基于这种原理进行优化
0 请登录后投票
   发表时间:2011-08-22  
好的,谢谢,我试一下
0 请登录后投票
   发表时间: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独立开来。
0 请登录后投票
   发表时间: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单独配置一台服务器不划算
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics