简介

开源中国的简介:

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的坑爹事相关推荐

  1. 一个出身寒门的状元之死全文【原文】

    一个出身寒门的状元之死全文[原文] 来源: 才华有限青年 2019年1月8号,我接到了高中同学周有择胃癌去世的消息. 他去世的时候,身份是国内某企业的一名财务会计师,银行卡里还有3700.6块钱.但是 ...

  2. 部署外网网站(二)——宝塔搭建服务器

    文章目录 前言 正文 1. 脚本安装 2. 记录好账号密码,登录页面 3. 修改用户名和密码方便以后登录 4. 绑定宝塔面板账号 5. 安装首页提供的套装 6. 测试一下 7. 添加一下默认网站默认站 ...

  3. 一个出身寒门的状元之编程

    来源:不才黄某(ID:HelloJasonHuang) 原文地址:这里 2019年1月31号,也就是今天,我接到了高中同学周有码编程失利的消息. 他编程的时候,身份是国内某知名互联网公司的技术专家,银 ...

  4. 【运维囧事】Citrix Xendesktop 与 XML 集成时添加信任关系

    不得不说,Citrix的相关产品的安全做的真TNND的强悍... 装完Xendesktop后,启用Smart Card来做认证.NND,就是过不去.提示说服务器之间不信任... 错误详细信息:The ...

  5. PC2日记——坑爹的第一天2014/08/28

    我不想安慰自己说今天是因为第一次将pc2用于实际的比赛经验不足而导致的今天出现种种问题,我想说的是自从我開始干后台我所做的每一件事都是第一次,所以这绝对不是让自己免去责怪的理由:我想说的是假设我今天是 ...

  6. 妈蛋:kinMaxShow轮播图异常,WebUploader图片上传坑爹,图片被压缩了

    2019独角兽企业重金招聘Python工程师标准>>> 今天晚上在改造轮播图. 原来的代码是这样的: <div> <img src="${static}/ ...

  7. 理解 Lua 的那些坑爹特性

    Lua 那些坑爹的特性 来源 https://blog.lilydjwg.me/2012/12/29/lua-caveats.36879.html 协程只能在 Lua 代码中使用 协程(corouti ...

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

    今天周末在家宅着,并不是我不想运动,是因为北京的雨雪交加导致我想在家写文章,不过想想给大家写文章还是蛮惬意的,望一眼窗外,看一眼雪景,指尖在键盘上跳动,瞬间有种从屌丝程序员转变成了小姑娘们都羡慕的文艺 ...

  9. TCP的那些事(转载)

    (转载本站文章请注明作者和出处 酷 壳 – CoolShell.cn ,请勿用于任何商业用途) TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身 ...

最新文章

  1. vim 编辑器安装 使用
  2. numpy.argwhere 返回的为索引值的array
  3. java panel 显示文字,从动态添加的jPanel获取文本
  4. 空间连接时计算总和_【数据技术】城市功能混合程度计算
  5. openstack实例控制台显示响应时间过长_监控OpenStack的技巧
  6. in-place数据交换
  7. [CATARC_2017] 第八周
  8. 案例一(haproxy+keepalived高可用负载均衡系统)【转】
  9. SQL 面试题及答案(一)
  10. linux fb设备驱动,linux设备驱动归纳总结(八):1.总线、设备和驱动
  11. linux vi代码高亮,linux Vi编辑器代码高亮设置及永久显示行号的方法
  12. 李铁被传下课之际,梅西却要七拿金球奖了?这波预测没毛病
  13. 指环王中那个白色头发、擅长用弓箭的精灵族男子
  14. ffmpeg生成缩略图
  15. 顺序表前m和后n元素交换位置
  16. 在线生成favorite ico的网站
  17. 【持续更新】2007-2022年英伟达历代桌面Tesla显卡列表,Tesla显卡发布日期
  18. 给 App 提速:Android 性能优化总结
  19. 宝塔实测-搭建LightPicture开源图床系统
  20. Android 每日答题

热门文章

  1. 恶意PPT文件夹带漏洞攻击和后门程序
  2. 前端开箱即用的中后台管理模版,建议收藏
  3. 开箱 | 小度智能音箱初体验
  4. Java 从键盘输入数据到一维double数组中
  5. php文字验证码插件,PHP中文汉字验证码
  6. python爬取B站动态的评论总数(不含用户评论内容详情)
  7. 英语教师杂志英语教师杂志社英语教师编辑部2022年第16期目录
  8. Android | WIFI Direct -1 Basic knowledge
  9. 高级防火墙规则-Direct Rules
  10. 设计一款免费游戏的关键设计原则