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/
hazelcast的坑爹事相关推荐
- 一个出身寒门的状元之死全文【原文】
一个出身寒门的状元之死全文[原文] 来源: 才华有限青年 2019年1月8号,我接到了高中同学周有择胃癌去世的消息. 他去世的时候,身份是国内某企业的一名财务会计师,银行卡里还有3700.6块钱.但是 ...
- 部署外网网站(二)——宝塔搭建服务器
文章目录 前言 正文 1. 脚本安装 2. 记录好账号密码,登录页面 3. 修改用户名和密码方便以后登录 4. 绑定宝塔面板账号 5. 安装首页提供的套装 6. 测试一下 7. 添加一下默认网站默认站 ...
- 一个出身寒门的状元之编程
来源:不才黄某(ID:HelloJasonHuang) 原文地址:这里 2019年1月31号,也就是今天,我接到了高中同学周有码编程失利的消息. 他编程的时候,身份是国内某知名互联网公司的技术专家,银 ...
- 【运维囧事】Citrix Xendesktop 与 XML 集成时添加信任关系
不得不说,Citrix的相关产品的安全做的真TNND的强悍... 装完Xendesktop后,启用Smart Card来做认证.NND,就是过不去.提示说服务器之间不信任... 错误详细信息:The ...
- PC2日记——坑爹的第一天2014/08/28
我不想安慰自己说今天是因为第一次将pc2用于实际的比赛经验不足而导致的今天出现种种问题,我想说的是自从我開始干后台我所做的每一件事都是第一次,所以这绝对不是让自己免去责怪的理由:我想说的是假设我今天是 ...
- 妈蛋:kinMaxShow轮播图异常,WebUploader图片上传坑爹,图片被压缩了
2019独角兽企业重金招聘Python工程师标准>>> 今天晚上在改造轮播图. 原来的代码是这样的: <div> <img src="${static}/ ...
- 理解 Lua 的那些坑爹特性
Lua 那些坑爹的特性 来源 https://blog.lilydjwg.me/2012/12/29/lua-caveats.36879.html 协程只能在 Lua 代码中使用 协程(corouti ...
- Android 强烈推荐:程序员接私活那点事
今天周末在家宅着,并不是我不想运动,是因为北京的雨雪交加导致我想在家写文章,不过想想给大家写文章还是蛮惬意的,望一眼窗外,看一眼雪景,指尖在键盘上跳动,瞬间有种从屌丝程序员转变成了小姑娘们都羡慕的文艺 ...
- TCP的那些事(转载)
(转载本站文章请注明作者和出处 酷 壳 – CoolShell.cn ,请勿用于任何商业用途) TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身 ...
最新文章
- vim 编辑器安装 使用
- numpy.argwhere 返回的为索引值的array
- java panel 显示文字,从动态添加的jPanel获取文本
- 空间连接时计算总和_【数据技术】城市功能混合程度计算
- openstack实例控制台显示响应时间过长_监控OpenStack的技巧
- in-place数据交换
- [CATARC_2017] 第八周
- 案例一(haproxy+keepalived高可用负载均衡系统)【转】
- SQL 面试题及答案(一)
- linux fb设备驱动,linux设备驱动归纳总结(八):1.总线、设备和驱动
- linux vi代码高亮,linux Vi编辑器代码高亮设置及永久显示行号的方法
- 李铁被传下课之际,梅西却要七拿金球奖了?这波预测没毛病
- 指环王中那个白色头发、擅长用弓箭的精灵族男子
- ffmpeg生成缩略图
- 顺序表前m和后n元素交换位置
- 在线生成favorite ico的网站
- 【持续更新】2007-2022年英伟达历代桌面Tesla显卡列表,Tesla显卡发布日期
- 给 App 提速:Android 性能优化总结
- 宝塔实测-搭建LightPicture开源图床系统
- Android 每日答题