hazelcast的坑爹事

简介

开源中国的简介:

Hazelcast是一个高度可扩展的数据分发和集群平台。特性包括:

  • 提供java.util.{Queue, Set, List, Map}分布式实现。
  • 提供java.util.concurrency.locks.Lock分布式实现。
  • 提供java.util.concurrent.ExecutorService分布式实现。
  • 提供用于一对多关系的分布式MultiMap。
  • 提供用于发布/订阅的分布式Topic(主题)。
  • 通过JCA与J2EE容器集成和事务支持。
  • 提供用于安全集群的Socket层加密。
  • 支持同步和异步持久化。
  • 为Hibernate提供二级缓存Provider 。
  • 通过JMX监控和管理集群。
  • 支持动态HTTP Session集群。
  • 利用备份实现动态分割。
  • 支持动态故障恢复。

简介是美好的,现实是坑爹的。

优点

先说下优点吧:

有个Manager Center的管理界面,很漂亮,可以看到很多有用的数据。包括每个Map的请求次数等。这些在Memcached,Redis上只能看个大概。

简单的配置很方便,可以像JDK里的Map,List一样使用。

坑爹事情

配置各种找不到

有很多xml的配置方式没有写在文档上,要到代码里各种找。友情提示,可以到代码里的test目录下找到比较完整的配置:

https://github.com/hazelcast/hazelcast/blob/maintenance-3.x/hazelcast-spring/src/test/resources/com/hazelcast/spring/node-client-applicationContext-hazelcast.xml

有很多参数的配置没有写在文档上,要到代码里各种找。友情提示,在com.hazelcast.instance.GroupProperties 这个类里找到一些在文档上没有的配置参数。

默认的超时配置太长

很多超时配置都是上百秒的,试想现在的网站或者应用,有哪个可以忍受上百秒的超时。从另一个侧面也可以看出hazelcast的自己的信心不足,要靠超长时间的超时来保证运行的正确性。

即使配置了较短的超时时间,还是有可能会有各种出人意料的超时,认真研究过代码后,发现是有很多超时时间是在代码里写死的。。

版本之间不兼容

版本之间不兼容,不能滚动升级。这就意味着,当升级时,整个集群都要一块重启,这对很多网站来说,是不能忍受的。据说从3.1版本后会保证小版本的兼容性。

https://github.com/hazelcast/hazelcast/issues/14

hazelcast里代码一大问题就是把序列化方案和网络通讯混在一起了,导致各种升级兼容问题。每个消息包在解析时,都有可能因为类有改动而不兼容。

而且序列化方案还是那种要实现一个特定接口的。在Protobuf,Thrift,及各种基于反射的序列化方案这么流行的今天,很难想像会有这样难用的序列化方式。

一个结点出问题,影响整个集群

当集群里某个节点出故障时,比如OOM,CPU100%,没反应之后,集群里发到那个结点的操作就各种超时,各种不正常。这个可以算是hazelcast的一个致命的缺点。

我们线上的集群有30多个结点,随便一个有问题,都会导致整个集群有问题。另外,当集群里有一个应用下线/上线,都会引起数据的迁移,尽管迁移是自动的,但是也是一个不可控的风险。

我们开始时用的是hazelcast2.5.1,后来升级到3.1.3版本。升级后发现两个结点间经常会有网络流量超高的情况,最后发现是merge-policy的配置在3.0只能配置类的全名,而在2.5是可以配置一个简称的。然后在集群里有数据要迁移,进行Merge时,就会因为ClassNotFoundException而失败。而Hazelcast坑爹的地方在于它不断地重试,而且是无停顿地重试,从而导致两个结点之间网络流量超高,甚至超过了100Mbps。

hazelcast client很难用

首先,还是文档太少,很多配置根本没有提到,得自己到代码里去找。

另外,如果hazelcast server集群全部挂掉后,client居然不会自己重连(重试3次就放弃了)。现在的各种组件重启是很正常的事情,而hazelcast client居然不会自动重连,真心令人无语。更加扯蛋的是,比如map.get,如果没有连接上,会抛出一个RuntimeException,那么整个线程都退出了。

3.0版本和3.0.2版本之间的配置格式居然有很大的变化,很多时候,找个配置,得自己去看xml的xsd文件。。

结点之间Merge时,需要反序列化

这个我认为是代码太多导致的混乱。结点之间数据合并时,本来只要比较下数据的版本,时间等就可以了,但是在合并时却把对象反序化出来。如果在Server端没有对应的jar包,则会抛出ClassNotFoundException。

参考这里:

https://github.com/hazelcast/hazelcast/issues/1514

一些原理性的东东

Partition

从原理上来说,hazelcast是默认有271个partition,这271个parition平均分布在集群里的结点中,因此集群里的数据分散在每个结点中。然后在进行操作时,先计算得到key所在的partiion,再进行操作。

详细请参考PartitionServiceImpl这个类的代码:

public final int getPartitionId(Data key) {
    int hash = key.getPartitionHash();
    return (hash != Integer.MIN_VALUE) ? Math.abs(hash) % partitionCount : 0;
}

NearCache的实现原理

hazelcast里有一个所谓的nearcache的东东,其实这个很简单,就是一个本地的二级缓存。在get的时候先到本地的nearcache里查找,如果没有计算hash,再到对应的结点中取数据,再放到nearcache里。

参考:

http://www.oschina.net/p/hazelcast

http://www.hazelcast.org/docs/3.1/manual/html-single/

时间: 2024-11-17 18:43:22

hazelcast的坑爹事的相关文章

一次mapping field的修改过程

Elasticsearch 的坑爹事 本文记录一次Elasticsearch mapping field修改过程 团队使用Elasticsearch做日志的分类检索分析服务,使用了类似如下的_mapping { "settings" : { "number_of_shards" : 20 }, "mappings" : { "client" : { "properties" : { "ip&quo

细数史上十大坑爹软件

  坑爹软件之十:取消在线状态的手机QQ 前不久发布的手机QQ iPhone 4.0版/Android 4.1版在用户界面进一步向微信"学习",将所有好友的头像都显示为在线状态,并去除了"在线""离线"文字提示.这让很多手机QQ用户感到不习惯.愤怒的用户在App Store评价栏里给手机QQ打出了7万条"一星"评价,让手机QQ的口碑创下了历史新低. 不让用户看见QQ好友的登录设备,其目的是打造"无差别登录"

强烈推荐:程序员接私活那点事(http://www.jianshu.com/p/cfab9e80b7c4)

文章转自:<http://www.jianshu.com/p/cfab9e80b7c4>,感谢作者分享! --------------------------------------------------------------------------------------------------           今天周末在家宅着,并不是我不想运动,是因为北京的雨雪交加导致我想在家写文章,不过想想给大家写文章还是蛮惬意的,望一眼窗外,看一眼雪景,指尖在键盘上跳动,瞬间有种从屌丝程序员转

强烈推荐:程序员接私活那点事

公众号:smart_android 作者:耿广龙|loonggg       今天周末在家宅着,并不是我不想运动,是因为北京的雨雪交加导致我想在家写文章,不过想想给大家写文章还是蛮惬意的,望一眼窗外,看一眼雪景,指尖在键盘上跳动,瞬间有种从屌丝程序员转变成了小姑娘们都羡慕的文艺青年感觉.哈哈,幸好不是什么2B青年.   好了,言归正传,回到程序员接私活的话题上来吧.虽然说程序员都很累,但是热爱程序员的人又累得其所,所以虽然很多程序员都很忙,加班是常事,但是钱哪有挣够的啊,闲不住的程序员总想着干点

基准测试:Apache Ignite仍然领先于Hazelcast

当在谷歌中搜索Apache Ignite时,发生了一个奇怪的事:Hazelcast的广告跑到了列表的顶部,建议说Hazelcast比Ignite快50%: 要注意的第一个疑点是当你点击链接时,显示的是Hazelcast与一年前发布的Ignite的1.5版本的比较!另外,一段时间内吹嘘自己也是可以的,但是可笑的是这持续了一年而不在页面中更新基准测试结果. 那好,这可能是Hazelcast营销团队的疏忽,既然这样了,那么就有必要帮助他们展示一下Ignite和Hazelcast最新版本的当前状态. 常

2014年智能硬件十大坑爹事件,你中枪了没?

   2014年是智能硬件十分火热的一年,大小公司纷纷推出硬件产品,这么多产品泥沙俱下,加上各种搅局者进入,难免发生各种负面事件--有些坑消费者的爹,还有坑自己的爹.下面就来盘点一下本年度硬件行业的十大坑爹事件. 1.土曼:专注坑爹20年 "跳票王"土曼坑爹早已不是什么新鲜事儿了.去年9月,土曼手表预售在朋友圈疯狂转发十分成功,年末土曼经历多次跳票后,在过年前后,因为始终没有收到或者最终收到了产品,出现用户大面积的吐槽.其中杀伤力最大的是今年2月宗宁写的<我去年买了块土曼手表的被

专访Pwn2Own 2017 世界黑客大赛冠军队长MJ:这是一场出乎我意料的“坑爹”之旅

  4 月 5 日,雷锋网编辑要 360 安全战队队长.世界著名黑客 MJ 0011 (以下简称 MJ)拿着前不久在 Pwn2Own 2017 世界黑客大赛上的冠军奖杯拍个照. MJ 转了转奖杯的齿轮说,把它放在办公室里还能磨磨指甲. 其实,一个月前, MJ 本以为会云淡风轻地去加拿大参加大赛,没想到等待他的是一场"坑爹"之旅. [MJ 很伤心,没想到经过一场高度紧张的黑客大赛后,他没有瘦下来] 高难度漏洞:厂商要过年 3 月11日,携带一揽子"神奇漏洞"的 MJ

信用卡坑爹推销大曝光:杭州银行被批深夜扰民

推销,推而广之,打开销路.商家为了吸引更多的客户,常常用完美的推销语言.精美的产品服务"诱惑"客户,有着"金字招牌"的商业银行也不例外,但很多看似"完美"的推销背后却只是银行的"噱头",有些推销方式甚至让客户哭笑不得.本刊为大家揭露几种"坑爹"的银行信用卡推销伎俩. 信用卡广告深夜"扰民" 很多人都收到过商业银行贷款.信用卡分期.理财产品等业务的推销短信,但专挑三更半夜.持卡人正沉浸梦乡

告别精品,坑爹网游霸占收费榜

11月17日,苹果宣布支持中国银联进行支付,19日更是启动了1元促销活动.不知道是不是巧合,今天多家媒体同时发布了类似的新闻,苹果推出1元价格区间范围以后,相关应用下载量出现了暴涨. 12倍!这是应用分析机构App Annie对比了促销前后三周的应用下载量,最后得到出的数字.对游戏开发者来说这可能确实是一件值得高兴的事情,辛苦开发的游戏终于获得了收入上的增长,但对广大喜欢游戏的玩家来说这绝对不是一个好消息. 告别精品,坑爹网游霸占收费榜 "付费榜一水的网游,那些小而精的游戏再也看不到了"