在 Elastic 中国开发者大会 2016 上,ELK 正式宣布更名为“Elastic Stack”,Elastic 公司称其开源项目累计已经有 8000 万次下载。 Elastic Stack 最新版本为 5.0 ,从此,Elastic 公司会对 Elasticsearch、Kibana、Logstash、Beats、X-Pack 进行统一规划以同版本号码发布。会上,Kibana 的原作者 Rashid Khan 进行了题为《Kibana 5.0: The Window into the Elastic Stack》。
早在 2001 年,Rashid 就接触了运维工作,他的第一份工作是在摩根大通集团做网络运维管理分析员。2012 年,Rashid 在美国一家媒体公司担任架构工程师,并且研发了 Kibana 的初始版本,那时他的目的是专门设计界面以适配 Logstash,如今 Kibana 已经逐渐演变成了 Elasticsearch 的分析平台。运维出身的他是在怎样的情况下开始了 Kibana 开发,Kibana 走到今天经历了什么,将来 Kibana 的发展会是怎样的?InfoQ 对 Rashid 进行了采访,以下文章来自于采访稿件的整理。
作为运维人员,我亟须优化日志搜索
开始的时候做运维工作遇到很多问题,on call 待命,甚至在凌晨 2 点被叫醒;这种工作状态让我感到很厌烦。往往,在日志中可以发现问题所在,但是需要花费好久时间才能找到。
于是,我寻找有哪些开源软件可以做基本的日志搜索,然后发现了 Logstash 和与之配合使用的 Elasticsearch。经过测试,我发现 Elasticsearch 速度很快并且提供我所需要的功能;然后我就开始编写一套非常简单的 interface 作为补充展示,大概花费了我几天的时间。这就是第一版 Kibana 的诞生过程,当时是采用 PHP 编写的,功能是可以展示日志并配有搜索入口,目的是把这个工具可以交付给我的 boss,使得他无需我的参与便可以使用这个 interface。需要提一句的是,Elasticsearch 对于 Web 编程很友好,并且日志数据按照日期排列。
在全职投入 Kibana 为 Elastic 公司工作之前,我一直从事运维工作并且我非常喜欢运维工作。因为这段实践经验帮助我体会到了运维人的问题和困难,这让我知道了需要创造一个什么样的工具。我依然认为运维是一个非常有挑战的工作,让所有的东西都正常地运转起来。
编程吧,动手创造自己的工具
的确,我是运维人员,但是我还自己动手开发工具。这在美国越来越普遍了,因为大家意识到,如果你可以编写代码,你的工作会轻松很多,代码可以代替你进行重复工作。通过代码实现自动化是正确的途径,没有人愿意不停地做同样的事情。
编写 Kibana 是因为我当时没有发现一个适合我的工具,于是我决定自己动手。第一版 Kibana 是用 PHP 写的,第二版是用 Ruby,第三版之后是用 JavaScript。我不害怕学习心得语言,因为学语言并不难,Ruby 或者 JavaScript 的语言掌握仅仅是简单的熟悉语法,并没有接触到实际项目中复杂的事情。而重写 Kibana 的工作也并不复杂,因为其实 Elasticsearch 做的工作最重。
“哪种编程语言最好?”说实话,其实这个问题的讨论对我而言并不重要。重要的是,为你的工作选择恰当的语言。PHP 在我心中仍然有一席之地,我认为它依然是一个好的语言,可能很多人有异议,但是我认为它简单易上手、稳定变化慢,相关工具也很容易上手。Node.js 相对来说,比较复杂;Node 社区也意识到这个问题,并且正在改进。比如说,当时我选择了 Ruby 重写 Kibana,是因为 Logstash 是用 JRuby 写的,Elasticsearch 使用 Java 写的(JRuby 可以理解为 Ruby 可以跑在 JVM 里面)。当时想把 Kibana 的 Ruby 那个版本是因为想放到 Logstash 中,但是没有成功。所以,接下来我们研发了 Kibana 3 。
在开发 Kibana 之前,我用过 Graphite,但是为什么依然不满足呢?首先,Graphite 很棒,所有关于数字、指标、时间序列的事情。但是那个时候,我需要的是一个可以做日志搜索的东西,需要有一个 Dashboard 可以给出一个图片。我非常希望从日志中获得信息并且把它们和预定的指标绑定在一起,实际上这些幕后工作都是 Elasticsearch 做的,并且速度真的快很多。此外需要考虑到扩展性,Graphite 对于它适合的大小还算可以,即使超过了极限,更多的数据对应着更多的 CPU 消耗;但是想扩展很多的话,就很困难了,这一点上 Graphite 还有很多可以提升的空间,Elastic Stack 就可以很轻松地实现。
不过,我依然很喜欢 Graphite,我也依然认为这是一个有需求的工具,并且它其实是可以和 Elasticsearch、Kibana 结合在一起使用的。Architecture dependent 的问题困扰了很多人, 比如 32bit 和 64bit 两者之间,即便是传输一个文件也不能工作,这是一个非常可怕的事情。Graphite 解决了这个问题,并且界面很美,功能强大 。Kibana 也解决了很多相似的问题, 尤其是加上了 Elasticsearch 的配合,解决了许多我在做运维工作时总是非常想做的工作。
从来没有犹豫过是否开源
12 岁的时候就开始接触开源项目了,所以在写 Kibana 的时候从来没有犹豫过要不要把它开源。
开始的时候我们只是把需求写在纸上,然后一条条做。放到 Github 之后,看到下载量不断上升我们感到很吃惊。我们没有想到,原来这么多人都面临这同样的问题,没有想到大家对这样的一个开源项目如此需要。开源的目的就是为了能帮助人们,最初我也曾疑惑有可能根本没有人用;然后发现越来越多的人在讨论、使用它。现在 Elastic Stack 是一个开源整体,把个人的事业 career 放在服务其他人的开源项目上,并能收获到好的反馈,这让我们感到很开心、很欣慰。
当时的小愿望,现在的大公司
Kibana 第一版存在仅仅几周。是因为我开始使用 Ruby 进行重写,这大概花费了两周的时间。因为 Logstash 使用 Ruby 写的(即便当时我并不会 Ruby),而我的目的就是让 Kibana 适配 Logstash 和 Elasticsearch,让三者在一起可以协作获得更多的信息。当时我的想法就是让三个工具可以无缝衔接起来好似一个工具一样,有趣的是,这仅仅是当时我自己的一个愿望,后来 Elasticsearch 的人联系我问要不要合并在成为同一家公司,我们才发现彼此的看法竟然不谋而合。
我现在依然是 on call 的。在 Elastic 公司,我们有 on call 轮班制。其实这是与用户交流的机会,这是我们 Elastic 每一个开发者都非常珍视的机会。在对用户支持的过程中,我们可以更清晰地了解用户的需求和真实使用情况;还有一些其他方式,比如会议、沙龙、见面会等,任何可以帮助我们与社区连接的。在我看来,在用户发生问题时,你在他身边并且帮助修复问题:没有比这个更好的工作方式。所以,on call 不是折磨,是机会。
Kibana 的下一步:数据挖掘、角色报表
1、数据挖掘,精益求精
最开始在做日志分析的那个时候,坦率地讲,我并没有关联到了 Data mining。因为那时只是想先把问题弄清楚。但是在把所有的问题都解决完(这些并不难,只是花时间而已),实现了最初我们想要的 Kibana 之后,运维的工作量就大大减少了。
一切都运转得很顺利之后,我们开始思考怎样能把事情做得越来越好,尽量少地产生问题。我们可以获得数据,并且发现了一些问题发生的规律:问题的发生节点,比如说往往半夜三点、发布新版本之后;问题的发生频率,哪些问题非常热门,我们需要把对应的工作放在 CDN 上;问题的优化处理,发生问题之后如何最快地回滚。机器学习很强有力,而且对于运维人员而言,越少的红色提示越幸福。但是目前我的考虑是,能做到提前预警就已经很棒了。
基于这些思考,我们认为需要开始进行数据挖掘的工作了,这样才把事情做得越来越好,才能更大程度地帮助公司用户。在五六年前,很少会有人想到运维团队可以给出商业业务的指导意见,但是现在这开始越来越普遍。
2、接下来,Dashboard 不会只有 public 一种
此前 Kibana 的 Dashboard 是完全公开的,没有角色区分。我知道一些其他的工具提供了包边权限区分的功能。最初的时候,只是想保持事情的简单化,Kibana 并没有考虑到把 Dashboard 做成基于角色的,我们考虑更多的是产品易用性、功能,而没有打算触及安全模块。对于我们自己而言,这并不是过去那些年优先级第一的事项。最开始 Kibana 的主要矛盾是怎样把内容展现出来,打造 Elasticsearch 的良好用户界面,所以那个时候是界面是对所有用户可见的。而权限的控制我们是在 Elasticsearch 上面实现的,搜索、索引、集群操作添加是在 Elasticsearch,也就是说我们首先 Elasticsearch 中实现数据层的安全。
接下来,我们考虑怎样把安全性延展到 Kibana 中,对不同角色进行区分化的搜索展示。(此前,有一个插件可以满足在 Kibana 中进行 Elasticsearch 用户的控制。代码是开源的,任何公司都可以编写自己的安全模块,并且我们也乐意帮助他们)在决定做一件事情之后我们就希望把一件事情做得非常好,而不是半途而废。
Kibana in Elastic Stack 5.0
研发情况
研发出新功能的第一版本通常很快,但是需要不断的测试确保所有运转正常。Elastic Stack5.0 的所有功能大概花费了 9 个月的研发时间。在决策哪些功能需要研发时,我们有几周的考虑时间,还会参考社区中的反馈。然后我们还会给开发者一些自主空间,我们试着避免总是给某些人下发某些任务。我们认为最好主意并不来自与管理层或者经理,而是来自于那些与用户交流频繁的软件工程师,花费很多时间做客户支持的同事。会面通常是远程的,因为我们是个分布式的公司,公司成员分布于 30 多个国家,一共 470 多人。Kibana 部分的研发、测试和运营人员一共有 20 多人。
如果有两个程序员所做的事情是一样的话,没有关系这不是重复劳动,反而可以让产品更加优化,两个人可以互相讨论加速功能研发;否则的话产品会被程序员打上过强的个人烙印,最终让产品交付给客户的是整个团队。
会一直并且只是配合 Elastics****earch
是的,我们没有其他 datasource 的计划,因为我们大部分的使用 case 是要有时间序列的。
最开始融合在一起的是 Elasticsearch 和 Logstash,然后 Kibana 参与进来。在这个融合的过程中,遇到任何冲突或者改变,我们的评判标准都是怎样对用户而言更友好。举例说明,安全问题最佳的解决是在数据层,搜索非常占用内存,使用 ES 可以做很复杂的事情,在旧版本的 Kibana 中,可以使用 Elasticsearch 的 API,但是这拖缓了速度,并且用户可能会做一些危险的事情。在 Kibana 和 Elasticsearch 融合之后,我再也没有那样做了,对于一些重的内存需求工作不会在 UI 层(Kibana)而是会放到数据层(ES),用最少的内存,让尽可能多的计算脱离 JVM heap ,放入 socket breaker,让我们管理更简洁干净并做到在 UI 可追踪。
Kibana 的美学
Kibana 最初的设计师只是我一个人,现在当然我们有了自己的很优秀的设计师,这是很被看重的部分,没有外包出去。因为我们需要和设计团队频繁地交流,不断地给予反馈,和工程团队。这是我们公司文化的一个重要部分。
你想一想这是运维人员需要终日面对的工具,没有人愿意一直看着丑的东西;此外,也希望 Kibana 可以让运维人员的 boss 们感到惊艳,我们希望可以帮助使用者产生非常美的工作。
写在最后
在采访结束时,InfoQ 问 Rashid 是否可以给广大读者一些建议,Rashid 想了想说:
如果你有一个想法,把它 code 出来,build 起来。不要等其他人的开源代码,有可能你会等到,但是有可能你永远等不到。在你写出来之后,你没准会收获惊喜。
评论 1 条评论