疲劳是最舒适的枕头,努力工作吧。

Elasticsearch 5.4.1 和 5.3.3 发布

昨日 Elastic 正式发布针对 5.4 Bug 的修复版本 Elasticsearch 5.4.1(基于 Lucene6.5.1 ),以及基于 Lucene6.4.2的 Elasticsearch 5.3.3。 Elasticsearch 5.4.1 是目前最新的稳定版本,在官方的 Elastic Cloud 上已可以直接部署和升级。此次发布包括两个安全补丁-- 所有 X-Pack Security 用户都应该升级。

5.4.x 相关链接:
Elasticsearch 5.4.1 下载地址
Elasticsearch 5.4.1 发行说明
Elasticsearch 5.4 重要改变
X-Pack 5.4.1 发行说明

5.3.x 相关链接:
Elasticsearch 5.3.3 下载地址
Elasticsearch 5.3.3 发行说明
Elasticsearch 5.3.3 重要改变
X-Pack 5.3.3 发行说明

你可以通过阅读上面的详细的发行说明来了解具体的发布内容,下面是一些重点摘要:

X-Pack Document Level Security and Aliases (ESA-2017-09) 

X-Pack 安全组件在版本 5.4.1 和 5.3.3 之前对于索引别名的文档层面的安全设置存在漏洞,这个 bug 允许单个用户在特定的操作下能通过别名查看未经允许的数据。

影响版本
X-Pack Security 从 5.0.0 到 5.4.0 都受影响。

解决方案
所有 X-Pack 安全组件的用户升级到 5.3.3 或者 5.4.1。如果不能升级,通过禁用索引层面的 request cache 可以临时解决这个问题。

CVE ID: CVE-2017-8441

 
X-Pack Privilege Escalation (ESA-2017-06)

修复 run_as 功能存在的一个特权扩大的bug。正常情况下,当使用run_as执行某些操作会以特定的身份来执行,这个bug 让用户无法正常转换为 run_as 指定的用户身份,从而导致查询失败和结果异常。

如果你不使用 run_as 功能或 _user 属性,则不受此bug影响。

影响版本
X-Pack Security 从 5.0.0 到 5.4.0 都受影响。

解决方案
建议升级 Elastic Stack 到 5.4.1,如果不能升级,请移除模板里面的 {{_user.username}} 占位符并确保 run_as 设置不会被不可信用户修改。

CVE ID: CVE-2017-8438


其它重要变化:
  1. 修复 bug,单分片进行 scroll 操作可能引起 X-Pack Security 造成节点僵死及 OOM。
  2. Elasticsearch 5.4.0 启用 TLS 不能对 5.3.x 和之前的节点进行认证。
  3. LDAP 认证用户在撤销认证之后后可能任然驻留在缓存。
  4. 现在,Netty在处理线程池、缓冲池和其他资源时,尊重处理器的设置,而不是在其他容器上运行时,可能会对这些资源进行过度的调整。
  5. 对关闭的索引进行 Index setting 修改将进行验证,保护因为错误的配置造成索引无法打开的问题。
  6. 修复 TransportClient 关于嗅探可能造成客户端挂起的异常。
  7. 修复在KERBEROS安全模式,HDFS repository 插件与 Java Security Manager 发生的冲突。
  8. 修复 Snapshot/restore 在 Elasticsearch 5.2.x 及之前的版本在取回所有快照时异常缓慢的问题。


 
最后,请下载和试用最新的 Elasticsearch 5.4.1,欢迎前往GitHub issue反馈任何遇到的问题。
继续阅读 »
昨日 Elastic 正式发布针对 5.4 Bug 的修复版本 Elasticsearch 5.4.1(基于 Lucene6.5.1 ),以及基于 Lucene6.4.2的 Elasticsearch 5.3.3。 Elasticsearch 5.4.1 是目前最新的稳定版本,在官方的 Elastic Cloud 上已可以直接部署和升级。此次发布包括两个安全补丁-- 所有 X-Pack Security 用户都应该升级。

5.4.x 相关链接:
Elasticsearch 5.4.1 下载地址
Elasticsearch 5.4.1 发行说明
Elasticsearch 5.4 重要改变
X-Pack 5.4.1 发行说明

5.3.x 相关链接:
Elasticsearch 5.3.3 下载地址
Elasticsearch 5.3.3 发行说明
Elasticsearch 5.3.3 重要改变
X-Pack 5.3.3 发行说明

你可以通过阅读上面的详细的发行说明来了解具体的发布内容,下面是一些重点摘要:

X-Pack Document Level Security and Aliases (ESA-2017-09) 

X-Pack 安全组件在版本 5.4.1 和 5.3.3 之前对于索引别名的文档层面的安全设置存在漏洞,这个 bug 允许单个用户在特定的操作下能通过别名查看未经允许的数据。

影响版本
X-Pack Security 从 5.0.0 到 5.4.0 都受影响。

解决方案
所有 X-Pack 安全组件的用户升级到 5.3.3 或者 5.4.1。如果不能升级,通过禁用索引层面的 request cache 可以临时解决这个问题。

CVE ID: CVE-2017-8441

 
X-Pack Privilege Escalation (ESA-2017-06)

修复 run_as 功能存在的一个特权扩大的bug。正常情况下,当使用run_as执行某些操作会以特定的身份来执行,这个bug 让用户无法正常转换为 run_as 指定的用户身份,从而导致查询失败和结果异常。

如果你不使用 run_as 功能或 _user 属性,则不受此bug影响。

影响版本
X-Pack Security 从 5.0.0 到 5.4.0 都受影响。

解决方案
建议升级 Elastic Stack 到 5.4.1,如果不能升级,请移除模板里面的 {{_user.username}} 占位符并确保 run_as 设置不会被不可信用户修改。

CVE ID: CVE-2017-8438


其它重要变化:
  1. 修复 bug,单分片进行 scroll 操作可能引起 X-Pack Security 造成节点僵死及 OOM。
  2. Elasticsearch 5.4.0 启用 TLS 不能对 5.3.x 和之前的节点进行认证。
  3. LDAP 认证用户在撤销认证之后后可能任然驻留在缓存。
  4. 现在,Netty在处理线程池、缓冲池和其他资源时,尊重处理器的设置,而不是在其他容器上运行时,可能会对这些资源进行过度的调整。
  5. 对关闭的索引进行 Index setting 修改将进行验证,保护因为错误的配置造成索引无法打开的问题。
  6. 修复 TransportClient 关于嗅探可能造成客户端挂起的异常。
  7. 修复在KERBEROS安全模式,HDFS repository 插件与 Java Security Manager 发生的冲突。
  8. 修复 Snapshot/restore 在 Elasticsearch 5.2.x 及之前的版本在取回所有快照时异常缓慢的问题。


 
最后,请下载和试用最新的 Elasticsearch 5.4.1,欢迎前往GitHub issue反馈任何遇到的问题。 收起阅读 »

《Elasticsearch权威指南》中文版背后的故事

去年我们社区一起翻译了一本书《Elasticsearch权威指南》,并且已经在官方上线了,链接:
https://www.elastic.co/guide/cn/index.html 
 
撒花~ 🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉
 
我想给大家分享一些这本书后面的故事:
 
大家在浏览到前言章节里面有一节“鸣谢”,里面可以看到很多熟悉的名字:
 
薛杰,骆朗,彭秋源,魏喆,饶琛琳, 风虎,路小磊,michealzh,nodexy,sdlyjzh,落英流离, sunyonggang,Singham,烧碱,龙翔,陈思,陈华, 追风侃侃,Geolem,卷发,kfypmqqw,袁伟强,yichao, 小彬,leo,tangmisi,Alex,baifan,Evan,fanyer, wwb,瑞星,刘碧琴,walker,songgl, 吕兵,东,杜宁,秦东亮,biyuhao,刘刚, yumo,王秀文,zcola,gitqh,blackoon,David,韩炳辰, 韩陆,echolihao,Xargin,abel-sun,卞顺强, bsll,冬狼,王琦,Medcl。
 
是的,这些就是我们权威指南的核心的译者了,虽然只是列了一个名字,但是其实背后付出了很多,有一些同学是在此之前就已经做过部分翻译的同学,如:路小磊,有一些是早就出版了多本书的资深作家了,如:饶琛琳,还有很多是社区里面一直就非常活跃的同学,各种线上线下活动都能看到你们的身影,感谢你们。
 
记得去年刚刚开始这个翻译的计划的时候,短短几天时间就收到了很多同学的报名,一下子累积人数多达80人,
正所谓人多就是力量,不过任务的分配和管理也就成了一个问题,要知道权威指南纸质版有650多页,
很厚的一本书,内容也真是非常多。我记得项目应该是3月份启动,到了5月份还没什么大的进展,大家都在摸索怎么去翻译,大家都无从下手,我也着急啊😱😱,这个时候要感谢社区的热心成员:龙翔,🤠,他把他老婆Claire拉到我们翻译计划里面来了,👏,这个翻译的事情总算有了转机,Claire在翻译项目的管理这块很专业👍,提出了很多建设性意见,✍️,我们成立了一个翻译小组委员会,🤔,然后形成了5个翻译小组,🖐,每个小组由一个小组长来负责(大家积极踊跃):
A组:薛杰;
B组:骆朗;
C组:彭秋源;
D组:饶琛琳;
E组:魏喆;
这样,几十个翻译志愿者分别分到了不同的翻译小组,然后以翻译小组为单位进行翻译计划的分配和认领,任务也比较具体,小组成员再内部进行协调,有问题大家一起讨论,小组内部内也可以讨论,然后翻译就开始顺利的进行了!😊
 
所以在这里要特别感谢龙翔两口子和几位翻译小组的小组长,当然还有各组的小组成员,如果没有你们,翻译工作估计要到进行到猴年马月啦,🤐,大家官网上面现在也看不到这些中文的资料啦!🎉
 
顺便值得一提的是,同时期还有另外一个开源社区也在翻译权威指南(韩文),并且比我们早开始,然后我们在去年12月份的时候就完成了,赶在Elastic{ON}DevChina大会之前完成的,而现在我们的已经上线了,也不知道他们的完成了没有,😎。
 
权威指南的原作者Clinton和Zachary听说了我们的翻译的事情,都很兴奋,本来打算要来中国参加Elastic{ON}DevChina大会的,不过很遗憾,因为种种原因都没能过来,不过他们很支持我们,帮忙解决了后面上线的很多技术细节。
 
相信很多人想了解具体是怎么做的,我再给大家具体介绍一下,任务的管理和分配,我们使用GoogleDocs来进行协助,大家都有修改权限,常见的术语和FAQ也都会放在里面。
链接:[url=https://docs.google.com/spreadsheets/d/1vzPqcYJfz6ouY053E6WUdvS9WR8XqcHPyB7_U-72b_Q/edit?pref=2&pli=1#gid=1600884528]https://docs.google.com/spread ... 84528[/url]
 
另外关于本书翻译的项目管理,我们直接使用的是GitHub(https://github.com/elasticsear ... guide ),以asciidoc源文件为最小提交单元,每翻译完成一个文件,提交一个PR,每个PR单独Review,每个PR正常需要两个同学Review确认,正常的GitHub操作流程,和提交代码一样(文档其实本来也是和代码一样),翻译完成一篇之后,提交一个PR,打上标签“to be review”,表示翻译完了可以被Review了,Reviewer如果认可了就留言"LGTM", 然后打上标签“To be merged”,如果有不同意见,可以在PR上面留言讨论,PR提交人可以结合意见探讨或者修改,有些PR可以要讨论和修改很多次,比如这个:[url=https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/pull/4]https://github.com/elasticsear ... ull/4[/url],真的是不厌其烦,截止目前为止,总共提交了470多个翻译相关的PR。
 
为什么要以Asciidoc源文件作为翻译的基础,而不是gitdoc、wiki、markdown等等呢,因为我们可以保证后续的样式和官网一致,翻译审核完成之后就能够直接的放到官网上面,以提供给更多的人去访问和学习,同时官方的docs工具链也很完善,也支持编译输出成各种格式,如PDF等。另外文档和英文格式保持一致且也是托管在GitHub上面,方便后续的更新和维护,现在权威指南英文版正在更新到最新,到时候我们可以很方便的检测变化然后同步更新,文档即源码,文档是开源重要的一部分,参与开源的方式其实也有很多种,贡献代码和贡献文档都是同等重要的啦。可持续性更新也很重要。
 
是不是权威指南翻译完了之后就结束了呢,答案是:NO!
文档和代码一样,也有Bug,也要不断完善,虽然我们在提交翻译和Review的过程中有反复进行过修改和进行过多轮的Review,(先是小组内部进行第一轮Review,打上标签“To be final review”,然后再由另外一个组的同学进行Review,然后在打上“To be merge”),但是由于大家水平有限,难免会出现各种翻译不准确、格式、表达等问题,所有希望大家能够继续帮忙改进,可以继续提交PR来完善修改,如果说嫌麻烦,可以发Issue说明哪里有问题或者觉得可以再讨论的地方,提供建设性意见。
 
后续也会有新的翻译,也希望大家踊跃参加,为Elastic中文的社区贡献力量。
 
一直想写这篇文章,今天终于完成啦!
最后来一张上次来参加Elastic{ON}DevChina的译者合影!

IMG_5300.jpg

 
继续阅读 »
去年我们社区一起翻译了一本书《Elasticsearch权威指南》,并且已经在官方上线了,链接:
https://www.elastic.co/guide/cn/index.html 
 
撒花~ 🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉
 
我想给大家分享一些这本书后面的故事:
 
大家在浏览到前言章节里面有一节“鸣谢”,里面可以看到很多熟悉的名字:
 
薛杰,骆朗,彭秋源,魏喆,饶琛琳, 风虎,路小磊,michealzh,nodexy,sdlyjzh,落英流离, sunyonggang,Singham,烧碱,龙翔,陈思,陈华, 追风侃侃,Geolem,卷发,kfypmqqw,袁伟强,yichao, 小彬,leo,tangmisi,Alex,baifan,Evan,fanyer, wwb,瑞星,刘碧琴,walker,songgl, 吕兵,东,杜宁,秦东亮,biyuhao,刘刚, yumo,王秀文,zcola,gitqh,blackoon,David,韩炳辰, 韩陆,echolihao,Xargin,abel-sun,卞顺强, bsll,冬狼,王琦,Medcl。
 
是的,这些就是我们权威指南的核心的译者了,虽然只是列了一个名字,但是其实背后付出了很多,有一些同学是在此之前就已经做过部分翻译的同学,如:路小磊,有一些是早就出版了多本书的资深作家了,如:饶琛琳,还有很多是社区里面一直就非常活跃的同学,各种线上线下活动都能看到你们的身影,感谢你们。
 
记得去年刚刚开始这个翻译的计划的时候,短短几天时间就收到了很多同学的报名,一下子累积人数多达80人,
正所谓人多就是力量,不过任务的分配和管理也就成了一个问题,要知道权威指南纸质版有650多页,
很厚的一本书,内容也真是非常多。我记得项目应该是3月份启动,到了5月份还没什么大的进展,大家都在摸索怎么去翻译,大家都无从下手,我也着急啊😱😱,这个时候要感谢社区的热心成员:龙翔,🤠,他把他老婆Claire拉到我们翻译计划里面来了,👏,这个翻译的事情总算有了转机,Claire在翻译项目的管理这块很专业👍,提出了很多建设性意见,✍️,我们成立了一个翻译小组委员会,🤔,然后形成了5个翻译小组,🖐,每个小组由一个小组长来负责(大家积极踊跃):
A组:薛杰;
B组:骆朗;
C组:彭秋源;
D组:饶琛琳;
E组:魏喆;
这样,几十个翻译志愿者分别分到了不同的翻译小组,然后以翻译小组为单位进行翻译计划的分配和认领,任务也比较具体,小组成员再内部进行协调,有问题大家一起讨论,小组内部内也可以讨论,然后翻译就开始顺利的进行了!😊
 
所以在这里要特别感谢龙翔两口子和几位翻译小组的小组长,当然还有各组的小组成员,如果没有你们,翻译工作估计要到进行到猴年马月啦,🤐,大家官网上面现在也看不到这些中文的资料啦!🎉
 
顺便值得一提的是,同时期还有另外一个开源社区也在翻译权威指南(韩文),并且比我们早开始,然后我们在去年12月份的时候就完成了,赶在Elastic{ON}DevChina大会之前完成的,而现在我们的已经上线了,也不知道他们的完成了没有,😎。
 
权威指南的原作者Clinton和Zachary听说了我们的翻译的事情,都很兴奋,本来打算要来中国参加Elastic{ON}DevChina大会的,不过很遗憾,因为种种原因都没能过来,不过他们很支持我们,帮忙解决了后面上线的很多技术细节。
 
相信很多人想了解具体是怎么做的,我再给大家具体介绍一下,任务的管理和分配,我们使用GoogleDocs来进行协助,大家都有修改权限,常见的术语和FAQ也都会放在里面。
链接:[url=https://docs.google.com/spreadsheets/d/1vzPqcYJfz6ouY053E6WUdvS9WR8XqcHPyB7_U-72b_Q/edit?pref=2&pli=1#gid=1600884528]https://docs.google.com/spread ... 84528[/url]
 
另外关于本书翻译的项目管理,我们直接使用的是GitHub(https://github.com/elasticsear ... guide ),以asciidoc源文件为最小提交单元,每翻译完成一个文件,提交一个PR,每个PR单独Review,每个PR正常需要两个同学Review确认,正常的GitHub操作流程,和提交代码一样(文档其实本来也是和代码一样),翻译完成一篇之后,提交一个PR,打上标签“to be review”,表示翻译完了可以被Review了,Reviewer如果认可了就留言"LGTM", 然后打上标签“To be merged”,如果有不同意见,可以在PR上面留言讨论,PR提交人可以结合意见探讨或者修改,有些PR可以要讨论和修改很多次,比如这个:[url=https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/pull/4]https://github.com/elasticsear ... ull/4[/url],真的是不厌其烦,截止目前为止,总共提交了470多个翻译相关的PR。
 
为什么要以Asciidoc源文件作为翻译的基础,而不是gitdoc、wiki、markdown等等呢,因为我们可以保证后续的样式和官网一致,翻译审核完成之后就能够直接的放到官网上面,以提供给更多的人去访问和学习,同时官方的docs工具链也很完善,也支持编译输出成各种格式,如PDF等。另外文档和英文格式保持一致且也是托管在GitHub上面,方便后续的更新和维护,现在权威指南英文版正在更新到最新,到时候我们可以很方便的检测变化然后同步更新,文档即源码,文档是开源重要的一部分,参与开源的方式其实也有很多种,贡献代码和贡献文档都是同等重要的啦。可持续性更新也很重要。
 
是不是权威指南翻译完了之后就结束了呢,答案是:NO!
文档和代码一样,也有Bug,也要不断完善,虽然我们在提交翻译和Review的过程中有反复进行过修改和进行过多轮的Review,(先是小组内部进行第一轮Review,打上标签“To be final review”,然后再由另外一个组的同学进行Review,然后在打上“To be merge”),但是由于大家水平有限,难免会出现各种翻译不准确、格式、表达等问题,所有希望大家能够继续帮忙改进,可以继续提交PR来完善修改,如果说嫌麻烦,可以发Issue说明哪里有问题或者觉得可以再讨论的地方,提供建设性意见。
 
后续也会有新的翻译,也希望大家踊跃参加,为Elastic中文的社区贡献力量。
 
一直想写这篇文章,今天终于完成啦!
最后来一张上次来参加Elastic{ON}DevChina的译者合影!

IMG_5300.jpg

 
收起阅读 »

写了个深入详解Elasticsearch专栏,欢迎大家品鉴!

 
1、深入详解Elasticearch:http://blog.csdn.net/column/de ... .html
 
2、这个专栏,起初主要用来研究关系型数据mysql/oracle非关系型数据库mongo与Elaticsearch的实时同步问题,随着延伸和项目需要,还会路线拓展ES java开发等问题;
 
3、之前的研究都是基于Elasticsearch2.3.4版本。基础原理想通。 5.X,6.X版本后续也会跟进。
 
欢迎大家品鉴,多提不足!
 
终生学习者:铭毅天下,博客地址:http://blog.csdn.net/laoyang360
继续阅读 »
 
1、深入详解Elasticearch:http://blog.csdn.net/column/de ... .html
 
2、这个专栏,起初主要用来研究关系型数据mysql/oracle非关系型数据库mongo与Elaticsearch的实时同步问题,随着延伸和项目需要,还会路线拓展ES java开发等问题;
 
3、之前的研究都是基于Elasticsearch2.3.4版本。基础原理想通。 5.X,6.X版本后续也会跟进。
 
欢迎大家品鉴,多提不足!
 
终生学习者:铭毅天下,博客地址:http://blog.csdn.net/laoyang360 收起阅读 »

java招聘

职位描述:
岗位描述:
1、负责商城网站的设计、开发工作,制定和落实解决方案。
2、 保证平台的稳定性,并不断提升平台性能,协助解决系统中的问题和技术难题。

任职资格:
1、对高并发、多线程、缓存等技术和业务场景有实际操作经验;
2、JAVA基础扎实,对于中间件、SOA框架等原理有一定理解;
3、熟悉Linux下的常用操作,熟悉MySQL、Redis、MongoDB、elasticsearch、等开源数据库;
4、熟悉互联网产品架构,有大型分布式、高并发、高负载、高可用性系统设计开发经验者优先。
5、强烈的责任心与主动性,对所负责工作有owner意识,并能自我驱动成长;

在这里:
有最前沿技术的最佳实践场景:golang,nginx+lua,java,redis,docker,hadoop,storm,机器学习、elasticsearch。
有高并发,分布式,大数据挖掘的业务场景。
我们将为你提供跟身边大牛接触学习的机会。
我们将为你提供一个开放的技术环境,一个自由高效的团队,和一个改变现有技术的机会。
分享、自由、协作是我们的处事法则。

福利:
弹性工作时间,巨大的发展空间。
年假,双休,法定节假日。
六险一金,补充商业保险,丰厚的餐补,全面保障。
绝对竞争力的薪资及年终奖金,股票激励机制。
伴随公司发展的升职机会,及每年两次的调薪机会。
继续阅读 »
职位描述:
岗位描述:
1、负责商城网站的设计、开发工作,制定和落实解决方案。
2、 保证平台的稳定性,并不断提升平台性能,协助解决系统中的问题和技术难题。

任职资格:
1、对高并发、多线程、缓存等技术和业务场景有实际操作经验;
2、JAVA基础扎实,对于中间件、SOA框架等原理有一定理解;
3、熟悉Linux下的常用操作,熟悉MySQL、Redis、MongoDB、elasticsearch、等开源数据库;
4、熟悉互联网产品架构,有大型分布式、高并发、高负载、高可用性系统设计开发经验者优先。
5、强烈的责任心与主动性,对所负责工作有owner意识,并能自我驱动成长;

在这里:
有最前沿技术的最佳实践场景:golang,nginx+lua,java,redis,docker,hadoop,storm,机器学习、elasticsearch。
有高并发,分布式,大数据挖掘的业务场景。
我们将为你提供跟身边大牛接触学习的机会。
我们将为你提供一个开放的技术环境,一个自由高效的团队,和一个改变现有技术的机会。
分享、自由、协作是我们的处事法则。

福利:
弹性工作时间,巨大的发展空间。
年假,双休,法定节假日。
六险一金,补充商业保险,丰厚的餐补,全面保障。
绝对竞争力的薪资及年终奖金,股票激励机制。
伴随公司发展的升职机会,及每年两次的调薪机会。 收起阅读 »

Grok Debugger 国内镜像

Grok 是一个常用的对日志进行结构化的一个工具,
可以通过在线工具进行调试:
http://grokdebug.herokuapp.com
http://grokconstructor.appspot.com
 
不过有时候比较慢,甚至不能访问,所以现在为大家搭好了一个国内的镜像,方便使用:
http://grok.elasticsearch.cn/
 
目前还是英文,源码fork至:https://github.com/elasticsear ... uctor
欢迎提交PR来进行翻译。

Snip20170526_6.png

 
PS: 
1. Kibana后续将提供Grok Debug的功能;
2.如果你的日志每一行都遵循固定格式,你可以考虑使用 dissect filter,性能更强更简单。
继续阅读 »
Grok 是一个常用的对日志进行结构化的一个工具,
可以通过在线工具进行调试:
http://grokdebug.herokuapp.com
http://grokconstructor.appspot.com
 
不过有时候比较慢,甚至不能访问,所以现在为大家搭好了一个国内的镜像,方便使用:
http://grok.elasticsearch.cn/
 
目前还是英文,源码fork至:https://github.com/elasticsear ... uctor
欢迎提交PR来进行翻译。

Snip20170526_6.png

 
PS: 
1. Kibana后续将提供Grok Debug的功能;
2.如果你的日志每一行都遵循固定格式,你可以考虑使用 dissect filter,性能更强更简单。 收起阅读 »

GZIP造成JAVA Native Memory泄漏案例

[携程旅行网  吴晓刚]

近期公司某个线上JAVA应用出现内存泄漏问题,整个排查过程颇费周折,前后耗费了近2周才定位到问题根源并予以修复。排查问题过程中在网上翻查了大量的资料,发现国内几乎没有文章能对同类问题做透彻的分析和找到问题真正根源的。即使国外的各类博客和文章,也少有正确的分析。因此感觉有必要对问题根源和相关案例做一个总结,希望能为国内开发者避免踩上同类陷阱提供一些帮助。

开门见山,先列一下收集到的同类问题案例集:


这些案例涉及到的不乏一些流行的开源软件如Lucene, Elasticsearch, Kafka,并且某些Bug版本在大量公司有线上部署。这些案例的问题根源都惊人的一致,即在JAVA里使用GZIP库进行数据流的压缩/解压之后,忘记调用流的close()方法,从而造成native memory的泄漏。

关于这类问题的分析方法和工具,上面收集的案例集里有非常详尽的描述,这里就不再班门弄斧一一赘述了。只结合我们自己的案例,做一个比较简短的介绍和总结。

我们公司这个案例的排查之所以花了近2个礼拜,其中一个重要原因是这个应用是通过Docker部署的。应用上线运行一段时间后,会被Docker的OOM killer给Kill掉,查看JVM监控数据却发现Heap使用得很少,甚至都没有old GC发生过,top里看这个JAVA进程的RSS内存占用远高于分配的Heap大小。很自然的,研发人员第一反应是底层系统的问题,注意力被转移到研究各种Docker内存相关的参数上。 而我知道ElasticCloud曾经也被某些版本的linux内核bug困扰,docker可能会误杀JVM (参见 Memory Issues We'll Remember),bug的内核版本和docker版本和我们线上部署的又很接近,因此这个内核bug也被加入到了怀疑列表中。 事后证明这个方向是错误的,浪费了一些时间。

在一段时间排查无果后,为了缩小排查范围,我们决定将这个应用部署到VM上做对比测试。结果内存泄漏问题依然存在,因而排除掉了Linux内核和docker本身的问题。

同期也参考过一篇关于DirectByteByffer造成堆外内存泄漏问题的分析博客,JVM源码分析之堆外内存完全解读 ,考虑到问题现象和我们类似,我们的应用也有用到netty,DBB泄漏也被列为怀疑对象。然而在JVM启动里参数里对MaxDirectMemorySize做了限制后,经过一段时间对外服务,JAVA进程的RSS仍然会远超过HEAP + MDM设置的大小。

这期间我们也使用过NMT 工具分析HEAP内存占用情况,然而这个工具报告出来的内存远小于RSS,也就是说这多出来的内存并没有被JVM本身用到,泄漏的是native memory。 JAVA应用产生native memory泄漏通常是在使用某些native库时造成的,因此注意力转移到JNI。

最终帮助我们找到正确方向的是开头列的 Debugging Java Native Memory Leaks 这篇由Twitter工程师写的博客。 博客里介绍了如何使用jemalloc来替换glibc的malloc,通过拦截和追踪JVM对native memory的分配申请,从而可以分析出HEAP以外的内存分配由哪些方法调用产生的。博客里提到产生泄漏的原因是忘记关闭GZIPOutputStream,巧合的是我们线上应用也使用了gzip压缩服务请求数据,于是查看了一下相关的代码,果然发现有忘记关闭的stream。 找到根源后,解决问题就简单了,一行代码修复。
 
对于ElasticSearch用户,要注意的是某些版本存在这个泄漏问题,对于小内存机器上运行的ES服务可能会有较大的影响。 可是官方没有明确列出所有受影响的版本,只在博客里提到5.2.1修复了这些问题。 因此如果你有顾虑的话,可以用top命令看一下ES JAVA进程的RSS消耗,如果大大于分配的HEAP,有可能就是中招啦。 
继续阅读 »
[携程旅行网  吴晓刚]

近期公司某个线上JAVA应用出现内存泄漏问题,整个排查过程颇费周折,前后耗费了近2周才定位到问题根源并予以修复。排查问题过程中在网上翻查了大量的资料,发现国内几乎没有文章能对同类问题做透彻的分析和找到问题真正根源的。即使国外的各类博客和文章,也少有正确的分析。因此感觉有必要对问题根源和相关案例做一个总结,希望能为国内开发者避免踩上同类陷阱提供一些帮助。

开门见山,先列一下收集到的同类问题案例集:


这些案例涉及到的不乏一些流行的开源软件如Lucene, Elasticsearch, Kafka,并且某些Bug版本在大量公司有线上部署。这些案例的问题根源都惊人的一致,即在JAVA里使用GZIP库进行数据流的压缩/解压之后,忘记调用流的close()方法,从而造成native memory的泄漏。

关于这类问题的分析方法和工具,上面收集的案例集里有非常详尽的描述,这里就不再班门弄斧一一赘述了。只结合我们自己的案例,做一个比较简短的介绍和总结。

我们公司这个案例的排查之所以花了近2个礼拜,其中一个重要原因是这个应用是通过Docker部署的。应用上线运行一段时间后,会被Docker的OOM killer给Kill掉,查看JVM监控数据却发现Heap使用得很少,甚至都没有old GC发生过,top里看这个JAVA进程的RSS内存占用远高于分配的Heap大小。很自然的,研发人员第一反应是底层系统的问题,注意力被转移到研究各种Docker内存相关的参数上。 而我知道ElasticCloud曾经也被某些版本的linux内核bug困扰,docker可能会误杀JVM (参见 Memory Issues We'll Remember),bug的内核版本和docker版本和我们线上部署的又很接近,因此这个内核bug也被加入到了怀疑列表中。 事后证明这个方向是错误的,浪费了一些时间。

在一段时间排查无果后,为了缩小排查范围,我们决定将这个应用部署到VM上做对比测试。结果内存泄漏问题依然存在,因而排除掉了Linux内核和docker本身的问题。

同期也参考过一篇关于DirectByteByffer造成堆外内存泄漏问题的分析博客,JVM源码分析之堆外内存完全解读 ,考虑到问题现象和我们类似,我们的应用也有用到netty,DBB泄漏也被列为怀疑对象。然而在JVM启动里参数里对MaxDirectMemorySize做了限制后,经过一段时间对外服务,JAVA进程的RSS仍然会远超过HEAP + MDM设置的大小。

这期间我们也使用过NMT 工具分析HEAP内存占用情况,然而这个工具报告出来的内存远小于RSS,也就是说这多出来的内存并没有被JVM本身用到,泄漏的是native memory。 JAVA应用产生native memory泄漏通常是在使用某些native库时造成的,因此注意力转移到JNI。

最终帮助我们找到正确方向的是开头列的 Debugging Java Native Memory Leaks 这篇由Twitter工程师写的博客。 博客里介绍了如何使用jemalloc来替换glibc的malloc,通过拦截和追踪JVM对native memory的分配申请,从而可以分析出HEAP以外的内存分配由哪些方法调用产生的。博客里提到产生泄漏的原因是忘记关闭GZIPOutputStream,巧合的是我们线上应用也使用了gzip压缩服务请求数据,于是查看了一下相关的代码,果然发现有忘记关闭的stream。 找到根源后,解决问题就简单了,一行代码修复。
 
对于ElasticSearch用户,要注意的是某些版本存在这个泄漏问题,对于小内存机器上运行的ES服务可能会有较大的影响。 可是官方没有明确列出所有受影响的版本,只在博客里提到5.2.1修复了这些问题。 因此如果你有顾虑的话,可以用top命令看一下ES JAVA进程的RSS消耗,如果大大于分配的HEAP,有可能就是中招啦。  收起阅读 »

招聘 Elastic search 培训师/项目经理 20k +

Elastic search 服务供应商需要招聘培训师/项目经理

薪酬: 月工资20k +
工作地点:北京/上海/深圳                     愿意出差,因工作情况会全国飞

任职要求:

1、计算机相关专业,本科以上学历,具有3年以上搜索引擎及相关开发经验;

2、较强的java编程基础,熟悉Git代码管理,有多分支并行开发经验;

3、熟练使用开源搜索工具Logstash,ElasticSearch,熟悉其原理和源代码,能熟练的修改开源工具以适合业务场景的需求;

4、熟悉Lucene以及Kibana,有实际的产品使用经历;

5、具有良好的沟通能力和责任心。
 
继续阅读 »
Elastic search 服务供应商需要招聘培训师/项目经理

薪酬: 月工资20k +
工作地点:北京/上海/深圳                     愿意出差,因工作情况会全国飞

任职要求:

1、计算机相关专业,本科以上学历,具有3年以上搜索引擎及相关开发经验;

2、较强的java编程基础,熟悉Git代码管理,有多分支并行开发经验;

3、熟练使用开源搜索工具Logstash,ElasticSearch,熟悉其原理和源代码,能熟练的修改开源工具以适合业务场景的需求;

4、熟悉Lucene以及Kibana,有实际的产品使用经历;

5、具有良好的沟通能力和责任心。
  收起阅读 »

找寻TF_IDF和BM25的评分计算优化排序

1.下面简述下如何根据explain解释TFIDF和BM25的评分计算
2.首先是TFIDF
使用ik_smart分词器,ES为2.3.3
文档是:分词结果是
"伟业我爱我家"     分词结果:【伟业,我,爱我,家】
"我爱我家"     【我,爱我,家】
这两个。
multi_match  匹配,query=我爱我家
排名如下
-----------------------------------------------------------
"伟业我爱我家"    "_score": 6.8563557,
详细参数 
"我":tf=1,idf=6.7638364,fieldNorm=0.5,queryNorm=0.07292504,
“爱我”: tf=1,idf=6.7638364,fieldNorm=0.5,queryNorm=0.07292504
“家”: tf=1,idf=6.278329,fieldNorm=0.5,queryNorm=0.07292504
----------------------------------------------------------
"我爱我家"          "_score": 6.7839246,
"我":tf=1,idf=6.9336233,fieldNorm=0.5,queryNorm=0.07370365,
“爱我”: tf=1,idf=6.9336233,fieldNorm=0.5,queryNorm=0.07370365
“家”: tf=1,idf=6.9336233,fieldNorm=0.5,queryNorm=0.07370365
---------------------------------------------------------
其中queryNorm是由每个term词项的idf综合计算而来,所以在每个文档中,他都是一样的。
然后仔细比较得分,觉得每个得分都可以被推算出来
但是排序结果不符合期望:
queryNorm 官方文档也说了基本没有什么用
tf=1没什么可说
idf有些问题,比如"爱我"在这两个文档中是不同的(这是因为这两个文档在不同的分片中引起的)
那这么说来,TFIDF的得分就仅仅受tf,idf,fieldNorm控制,
而idf因为分片不均匀可能会出现一点差异,fieldNorm又犹由于精度让长度为3或者4 的文档值都为0.5
。综上:tfidf在这种量不多(200万)的短文本检索下,效果很差。

这种情况下,我该怎么优化这个排序呢(让“我爱我家”,排在"伟业我爱我家"前面呢?)
 
 
 
------------------BM25的详情稍后补上-------------------------
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
继续阅读 »
1.下面简述下如何根据explain解释TFIDF和BM25的评分计算
2.首先是TFIDF
使用ik_smart分词器,ES为2.3.3
文档是:分词结果是
"伟业我爱我家"     分词结果:【伟业,我,爱我,家】
"我爱我家"     【我,爱我,家】
这两个。
multi_match  匹配,query=我爱我家
排名如下
-----------------------------------------------------------
"伟业我爱我家"    "_score": 6.8563557,
详细参数 
"我":tf=1,idf=6.7638364,fieldNorm=0.5,queryNorm=0.07292504,
“爱我”: tf=1,idf=6.7638364,fieldNorm=0.5,queryNorm=0.07292504
“家”: tf=1,idf=6.278329,fieldNorm=0.5,queryNorm=0.07292504
----------------------------------------------------------
"我爱我家"          "_score": 6.7839246,
"我":tf=1,idf=6.9336233,fieldNorm=0.5,queryNorm=0.07370365,
“爱我”: tf=1,idf=6.9336233,fieldNorm=0.5,queryNorm=0.07370365
“家”: tf=1,idf=6.9336233,fieldNorm=0.5,queryNorm=0.07370365
---------------------------------------------------------
其中queryNorm是由每个term词项的idf综合计算而来,所以在每个文档中,他都是一样的。
然后仔细比较得分,觉得每个得分都可以被推算出来
但是排序结果不符合期望:
queryNorm 官方文档也说了基本没有什么用
tf=1没什么可说
idf有些问题,比如"爱我"在这两个文档中是不同的(这是因为这两个文档在不同的分片中引起的)
那这么说来,TFIDF的得分就仅仅受tf,idf,fieldNorm控制,
而idf因为分片不均匀可能会出现一点差异,fieldNorm又犹由于精度让长度为3或者4 的文档值都为0.5
。综上:tfidf在这种量不多(200万)的短文本检索下,效果很差。

这种情况下,我该怎么优化这个排序呢(让“我爱我家”,排在"伟业我爱我家"前面呢?)
 
 
 
------------------BM25的详情稍后补上-------------------------
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  收起阅读 »

Emacs与ElasticSearch

一直想找一个数据库用于存储各种的代码片段

mysql会一点 mongodb也看过

但是最终都没有弄成(或许是我性格的原因,想的太多,做的太少(算是过度设计的一种吧))

后来发现了ElasticSearch

觉得他能够实现我的想法(或许只是他简介里的一句话,大致的意思是:多看看数据,而非让他们躺在仓库里)

我会将过程记录下来,希望对后来人有帮助

(不过一切都是在Emacs环境下的,知道的人应该不多,所以能帮到的人也就更少了(其实他们也不用我帮))
继续阅读 »
一直想找一个数据库用于存储各种的代码片段

mysql会一点 mongodb也看过

但是最终都没有弄成(或许是我性格的原因,想的太多,做的太少(算是过度设计的一种吧))

后来发现了ElasticSearch

觉得他能够实现我的想法(或许只是他简介里的一句话,大致的意思是:多看看数据,而非让他们躺在仓库里)

我会将过程记录下来,希望对后来人有帮助

(不过一切都是在Emacs环境下的,知道的人应该不多,所以能帮到的人也就更少了(其实他们也不用我帮)) 收起阅读 »

分布式搜索引擎教程-Elasticsearch

      大家好,我是重构人生,很开心能在这里和大家分享我的免费Elasticsearch 视频教程。 我是一个Elasticsearch 的DevOps ,使用了很久的开源软件,在开源社区也获得过很多小伙伴的帮助。我希望自己能为社区贡献自己的一份力。
 
      我应该算是个热心肠的人吧,喜欢乐于助人,不过有些人的提问方式让我非常反感,甚至是厌恶,什么样的人呢,第一种,官方文档,或者百度,或者GOOGLE,等方式轻易的就可以找到解决方案却仍然拿出来提问的人。 第二种就是什么条件、环境都不描述,背景也不说上来就问,怎么样最好,如何性能最快,怎么做才能最稳定的人,我说话比较直,勿怪,对于这类人,你至少要让他知道一些概念,不然根本没法交流。  
 
       为了解决这些问题,我想提供一种快速让一些没有经验或者经验不足的朋友去快速了解Elasticsearch,了解ES能做什么,了解ES怎么做才能达到你的要求,带着这些问题,我在头脑里构思了 两个系列的视频,第一个是ES-教程篇, 第二个是ES-实战篇,把实际的生产环境中的一些场景,剥离业务相关的,保密性的东西,以纯技术的方式与大家分享下,看我们是如何踩坑,填坑的。

由于视频是个人行为,非商业性质,所以不可能做到定时更新,这点还请大家见谅,不过我肯定会用心去做。
 
所有的视频会以两个方式去提供,一个是百度云盘里下载完整的压缩包,里面包含了视频、PPT、以及配置文件信息。另一种是通过优库视频直接看视频,PPT和配置文件到百度云上去下载。
 
 
百度云: https://pan.baidu.com/s/1i4ZsORF
优酷:http://i.youku.com/rickywag
 
 
感谢你们的支持,如果觉得不错可以打赏我哟。
继续阅读 »
      大家好,我是重构人生,很开心能在这里和大家分享我的免费Elasticsearch 视频教程。 我是一个Elasticsearch 的DevOps ,使用了很久的开源软件,在开源社区也获得过很多小伙伴的帮助。我希望自己能为社区贡献自己的一份力。
 
      我应该算是个热心肠的人吧,喜欢乐于助人,不过有些人的提问方式让我非常反感,甚至是厌恶,什么样的人呢,第一种,官方文档,或者百度,或者GOOGLE,等方式轻易的就可以找到解决方案却仍然拿出来提问的人。 第二种就是什么条件、环境都不描述,背景也不说上来就问,怎么样最好,如何性能最快,怎么做才能最稳定的人,我说话比较直,勿怪,对于这类人,你至少要让他知道一些概念,不然根本没法交流。  
 
       为了解决这些问题,我想提供一种快速让一些没有经验或者经验不足的朋友去快速了解Elasticsearch,了解ES能做什么,了解ES怎么做才能达到你的要求,带着这些问题,我在头脑里构思了 两个系列的视频,第一个是ES-教程篇, 第二个是ES-实战篇,把实际的生产环境中的一些场景,剥离业务相关的,保密性的东西,以纯技术的方式与大家分享下,看我们是如何踩坑,填坑的。

由于视频是个人行为,非商业性质,所以不可能做到定时更新,这点还请大家见谅,不过我肯定会用心去做。
 
所有的视频会以两个方式去提供,一个是百度云盘里下载完整的压缩包,里面包含了视频、PPT、以及配置文件信息。另一种是通过优库视频直接看视频,PPT和配置文件到百度云上去下载。
 
 
百度云: https://pan.baidu.com/s/1i4ZsORF
优酷:http://i.youku.com/rickywag
 
 
感谢你们的支持,如果觉得不错可以打赏我哟。 收起阅读 »

基于ElasticSearch的亿级实时日志系统实践

看得出来是踩了不少坑总结出来的,推荐下: 基于ElasticSearch的亿级实时日志系统实践
 
继续阅读 »
看得出来是踩了不少坑总结出来的,推荐下: 基于ElasticSearch的亿级实时日志系统实践
  收起阅读 »

[原创] ElasticSearch集群故障案例分析: 警惕通配符查询

[携程旅行网: 吴晓刚]
 许多有RDBMS/SQL背景的开发者,在初次踏入ElasticSearch世界的时候,很容易就想到使用(Wildcard Query)来实现模糊查询(比如用户输入补全),因为这是和SQL里like操作最相似的查询方式,用起来感觉非常舒适。然而近期我们线上一个搜索集群的故障揭示了,滥用wildcard query可能带来灾难性的后果。

故障经过
线上有一个10来台机器组成的集群,用于某个产品线的产品搜索。数据量并不大,实时更新量也不高,并发搜索量在几百次/s。通常业务高峰期cpu利用率不超过10%,系统负载看起来很低。 但最近这个集群不定期(1天或者隔几天)会出现CPU冲高到100%的问题,持续时间从1分钟到几分钟不等。最严重的一次持续了20来分钟,导致大量的用户搜索请无求响应,从而造成生产事故。

问题排查
细节太多,此处略过,直接给出CPU无故飙高的原因: 研发在搜索实现上,根据用户输入的关键词,在首尾加上通配符,使用wildcard query来实现模糊搜索,例如使用"*迪士尼*"来搜索含有“迪士尼”关键字的产品。 然而用户输入的字符串长度没有做限制,导致首尾通配符中间可能是很长的一个字符串。 后果就是对应的wildcard Query执行非常慢,非常消耗CPU。

复现方法
1. 创建一个只有一条文档的索引
POST test_index/type1/?refresh=true
{
"foo": "bar"
}
2. 使用wildcard query执行一个首尾带有通配符*的长字符串查询
POST /test_index/_search
{
"query": {
"wildcard": {
"foo": {
"value": "*在迪士尼乐园,点亮心中奇梦。它是一个充满创造力、冒险精神与无穷精彩的快地。您可在此游览全球最大的迪士尼城堡——奇幻童话城堡,探索别具一格又令人难忘的六大主题园区——米奇大街、奇想花园、梦幻世界、探险岛、宝藏湾和明日世界,和米奇朋友在一起,感觉欢乐时光开业于2016年上海国际旅游度假区秀沿路亚朵酒店位于上海市浦东新区沪南公路(沪南公路与秀沿路交汇处),临近周浦万达广场、地铁11号线秀沿路站,距离上海南站、人民广场约20公里,距离迪线距*"
}
}
}
}
3. 查看结果
{
"took": 3445,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits":
}
}
即使no hits,耗时却是惊人的3.4秒 (测试机是macbook pro, i7 CPU),并且执行过程中,CPU有一个很高的尖峰。
 
线上的查询比我这个范例要复杂得多,会同时查几个字段,实际测试下来,一个查询可能会执行十几秒钟。 在有比较多长字符串查询的时候,集群可能就DOS了。

探查深层次根源
为什么对只有一条数据的索引做这个查询开销这么高? 直觉上应该是瞬间返回结果才对!

回答这个问题前,可以再做个测试,如果继续加大查询字符串的长度,到了一定长度后,ES直接抛异常了,服务器ES里异常给出的cause如下:


 
Caused by: org.apache.lucene.util.automaton.TooComplexToDeterminizeException: Determinizing automaton with 22082 states and 34182 transitions would result in more than 10000 states. at org.apache.lucene.util.automaton.Operations.determinize(Operations.java:741) ~[lucene-core-6.4.1.jar:6.4.1
 


该异常来自org.apache.lucene.util.automaton这个包,异常原因的字面含义是说“自动机过于复杂而无法确定状态: 由于状态和转换太多,确定一个自动机需要生成的状态超过10000个上限"

网上查找了大量资料后,终于搞清楚了问题的来龙去脉。为了加速通配符和正则表达式的匹配速度,Lucene4.0开始会将输入的字符串模式构建成一个DFA (Deterministic Finite Automaton),带有通配符的pattern构造出来的DFA可能会很复杂,开销很大。这个链接的博客using-dfa-for-wildcard-matching-problem比较形象的介绍了如何为一个带有通配符的pattern构建DFA。借用博客里的范例,a*bc构造出来的DFA如下图:

屏幕快照_2017-05-11_18.56_.06_.png


Lucene构造DFA的实现
看了一下Lucene的里相关的代码,构建过程大致如下:
1. org.apache.lucene.search.WildcardQuery里的toAutomaton方法,遍历输入的通配符pattern,将每个字符变成一个自动机(automaton),然后将每个字符的自动机链接起来生成一个新的自动机
public static Automaton toAutomaton(Term wildcardquery) {
List<Automaton> automata = new ArrayList<>();

String wildcardText = wildcardquery.text();

for (int i = 0; i < wildcardText.length();) {
final int c = wildcardText.codePointAt(i);
int length = Character.charCount(c);
switch(c) {
case WILDCARD_STRING:
automata.add(Automata.makeAnyString());
break;
case WILDCARD_CHAR:
automata.add(Automata.makeAnyChar());
break;
case WILDCARD_ESCAPE:
// add the next codepoint instead, if it exists
if (i + length < wildcardText.length()) {
final int nextChar = wildcardText.codePointAt(i + length);
length += Character.charCount(nextChar);
automata.add(Automata.makeChar(nextChar));
break;
} // else fallthru, lenient parsing with a trailing \
default:
automata.add(Automata.makeChar(c));
}
i += length;
}

return Operations.concatenate(automata);
}
2. 此时生成的状态机是不确定状态机,也就是Non-deterministic Finite Automaton(NFA)。
3. org.apache.lucene.util.automaton.Operations类里的determinize方法则会将NFA转换为DFA  
/**
* Determinizes the given automaton.
* <p>
* Worst case complexity: exponential in number of states.
* @param maxDeterminizedStates Maximum number of states created when
* determinizing. Higher numbers allow this operation to consume more
* memory but allow more complex automatons. Use
* DEFAULT_MAX_DETERMINIZED_STATES as a decent default if you don't know
* how many to allow.
* @throws TooComplexToDeterminizeException if determinizing a creates an
* automaton with more than maxDeterminizedStates
*/
public static Automaton determinize(Automaton a, int maxDeterminizedStates) {
 代码注释里说这个过程的时间复杂度最差情况下是状态数量的指数级别!为防止产生的状态过多,消耗过多的内存和CPU,类里面对最大状态数量做了限制
  /**
* Default maximum number of states that {@link Operations#determinize} should create.
*/
public static final int DEFAULT_MAX_DETERMINIZED_STATES = 10000;
在有首尾通配符,并且字符串很长的情况下,这个determinize过程会产生大量的state,甚至会超过上限。
 
至于NFA和DFA的区别是什么? 如何相互转换? 网上有很多数学层面的资料和论文,限于鄙人算法方面有限的知识,无精力去深入探究。 但是一个粗浅的理解是: NFA在输入一个条件的情况下,可以从一个状态转移到多种状态,而DFA只会有一个确定的状态可以转移,因此DFA在字符串匹配时速度更快。 DFA虽然搜索的时候快,但是构造方面的时间复杂度可能比较高,特别是带有首部通配符+长字符串的时候。

回想Elasticsearch官方文档里对于wildcard query有特别说明,要避免使用通配符开头的term。


" Note that this query can be slow, as it needs to iterate over many terms. In order to prevent extremely slow wildcard queries, a wildcard term should not start with one of the wildcards * or ?."



结合对上面wildcard query底层实现的探究,也就不难理解这句话的含义了!

总结: wildcard query应杜绝使用通配符打头,实在不得已要这么做,就一定需要限制用户输入的字符串长度。 最好换一种实现方式,通过在index time做文章,选用合适的分词器,比如nGram tokenizer预处理数据,然后使用更廉价的term query来实现同等的模糊搜索功能。 对于部分输入即提示的应用场景,可以考虑优先使用completion suggester, phrase/term suggeter一类性能更好,模糊程度略差的方式查询,待suggester没有匹配结果的时候,再fall back到更模糊但性能较差的wildcard, regex, fuzzy一类的查询。
 
-----------
补记: 有同学问regex, fuzzy query是否有同样的问题,答案是有,原因在于他们底层和wildcard一样,都是通过将pattern构造成DFA来加速字符串匹配速度的。 
继续阅读 »
[携程旅行网: 吴晓刚]
 许多有RDBMS/SQL背景的开发者,在初次踏入ElasticSearch世界的时候,很容易就想到使用(Wildcard Query)来实现模糊查询(比如用户输入补全),因为这是和SQL里like操作最相似的查询方式,用起来感觉非常舒适。然而近期我们线上一个搜索集群的故障揭示了,滥用wildcard query可能带来灾难性的后果。

故障经过
线上有一个10来台机器组成的集群,用于某个产品线的产品搜索。数据量并不大,实时更新量也不高,并发搜索量在几百次/s。通常业务高峰期cpu利用率不超过10%,系统负载看起来很低。 但最近这个集群不定期(1天或者隔几天)会出现CPU冲高到100%的问题,持续时间从1分钟到几分钟不等。最严重的一次持续了20来分钟,导致大量的用户搜索请无求响应,从而造成生产事故。

问题排查
细节太多,此处略过,直接给出CPU无故飙高的原因: 研发在搜索实现上,根据用户输入的关键词,在首尾加上通配符,使用wildcard query来实现模糊搜索,例如使用"*迪士尼*"来搜索含有“迪士尼”关键字的产品。 然而用户输入的字符串长度没有做限制,导致首尾通配符中间可能是很长的一个字符串。 后果就是对应的wildcard Query执行非常慢,非常消耗CPU。

复现方法
1. 创建一个只有一条文档的索引
POST test_index/type1/?refresh=true
{
"foo": "bar"
}
2. 使用wildcard query执行一个首尾带有通配符*的长字符串查询
POST /test_index/_search
{
"query": {
"wildcard": {
"foo": {
"value": "*在迪士尼乐园,点亮心中奇梦。它是一个充满创造力、冒险精神与无穷精彩的快地。您可在此游览全球最大的迪士尼城堡——奇幻童话城堡,探索别具一格又令人难忘的六大主题园区——米奇大街、奇想花园、梦幻世界、探险岛、宝藏湾和明日世界,和米奇朋友在一起,感觉欢乐时光开业于2016年上海国际旅游度假区秀沿路亚朵酒店位于上海市浦东新区沪南公路(沪南公路与秀沿路交汇处),临近周浦万达广场、地铁11号线秀沿路站,距离上海南站、人民广场约20公里,距离迪线距*"
}
}
}
}
3. 查看结果
{
"took": 3445,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits":
}
}
即使no hits,耗时却是惊人的3.4秒 (测试机是macbook pro, i7 CPU),并且执行过程中,CPU有一个很高的尖峰。
 
线上的查询比我这个范例要复杂得多,会同时查几个字段,实际测试下来,一个查询可能会执行十几秒钟。 在有比较多长字符串查询的时候,集群可能就DOS了。

探查深层次根源
为什么对只有一条数据的索引做这个查询开销这么高? 直觉上应该是瞬间返回结果才对!

回答这个问题前,可以再做个测试,如果继续加大查询字符串的长度,到了一定长度后,ES直接抛异常了,服务器ES里异常给出的cause如下:


 
Caused by: org.apache.lucene.util.automaton.TooComplexToDeterminizeException: Determinizing automaton with 22082 states and 34182 transitions would result in more than 10000 states. at org.apache.lucene.util.automaton.Operations.determinize(Operations.java:741) ~[lucene-core-6.4.1.jar:6.4.1
 


该异常来自org.apache.lucene.util.automaton这个包,异常原因的字面含义是说“自动机过于复杂而无法确定状态: 由于状态和转换太多,确定一个自动机需要生成的状态超过10000个上限"

网上查找了大量资料后,终于搞清楚了问题的来龙去脉。为了加速通配符和正则表达式的匹配速度,Lucene4.0开始会将输入的字符串模式构建成一个DFA (Deterministic Finite Automaton),带有通配符的pattern构造出来的DFA可能会很复杂,开销很大。这个链接的博客using-dfa-for-wildcard-matching-problem比较形象的介绍了如何为一个带有通配符的pattern构建DFA。借用博客里的范例,a*bc构造出来的DFA如下图:

屏幕快照_2017-05-11_18.56_.06_.png


Lucene构造DFA的实现
看了一下Lucene的里相关的代码,构建过程大致如下:
1. org.apache.lucene.search.WildcardQuery里的toAutomaton方法,遍历输入的通配符pattern,将每个字符变成一个自动机(automaton),然后将每个字符的自动机链接起来生成一个新的自动机
public static Automaton toAutomaton(Term wildcardquery) {
List<Automaton> automata = new ArrayList<>();

String wildcardText = wildcardquery.text();

for (int i = 0; i < wildcardText.length();) {
final int c = wildcardText.codePointAt(i);
int length = Character.charCount(c);
switch(c) {
case WILDCARD_STRING:
automata.add(Automata.makeAnyString());
break;
case WILDCARD_CHAR:
automata.add(Automata.makeAnyChar());
break;
case WILDCARD_ESCAPE:
// add the next codepoint instead, if it exists
if (i + length < wildcardText.length()) {
final int nextChar = wildcardText.codePointAt(i + length);
length += Character.charCount(nextChar);
automata.add(Automata.makeChar(nextChar));
break;
} // else fallthru, lenient parsing with a trailing \
default:
automata.add(Automata.makeChar(c));
}
i += length;
}

return Operations.concatenate(automata);
}
2. 此时生成的状态机是不确定状态机,也就是Non-deterministic Finite Automaton(NFA)。
3. org.apache.lucene.util.automaton.Operations类里的determinize方法则会将NFA转换为DFA  
/**
* Determinizes the given automaton.
* <p>
* Worst case complexity: exponential in number of states.
* @param maxDeterminizedStates Maximum number of states created when
* determinizing. Higher numbers allow this operation to consume more
* memory but allow more complex automatons. Use
* DEFAULT_MAX_DETERMINIZED_STATES as a decent default if you don't know
* how many to allow.
* @throws TooComplexToDeterminizeException if determinizing a creates an
* automaton with more than maxDeterminizedStates
*/
public static Automaton determinize(Automaton a, int maxDeterminizedStates) {
 代码注释里说这个过程的时间复杂度最差情况下是状态数量的指数级别!为防止产生的状态过多,消耗过多的内存和CPU,类里面对最大状态数量做了限制
  /**
* Default maximum number of states that {@link Operations#determinize} should create.
*/
public static final int DEFAULT_MAX_DETERMINIZED_STATES = 10000;
在有首尾通配符,并且字符串很长的情况下,这个determinize过程会产生大量的state,甚至会超过上限。
 
至于NFA和DFA的区别是什么? 如何相互转换? 网上有很多数学层面的资料和论文,限于鄙人算法方面有限的知识,无精力去深入探究。 但是一个粗浅的理解是: NFA在输入一个条件的情况下,可以从一个状态转移到多种状态,而DFA只会有一个确定的状态可以转移,因此DFA在字符串匹配时速度更快。 DFA虽然搜索的时候快,但是构造方面的时间复杂度可能比较高,特别是带有首部通配符+长字符串的时候。

回想Elasticsearch官方文档里对于wildcard query有特别说明,要避免使用通配符开头的term。


" Note that this query can be slow, as it needs to iterate over many terms. In order to prevent extremely slow wildcard queries, a wildcard term should not start with one of the wildcards * or ?."



结合对上面wildcard query底层实现的探究,也就不难理解这句话的含义了!

总结: wildcard query应杜绝使用通配符打头,实在不得已要这么做,就一定需要限制用户输入的字符串长度。 最好换一种实现方式,通过在index time做文章,选用合适的分词器,比如nGram tokenizer预处理数据,然后使用更廉价的term query来实现同等的模糊搜索功能。 对于部分输入即提示的应用场景,可以考虑优先使用completion suggester, phrase/term suggeter一类性能更好,模糊程度略差的方式查询,待suggester没有匹配结果的时候,再fall back到更模糊但性能较差的wildcard, regex, fuzzy一类的查询。
 
-----------
补记: 有同学问regex, fuzzy query是否有同样的问题,答案是有,原因在于他们底层和wildcard一样,都是通过将pattern构造成DFA来加速字符串匹配速度的。  收起阅读 »

[杭州活动][2017年5月13日] Open Talk 美联集团(蘑菇街)技术专场

活动时间
2017年5月13日14:00-17:00

活动场地
杭州市拱墅区丰潭路430号丰元国际大厦A座B1楼硬趣空间(城西银泰对面)
 
报名链接
http://t.cn/RX8xsh6
 
活动流程
13:30-14:00 签 到

14:00-14:10 开 场

14:10-15:00 无 相 蘑菇街稳定性 & 性能工作负责人  《蘑菇街稳定性实践》

15:00-15:50 民 达 美丽联合集团图像算法技术专家 《电商中的图像算法与应用》

15:50-16:00 茶 歇

16:00-16:50 吴 邪 美丽联合集团无线应用团队工程师 《无线端面向数据设计实践与可视化编程语言Dson》

16:50-17:30 自由交流
 
讲师介绍
无相 蘑菇街稳定性&性能工作负责人
2014年底加入蘑菇街,一直参与稳定性工具和平台的开发与建设,包括全链路监控和压测系统的设计和开发。
《蘑菇街稳定性实践》
本次分享主要介绍:蘑菇街大促保障流程,稳定性平台和工具支持:开关预案系统、限流降级系统、全链路监控系统、强弱依赖系统、全链路压测系统、单机压测系统、容量规划系统、业务全息监控系统、java性能在线分析系统等内容。
 
民达 美丽联合集团图像算法技术专家
2015年加入蘑菇街,现任美丽联合集团(美丽说X蘑菇街)图像算法技术专家,负责图像技术研发工作,带领算法团队与工程和业务团队合作,为集团提供图像技术支持。主要工作包括:图像搜索、图像识别、商品图像内容分析等;业务涉及电商导购、直播等场景。在加入蘑菇街之前,分别在NEC中国研究院、阿里巴巴集团,从事图像技术和机器学习的研究和应用。
《电商中的图像算法与应用》
本次分享主要介绍从电商业务中发现图像算法的价值和利用图像算法,提升电商业务中的用户体验。
 
吴邪,美丽联合集团无线应用团队工程师
2013年毕业于浙江大学,并加入淘宝从事服务端相关开发工作,后加入阿里云rds团队从事数据库云平台建设。2016年加入美丽联合集团,目前主要负责无线网关数据聚合层。对服务端高性能、高可用设计与编码比较感兴趣。
《无线端面向数据设计实践与可视化编程语言Dson》
本次分享主要介绍mwp-dsl、无线领域前后端开发现状、业界相关内容、mwp-dsl目标、dsl的挑战与核心设计(业务建模,性能与稳定性、安全、易用性)、数据可视化语言Dson、周边配套(开发、测试、管理、运维后台,相关运维体系)、适合的业务场景、后续工作等内容。
 
往期讲稿/视频回顾
https://opentalk.upyun.com
继续阅读 »
活动时间
2017年5月13日14:00-17:00

活动场地
杭州市拱墅区丰潭路430号丰元国际大厦A座B1楼硬趣空间(城西银泰对面)
 
报名链接
http://t.cn/RX8xsh6
 
活动流程
13:30-14:00 签 到

14:00-14:10 开 场

14:10-15:00 无 相 蘑菇街稳定性 & 性能工作负责人  《蘑菇街稳定性实践》

15:00-15:50 民 达 美丽联合集团图像算法技术专家 《电商中的图像算法与应用》

15:50-16:00 茶 歇

16:00-16:50 吴 邪 美丽联合集团无线应用团队工程师 《无线端面向数据设计实践与可视化编程语言Dson》

16:50-17:30 自由交流
 
讲师介绍
无相 蘑菇街稳定性&性能工作负责人
2014年底加入蘑菇街,一直参与稳定性工具和平台的开发与建设,包括全链路监控和压测系统的设计和开发。
《蘑菇街稳定性实践》
本次分享主要介绍:蘑菇街大促保障流程,稳定性平台和工具支持:开关预案系统、限流降级系统、全链路监控系统、强弱依赖系统、全链路压测系统、单机压测系统、容量规划系统、业务全息监控系统、java性能在线分析系统等内容。
 
民达 美丽联合集团图像算法技术专家
2015年加入蘑菇街,现任美丽联合集团(美丽说X蘑菇街)图像算法技术专家,负责图像技术研发工作,带领算法团队与工程和业务团队合作,为集团提供图像技术支持。主要工作包括:图像搜索、图像识别、商品图像内容分析等;业务涉及电商导购、直播等场景。在加入蘑菇街之前,分别在NEC中国研究院、阿里巴巴集团,从事图像技术和机器学习的研究和应用。
《电商中的图像算法与应用》
本次分享主要介绍从电商业务中发现图像算法的价值和利用图像算法,提升电商业务中的用户体验。
 
吴邪,美丽联合集团无线应用团队工程师
2013年毕业于浙江大学,并加入淘宝从事服务端相关开发工作,后加入阿里云rds团队从事数据库云平台建设。2016年加入美丽联合集团,目前主要负责无线网关数据聚合层。对服务端高性能、高可用设计与编码比较感兴趣。
《无线端面向数据设计实践与可视化编程语言Dson》
本次分享主要介绍mwp-dsl、无线领域前后端开发现状、业界相关内容、mwp-dsl目标、dsl的挑战与核心设计(业务建模,性能与稳定性、安全、易用性)、数据可视化语言Dson、周边配套(开发、测试、管理、运维后台,相关运维体系)、适合的业务场景、后续工作等内容。
 
往期讲稿/视频回顾
https://opentalk.upyun.com 收起阅读 »

packetbeat的oracle协议扩展

oracle由于是商用软件,协议并不公开,而且相比mysql等开源数据库软件,协议复杂度加了不止一个量级。
出于版权考虑,packetbeat并没有加入oracle协议的支持,只能自己动手。
好在beats充分考虑了扩展性,把公共的基础工作抽象成框架,新协议的扩展只需要专注于协议的分析和解码。
tns协议是oracle客户端和服务端通信协议,应用可以通过OCI、JDBC等接口去访问数据库。
tns协议有多个版本,不同版本之间差异也比较大,11g是主流tns版本为314。
目前完成308、310、313、314、315版本的解析
 
packetbeat支持pcap、pf_ring等抓包方式,通过kafka+es+kibana展示,效果如图
 
继续阅读 »
oracle由于是商用软件,协议并不公开,而且相比mysql等开源数据库软件,协议复杂度加了不止一个量级。
出于版权考虑,packetbeat并没有加入oracle协议的支持,只能自己动手。
好在beats充分考虑了扩展性,把公共的基础工作抽象成框架,新协议的扩展只需要专注于协议的分析和解码。
tns协议是oracle客户端和服务端通信协议,应用可以通过OCI、JDBC等接口去访问数据库。
tns协议有多个版本,不同版本之间差异也比较大,11g是主流tns版本为314。
目前完成308、310、313、314、315版本的解析
 
packetbeat支持pcap、pf_ring等抓包方式,通过kafka+es+kibana展示,效果如图
  收起阅读 »

【线下活动】2017-05-21 Elastic Meetup 北京站日程安排

主办:Elastic 中文社区

elastic中文社区-50.jpg


协办:HULU 北京研发中心

WechatIMG2.jpg



时间:2017-05-21 13:30PM-18:00PM
地点:北京市朝阳区望京大科技园浦项中心b座21楼  hulu
 
分享主题:

image001.png

个人介绍:倪顺,Hulu软件工程师,ELK粉。主要负责用户播放日志数据的收集,处理和可视化,以及服务监控。
主题:Elasticsearch 和 Kibana 在 Hulu视频的应用实践
内容介绍:Elasticsearch作为优秀的开源工具,很早就在Hulu内部使用。Hulu是一家视频公司,我们在用Elastic stack优化视频播放体验。本次分享中,主要包括:1)Kibana可视化视频播放日志数据;2)Elastic Stack使用的经验tips。
 

huangxin.jpg

 
个人介绍:黄鑫,运维开发工程师,Pythonista,在监控和部署领域耕耘多年,一年前接触了 ELK。
主题:ELK CI/CD 部署实践
内容介绍:
使用 SaltStack 对 ELK 维护。配置管理,持续集成和持续部署的设计和实施。日常运维管理。
- 背景介绍
- 可用性设计
- 配置管理和持续集成
- 持续部署
- 发现的问题和未来展望
 

luo.png

 
个人介绍:罗喆,最早加入快手的视频技术工程师,负责移动直播系统的构建和调优,并且搭建了基于大数据的质量监测系统,之前曾在腾讯从事实时视音频传输优化工作。
主题:Elastic Stack驱动的直播体验优化
内容介绍:
移动端视频直播业务经过2016年的井喷期,已经进入下半场,大家的关注点已经从如何构建完善的直播平台的粗放增长阶段,转入精细化运营阶段。如何在巨大的流量、复杂的应用场景、复杂的网络条件下,持续优化用户体验,是我们亟待回答的问题。构建大数据驱动的直播优化体系是快手为应对这一难题所提出的解决方案。
为此,我们基于完善的Elastic Stack建立了流媒体大数据分析和可视化平台。一切优化均围绕着数据进行:找到用户痛点,指导优化方向,评估优化效果,走出了一条行之有效的数据驱动之路。
演讲提纲:
1.     快手直播的业务背景,移动直播体验优化的方法论
2.     Elastic Stack系统构建历程和真实优化案例
继续阅读 »
主办:Elastic 中文社区

elastic中文社区-50.jpg


协办:HULU 北京研发中心

WechatIMG2.jpg



时间:2017-05-21 13:30PM-18:00PM
地点:北京市朝阳区望京大科技园浦项中心b座21楼  hulu
 
分享主题:

image001.png

个人介绍:倪顺,Hulu软件工程师,ELK粉。主要负责用户播放日志数据的收集,处理和可视化,以及服务监控。
主题:Elasticsearch 和 Kibana 在 Hulu视频的应用实践
内容介绍:Elasticsearch作为优秀的开源工具,很早就在Hulu内部使用。Hulu是一家视频公司,我们在用Elastic stack优化视频播放体验。本次分享中,主要包括:1)Kibana可视化视频播放日志数据;2)Elastic Stack使用的经验tips。
 

huangxin.jpg

 
个人介绍:黄鑫,运维开发工程师,Pythonista,在监控和部署领域耕耘多年,一年前接触了 ELK。
主题:ELK CI/CD 部署实践
内容介绍:
使用 SaltStack 对 ELK 维护。配置管理,持续集成和持续部署的设计和实施。日常运维管理。
- 背景介绍
- 可用性设计
- 配置管理和持续集成
- 持续部署
- 发现的问题和未来展望
 

luo.png

 
个人介绍:罗喆,最早加入快手的视频技术工程师,负责移动直播系统的构建和调优,并且搭建了基于大数据的质量监测系统,之前曾在腾讯从事实时视音频传输优化工作。
主题:Elastic Stack驱动的直播体验优化
内容介绍:
移动端视频直播业务经过2016年的井喷期,已经进入下半场,大家的关注点已经从如何构建完善的直播平台的粗放增长阶段,转入精细化运营阶段。如何在巨大的流量、复杂的应用场景、复杂的网络条件下,持续优化用户体验,是我们亟待回答的问题。构建大数据驱动的直播优化体系是快手为应对这一难题所提出的解决方案。
为此,我们基于完善的Elastic Stack建立了流媒体大数据分析和可视化平台。一切优化均围绕着数据进行:找到用户痛点,指导优化方向,评估优化效果,走出了一条行之有效的数据驱动之路。
演讲提纲:
1.     快手直播的业务背景,移动直播体验优化的方法论
2.     Elastic Stack系统构建历程和真实优化案例 收起阅读 »