10 月 17 号举办了第四届 ESCC(ElasticSearch China Conference) 北京站。作为个人习惯,稍作记录。

今年场地换到了中科院软件所。之前曾经参加过一次 openstack 的活动,也是在这个场地,不过这次居然还提供了午餐,软件所对开源社区的支持真的是蛮积极的。会前在 QQ 群里就看到,甚至有从成都上海赶过来的同好(他们开始不知道自己城市稍后也会有)。

清早起来,和去年 ESCC 一样又是一个雾霾天……和去年相比,今年的签到处显得正式多了:有签名墙,有易拉宝和传单,还有各色小贴纸派送~尤其是 Found.io 的,原先只见过小狗造型,这次见到三四种,漂亮死了~按 medcl 所说,这批小礼品是 elastic.co 公司花了上千元快递费从国外特意送过来的!

同样特意送来的还有 ES 作者 Shay 录制的对 ESCC 的祝福视频。Shay 特意讲到了他在发布 ES 时收到的第一个评论,对方用 ES 来支持对抗流行疾病的斗争,这是一种极大的激励。我想:如果上帝为了遏制人类而发明这么多语言,那么开源运动就是新时代人类的通天塔吧!

会议另一个巧合是,两位讲师,凌霄和刘波涛,穿了同款 T shirt,都是一只麋鹿头像的文化衫。虽然麋鹿图标在 ELK 正式产品上没出现多久,但是 ELK 麋鹿形象看来还是深入人心了~

和去年 ESCC 相比,今年的分享主题有很大不同。去年除了我讲 Kibana,其他讲师都是在分享 search 和 score 相关的话题。今年除了 medcl,都在分享 ELK。所以会后有参会人员评论说:去年想听优化听不到,今年全在讲优化然而用不着了…… anyway,从各司经验来看,采用 Kafka 作为 broker 角色,采用 Java 自开发程序作为 Kafka 和 Elasticsearch 之间的 indexer 角色,几乎成为通用的海量场景优化方式。可惜的时候,没有人具体给解释为什么我们要放弃 Logstash 转而自研?为什么用的是 Java?其实这是一个蛮有趣的话题,在我演讲结束的提问环节,有朋友提问在 flume/fluentd/logstash/rsyslog 之间怎么做最优选择,可惜时间不够,我除了表明我使用 rsyslog 也有条件所限的原因外,没能铺开来讲。在博客上可以多说几句了:

  • Logstash 采用 JRuby 语言,其中处理时间,连接 kafka 和 Elasticsearch 的三个环节,都是通过 require "java"; java_import *** 的方式加载的。这个过程中,Ruby 到 Java 的类型转换等等,都是会影响到性能的。去年我曾经测试过用 JRuby 来加载 netty 库实现一个极简的 TCPServer,每秒只能到 5w 的处理能力,这基本上跟直接用 Ruby 默认 socket 库的效果是一致的。
  • logstash-input-kafka 插件默认采用 json codec,会在单线程中调用 jrjackson 库(注意这里同样有 JRuby 的损耗)做序列化。在 slideshare 上,linkedin 的分享说明他们宁愿采用 logstash-input-pipe 调用 kafka-consumer-console.sh 脚本;在 discuss 中,也有人推荐修改 codec 为 line,然后多线程运行 logstash-filter-json 来解析数据。根据 QQ 群里金桥童鞋的测试,能提高一倍的性能。

所以说,Logstash 选用 JRuby,是为了在不失灵活性的前提下,尽可能方便的接入各种现存系统。而不是纯粹为了提高性能(那会儿 jordansissel 还没见过 kafka 呢,他只考虑过 joda 库比 Ruby 的 time 库快的问题)。

回到演讲。百度高攀的分享中,给我们展示了一个很有趣的做法:当你机器内存又大,磁盘又多,还有 SSD 空闲的时候,怎么有效利用起来?这个话题,在前两个月,携程的朋友也有类似的分享,我有邀稿分享在我的书中,区别在于:携程的 SSD 节点和 SAS 节点是不同机器,索引由热变凉时,需要走网络迁移;百度的 SSD 节点和 SAS 节点是在同一台机器上。分层存储,其实是前几年很热的一个话题,flashcache 一度是很多数据库优化的必备步骤。有环境条件的童鞋其实也可以一试。

高攀提到另一个改进,有关 recovery 期间增量 translog 的处理,没太听清他的改进方案。以我目前的理解力,感觉官方方案应该不会有特明显的卡顿影响,或许是规模还没到的原因。

Admaster 宋兵强的分享,是我个人感觉这次 ESCC 最有意思的一段,可以看出他是长期做大数据处理的,从他的历史经验,推导出来一些他对 ES 未来发展面临的问题和方向的猜测,非常有意思!而在提问环节,一位百度的工程师站起来第一句话是:宋师兄好,我看过你在百度时的代码。非常触动我,互联网是个跳槽非常频繁的行业,铁打的营盘流水的兵,能以这种代码识人,真是幸甚至哉!

这个环节中,最让大家 happy 的是 medcl 补充了一个消息:marvel 在不远的未来就会完全免费使用啦!

中午,吴怡编辑驱车数十公里赶来给我把几本样书送到了。为了赶在聚会之前上架,我催她好些回,再次感谢她的理解和支持!

下午芒果TV 刘波涛的分享,比较好玩的地方在于他们对多机房之间数据传输的考量。不确定是不是受我影响,也采用了较多的 rsyslog。加上近来在 rsyslog 社区里,绝大多数提问也都跟 Elasticsearch 相关,我都考虑是不是接下来再写一本《Rsyslog 指南》的 gitbook 了。

我自己演讲完后,实在坚持不住,趴着小睡了会儿,medcl 对不住,不是你讲的不好,是我自己有午睡习惯……

biglog 张磊的分享带上了 demo 录像展示,很棒!对于很多只听说过 ELK 不知道有啥用的人来说,一图胜千言,一视频胜千图!然后其中对 suricata、ntop 的介绍也非常不错。分享中另一个重点在跨数据中心的集群方式。我开始猜测他指的会是采用 tribe 节点来串联不同集群给 Kibana 做查询。结果不是!而是利用 allocate routing 的 zone 设置,把对应机房的索引分片分配在自己机房的节点上,以保证不跨网传输。同时又采用 elasticsearch-zookeeper 来避免 elasticsearch 自身的跨机房 discovery 流量,维护集群稳定。确实是一个我完全没想到的玩法~~

附注:ntop-ng 有一个自己的 Kibana3 fork,叫 Qbana,我在书中有提过。ntop 的 PF_RING 抓包方式,在 elastic 的 packetbeat 中也有采用。未来 ELK 肯定会有对这个方向更好的支持。

最后闪电演讲。我从 2011 年第一次在 Perlconf 接触这个形式后就喜欢上了,所以提前跟团队的伙伴提及,可以选个有趣的小话题聊一下。效果来看,感觉炳哲做的不错,赞!

最后大轴是一位老先生,之前在张磊的分享中,他就对 PF_RING 方式提出来质疑,然后闪电演讲的时候,亲自上场,介绍了他自己基于 DPDK 的实现方式。这种友好的气氛,真是太让人喜欢了~哈哈


也说一些我个人觉得还不是特到位的地方:

两次抽奖送书环节,都是先宣布休息才抽,场面上已经乱了。其实拍个中奖者合影啊什么的,再宣布休息,可能会更好一些。
闪电演讲环节,静悄悄的在会议安排中添加,静悄悄的在最后就开始了,没有燃烧全场的那种激情。或许应该在早上开始大会之前,统一给大家介绍一下这个环节,然后留一整天时间做现场报名,可能会有更好的效果(yes,我说的就是上面那种友好的质疑)。

不论如何,这是一次成功的,近乎完美的大会。感谢 elastic.co,感谢 medcl,感谢讲师们,感谢志愿者们,感谢全体参会同仁们!