使用 nohup 或 disown 如果你要让某个进程运行在后台。

You know, for search--带你认识Elasticsearch


Elasticsearch作为当前流行的分布式搜索引擎,被广泛应用于日志检索,指标采集,APM,安全分析等领域。本文将对Elastic Stack的发展历程,基本原理,产品生态,主要功能和应用场景进行总结,以帮助大家对Elastic生态的前世今生能有一个清晰的了解。

1. 发展历程

1.1 美好的事物总有一个浪漫的开始

许多年前,一个叫Shay Banon的年轻人想为正在学习厨艺的新婚妻子编写一款菜谱搜索软件。在开发过程中,他发现搜索引擎库Lucene不仅使用门槛高,还有会有许多重复性工作。因此他决定在lucene基础之上封装一个简单易用的搜索应用库,并命名为Compress。Elasticsearch的前身就在这样浪漫的机缘下诞生了。

1.2 分布式为其注入了新的活力

之后shay找到了一份工作,工作内容涉及到大量的高并发分布式场景,于是他决定重写Compress,引入了分布式架构,并更名为Elasticsearch。Elasticsearch的第一个版本发布于2010年5月,发布后公众反响强烈。

1.3 开源力量助其腾飞

Elasticsearch在github上发布后,使用量骤增,并很快有了自己的社区。很快,社区中的 Steven Schuurman、Uri Boness 和 Simon Willnauer 与Shay Banon 一起成立了一家搜索公司Elasticsearch Inc.。
在Elasticsearch Inc.公司成立前后,另外两个开源项目也正在快速发展。一个是Jordan Sissel的开源可插拔数据采集工具Logstash, 另一个是Rashid Khan的开源数据可视化UI Kibana。由于作者间对彼此产品比较熟悉,因此决定合作发展,最终形成了Elastic Stack的经典技术栈ELK: Elasticsearch, Logstash, Kibana

1.4 快速成长

之后Elasticsearch迅速发展,增加了许多新功能和特性 版本 发布日志 重要特性
0.7.0 2010.5.14 github上第一个版本
1.0.0 2014.2.14 备份恢复,聚合,熔断器,docvalues等
2.0.0 2015.10.28 组件版本统一,推出Elastic Cloud等
5.0.0 2016.10.26 商业组件整合为x-pack;使用Lucene6.0引入BKD树,稀疏数据优化等; beat引入module概念; 增加machine learning功能; shrink API; ingest node; painless 脚本等
6.0.0 2017.8.31 稀疏性docvalues支持,index sorting, sequence num, 滚动升级等
7.0.0 2019.4.10 引入新的集群协调层zen2; real内存熔断器等

2018年美东时间10月5日上午 9:30 整,纽约证券交易所的铃声响起,Elastic 成功上市。

2. 基本原理

2.1 最初的想法

Elasticsearch是一个分布式搜索引擎,底层使用Lucene来实现其核心搜索功能。虽然当前Elasticsearch拥有的众多的功能和解决方案,但是其核心仍然是全文检索。

  • 什么是全文检索?
    生活中的数据可以分为结构化数据和非结构化数据。结构化数据是指格式和长度固定的数据,如一个人的年龄,姓名等。非结构化数据是指格式和长度不固定的数据,如一个文章的内容等。
    对于结构化数据,可以存储在DB中通过精确匹配找到。但是对于非结构化数据,一般查询时只能提供查询的局部信息或模糊信息,传统数据库无法根据这些信息进行查询(或者说效率很差)。
  • 如何解决全文检索-倒排索引
    倒排索引时相对于正排索引而言的,如下图是正排索引和倒排索引的对比

    正排索引可以通过id查找到对应的文章,但是无法通过给的部分内容如love,找出含有该关键字的文档。 倒排索引会先对文档进行分析将其拆分成单个Term, 并存储包含该Term的文档id,这样便可以实现通过内容查找对应文档,如包含love的文档为文档1的第二个位置和文档2的第二个位置。倒排索引的逻辑结构如下图:

    当然这样的倒排索引建立起来会导致索引的大小迅速膨胀,lucene对此引入了一个特殊的数据结构叫FST,用于解决这个问题。感兴趣的朋友可以查询资料了解,公众号里后续也会专门介绍该数据结构。

2.2 Elasticsearch的改进

使用倒排索引实现全文检索都是Lucene已经具备的能力,Elasticsearch只是将这个能力封装起来提供给用户使用。那么Elasticsearch在lucene之上做了哪些改进和优化呢? 首先我们先了解一下Lucene中的几个基本概念

  • Index(索引):一类业务数据的集合,类似于传统数据库DB的概念。
  • Document(文档):一条完整的数据记录,json格式,是数据存储和检索的基本单位,类似于传统数据库的一条记录。
  • Field(字段):文档的具体一个属性,类似于传统数据库的列。
  • Term(分词):全文检索特有词汇,在存储文档字段或检索时会先对传入的值进行拆分,使用拆分后的词进行存储和检索。

    2.2.1 分布式设计:

    为了支持对海量数据的存储和查询,Elasticsearch引入分片的概念,一个索引被分成多个分片,每个分片可以有一个主分片和多个副本分片,每个分片副本都是一个具有完整功能的lucene实例,可以独立进行存储和搜索。分片可以分配在不同的节点上,同一个分片的不同副本不能分配在相同的节点上。 在进行读写操作时,ES会根据传入的_routing参数(或mapping中设置的_routing, 如果参数和设置中都没有则默认使用_id), 按照公式shard_num = hash(\routing) % num_primary_shards,计算出文档要所在或要分配到的分片,再从集群元数据中找出对应主分片的位置,将请求路由到该分片进行读写操作。

2.2.2 近实时性-refresh操作

当一个文档写入Lucene后是不能被立即查询到的,Elasticsearch提供了一个refresh操作,会定时地调用lucene的reopen(新版本为openIfChanged)为内存中新写入的数据生成一个新的segment,此时被处理的文档均可以被检索到。refresh操作的时间间隔由refresh_interval参数控制,默认为1s, 当然还可以在写入请求中带上refresh表示写入后立即refresh,另外还可以调用refresh API显式refresh。

2.2.3 数据存储可靠性

  1. 引入translog 当一个文档写入Lucence后是存储在内存中的,即使执行了refresh操作仍然是在文件系统缓存中,如果此时服务器宕机,那么这部分数据将会丢失。为此ES增加了translog, 当进行文档写操作时会先将文档写入Lucene,然后写入一份到translog,写入translog是落盘的(如果对可靠性要求不是很高,也可以设置异步落盘,可以提高性能,由配置index.translog.durabilityindex.translog.sync_interval控制),这样就可以防止服务器宕机后数据的丢失。与传统的分布式系统不同,这里是先写入Lucene再写入translog,原因是写入Lucene可能会失败,为了减少写入失败回滚的复杂度,因此先写入Lucene.
  2. flush操作 另外每30分钟或当translog达到一定大小(由index.translog.flush_threshold_size控制,默认512mb), ES会触发一次flush操作,此时ES会先执行refresh操作将buffer中的数据生成segment,然后调用lucene的commit方法将所有内存中的segment fsync到磁盘。此时lucene中的数据就完成了持久化,会清空translog中的数据(6.x版本为了实现sequenceIDs,不删除translog)
  3. merge操作 由于refresh默认间隔为1s中,因此会产生大量的小segment,为此ES会运行一个任务检测当前磁盘中的segment,对符合条件的segment进行合并操作,减少lucene中的segment个数,提高查询速度,降低负载。不仅如此,merge过程也是文档删除和更新操作后,旧的doc真正被删除的时候。用户还可以手动调用_forcemerge API来主动触发merge,以减少集群的segment个数和清理已删除或更新的文档。
  4. 多副本机制 另外ES有多副本机制,一个分片的主副分片不能分片在同一个节点上,进一步保证数据的可靠性。

2.2.4 部分更新

lucene支持对文档的整体更新,ES为了支持局部更新,在Lucene的Store索引中存储了一个_source字段,该字段的key值是文档ID, 内容是文档的原文。当进行更新操作时先从_source中获取原文,与更新部分合并后,再调用lucene API进行全量更新, 对于写入了ES但是还没有refresh的文档,可以从translog中获取。另外为了防止读取文档过程后执行更新前有其他线程修改了文档,ES增加了版本机制,当执行更新操作时发现当前文档的版本与预期不符,则会重新获取文档再更新。

3 Elastic Stack生态

Elasticsearch相对于其他的搜索引擎最大的优势之一就是完整的产品矩阵和活跃的社区,下图是Elastic Stack的产品矩阵

3.1 Elastic大数据平台

产品矩阵中最核心的部分是Elastic大数据平台,也就是大家所熟知的ELK(现在应该叫ELKB)。其中

  • Elasticsearch是其中的搜索引擎,是整个Elastic Stack的核心所在,它底层使用Lucene,对外提供分布式的高可用,易扩展,近实时的数据存储和检索服务。
  • Logstash是一个数据采集工具。在早期的Elastic Stack中起到数据采集,处理的作用,在新的架构中,数据采集工作交给了更轻量级的beat来完成,Logstash则更多地用在数据汇聚,处理场景下。Logstash提供了200+的插件来支持各种各样的数据采集和数据场景,极大地提高了Elastic stack在各种应用场景下的应用能力。
  • Beats是一个轻量级的数据采集agent,部署在数据采集端,所有的beat底层都基于libbeat,并在其基础之上针对各种应用场景实现数据的采集和传输功能。目前除了官方提供的Filebeat,MetricBeat,PacketB eat等之外,还有大量社区贡献的beat,可以适应各种数据采集场景的需要。
  • Kibana是ELK中的数据可视化工具,提供了如Discover(搜索),DashBoard(仪表盘),DevTools(开发工具),Monitoring(监控),MachineLearning(机器学习), SIEM(安全分析),Management(管理)等多种功能,极大地降低了Elasticsearch用户的使用门槛和操作复杂度。

3.2 X-PACK工具包

从5.x开始,Elastic stack将ES的商业功能特性整合到了X-PACK中, 该工具包提供了包括机器学习,规格告警,高级安全特性等在内的众多特性,为使用方提供了更为丰富和专业的功能。

3.3 解决方案

Elastic Stack完善的产品矩阵和活跃的社区,使用ES被广泛应用于各种领域,如搜索,日志,指标,APM,安全,企业搜索等。用户的使用场景和经验反馈,进而促使了Elastic stack在大数据分析平台的基础之上构建一些更完整的,易于上手的解决方案。
如各种beat moudle,用户只需要简单的配置就可以快速地搭建日志或指标采集方案和对应的分析视图。
如APM server和agent,用户只需要根据指引,配置对应server和agent即可快速搭建APM服务。
如SIEM,集成了安全分析的许多功能模块,极大地满足了安全分析的需要。

3.4 Elastic云服务

为了能让用户更方便地使用Elastic Stack的功能,Elastic还提供了托管式云服务。用户只需要通过简单地配置即可快速搭建起Elastic Stack服务,极大地简化了用户的搭建流程。
在国内,Elastic还与腾讯云,阿里云等云厂商合作,提供了Elastic云服务,使得国内用户也能快捷方便地搭建起Elastic服务。

4. 主要功能

Elastic Stack发展至今已拥有丰富的功能

4.1 强大的查询能力

Elasticsearch是一个搜索引擎,而判断一个搜索引擎的优劣,就是看其对查询的支持能力。如下图为Elasticsearch支持的查询功能

基础查询能力上Elasticseach支持精确查询,全文查询,地理位置查询和一些高级查询。
Elasticsearch还支持对这些基础查询进行组合查询,并且可以调整各子查询的权重等
Elasticsearch在聚合层面也提供了强大的支持,不仅支持简单的像SUM, MAX这样的指标查询,还支持分桶查询。另外还支持对其他聚合结果的聚合Pipeline查询。

4.2 丰富的存储类型

Elasticsearch支持包括String(text/keyword), Numeric(long, integer, short ...), Date, Boolean, Binary, Range等多种数据类型,还支持如Nested, join, object, Geo-shape, Sparse vectord等多种数据类型,针对每种数据类型进行了特定的存储和检索优化,以应对不同场景的使用需要

4.3 强大的数据采集和管理能力

  • 数据采集和处理:Elastic Stack的beats和Logstash不仅提供了大量的官方插件,还有大量的社区贡献,可以满足各种场景的数据采集和处理需求。另外Elastic的ingest node 也提供了丰富的数据预处理能力。
  • 快照备份和恢复:支持将部分或全部数据备份到指定数据源,并支持插件开发
  • 索引声明周期管理:用户可以通过配置,使集群可以自动对数据进行roll over, 降冷,关闭或或删除等操作,提高了数据的持续管理能力。

4.4 安全性

Elasticsearch提供了加密通信,基于角色的访问控制,基于属性的访问控制,LDAP,令牌服务等多种安全功能,可以满足用户在安全方面的各种需求。

4.5 监控和告警

Elasticseasrch提供了对Elastic Stack组件的监控及告警能力,极大地方便了用户对Elastic Stack运行状态的了解和对问题的定位修复。
Elasitc提供了Altering功能,用户可以根据业务需要配置规则,实现满足业务需要的规则告警

4.6 机器学习

Elasticsearch当前提供了非监督机器学习功能,该功能当前主要用在异常检测方面。在日志检索,指标,APM,安全分析等领域均有使用。

由于功能太多这里就不一一列举了,详情可以参考:[Elastic Subscription]

5 应用场景

Elasticsearch有着广泛的应用场景,借助其强大的检索能力,其当前主要应用在搜索,日志分析,指标,APM,安全分析等领域。

5.1 搜索

Elasticsearch作为搜索引擎,其对绝大多数类型的搜索功能提供了支持。由于其具有可扩展性好,安全性高,近实时,功能全面等优点,其广泛应用在各种应用搜索,站内搜,企业搜索,代码搜索等场景。

5.2 日志分析

日志分析是Elasticsearch应用最广泛的领域,由于其ELK架构可以实现快速搭建和使用,再加上其强大的检索能力,使得其深受广大运维同学喜爱。

5.3 指标

Elasticsearch5.x开始使用lucene6.0,该版本引入了BKD 树,并对稀疏数据进行了优化,使得数值数据的存储和查询性能得到了很大提升。Elasticsearch也因此得以可以广泛应用于指标监控。

5.4 APM

Elastic Stack提供APM serverh和APM anget,用于帮助用户实现APM功能。APM功能来源于之前的Opbeat。Opbeat是由一个丹麦初创团队研发,该团队主打产品就是APM运维软件。

5.5 安全分析

随着互联网技术的蓬勃发展,安全分析领域开始面临海量数据存储和查询分析问题,Elastic为安全领域提供了从数据采集,数据格式处理,异常检测,可视化分析等一整套解决方案,极大地方便了安全分析在海量数据场景下的进行。在7.x版本的Kibana中甚至直接增加了一个SIEM应用,用于向安全分析领域提供完整的解决方案。

本文对Elasticsearch的发展历程,基本原理,主要功能和应用场景进行了简单总结,希望能帮助大家对Elasticsearch有一个条理清晰的了解。

欢迎关注公众号Elastic慕容,和我一起进入Elastic的奇妙世界吧

继续阅读 »


Elasticsearch作为当前流行的分布式搜索引擎,被广泛应用于日志检索,指标采集,APM,安全分析等领域。本文将对Elastic Stack的发展历程,基本原理,产品生态,主要功能和应用场景进行总结,以帮助大家对Elastic生态的前世今生能有一个清晰的了解。

1. 发展历程

1.1 美好的事物总有一个浪漫的开始

许多年前,一个叫Shay Banon的年轻人想为正在学习厨艺的新婚妻子编写一款菜谱搜索软件。在开发过程中,他发现搜索引擎库Lucene不仅使用门槛高,还有会有许多重复性工作。因此他决定在lucene基础之上封装一个简单易用的搜索应用库,并命名为Compress。Elasticsearch的前身就在这样浪漫的机缘下诞生了。

1.2 分布式为其注入了新的活力

之后shay找到了一份工作,工作内容涉及到大量的高并发分布式场景,于是他决定重写Compress,引入了分布式架构,并更名为Elasticsearch。Elasticsearch的第一个版本发布于2010年5月,发布后公众反响强烈。

1.3 开源力量助其腾飞

Elasticsearch在github上发布后,使用量骤增,并很快有了自己的社区。很快,社区中的 Steven Schuurman、Uri Boness 和 Simon Willnauer 与Shay Banon 一起成立了一家搜索公司Elasticsearch Inc.。
在Elasticsearch Inc.公司成立前后,另外两个开源项目也正在快速发展。一个是Jordan Sissel的开源可插拔数据采集工具Logstash, 另一个是Rashid Khan的开源数据可视化UI Kibana。由于作者间对彼此产品比较熟悉,因此决定合作发展,最终形成了Elastic Stack的经典技术栈ELK: Elasticsearch, Logstash, Kibana

1.4 快速成长

之后Elasticsearch迅速发展,增加了许多新功能和特性 版本 发布日志 重要特性
0.7.0 2010.5.14 github上第一个版本
1.0.0 2014.2.14 备份恢复,聚合,熔断器,docvalues等
2.0.0 2015.10.28 组件版本统一,推出Elastic Cloud等
5.0.0 2016.10.26 商业组件整合为x-pack;使用Lucene6.0引入BKD树,稀疏数据优化等; beat引入module概念; 增加machine learning功能; shrink API; ingest node; painless 脚本等
6.0.0 2017.8.31 稀疏性docvalues支持,index sorting, sequence num, 滚动升级等
7.0.0 2019.4.10 引入新的集群协调层zen2; real内存熔断器等

2018年美东时间10月5日上午 9:30 整,纽约证券交易所的铃声响起,Elastic 成功上市。

2. 基本原理

2.1 最初的想法

Elasticsearch是一个分布式搜索引擎,底层使用Lucene来实现其核心搜索功能。虽然当前Elasticsearch拥有的众多的功能和解决方案,但是其核心仍然是全文检索。

  • 什么是全文检索?
    生活中的数据可以分为结构化数据和非结构化数据。结构化数据是指格式和长度固定的数据,如一个人的年龄,姓名等。非结构化数据是指格式和长度不固定的数据,如一个文章的内容等。
    对于结构化数据,可以存储在DB中通过精确匹配找到。但是对于非结构化数据,一般查询时只能提供查询的局部信息或模糊信息,传统数据库无法根据这些信息进行查询(或者说效率很差)。
  • 如何解决全文检索-倒排索引
    倒排索引时相对于正排索引而言的,如下图是正排索引和倒排索引的对比

    正排索引可以通过id查找到对应的文章,但是无法通过给的部分内容如love,找出含有该关键字的文档。 倒排索引会先对文档进行分析将其拆分成单个Term, 并存储包含该Term的文档id,这样便可以实现通过内容查找对应文档,如包含love的文档为文档1的第二个位置和文档2的第二个位置。倒排索引的逻辑结构如下图:

    当然这样的倒排索引建立起来会导致索引的大小迅速膨胀,lucene对此引入了一个特殊的数据结构叫FST,用于解决这个问题。感兴趣的朋友可以查询资料了解,公众号里后续也会专门介绍该数据结构。

2.2 Elasticsearch的改进

使用倒排索引实现全文检索都是Lucene已经具备的能力,Elasticsearch只是将这个能力封装起来提供给用户使用。那么Elasticsearch在lucene之上做了哪些改进和优化呢? 首先我们先了解一下Lucene中的几个基本概念

  • Index(索引):一类业务数据的集合,类似于传统数据库DB的概念。
  • Document(文档):一条完整的数据记录,json格式,是数据存储和检索的基本单位,类似于传统数据库的一条记录。
  • Field(字段):文档的具体一个属性,类似于传统数据库的列。
  • Term(分词):全文检索特有词汇,在存储文档字段或检索时会先对传入的值进行拆分,使用拆分后的词进行存储和检索。

    2.2.1 分布式设计:

    为了支持对海量数据的存储和查询,Elasticsearch引入分片的概念,一个索引被分成多个分片,每个分片可以有一个主分片和多个副本分片,每个分片副本都是一个具有完整功能的lucene实例,可以独立进行存储和搜索。分片可以分配在不同的节点上,同一个分片的不同副本不能分配在相同的节点上。 在进行读写操作时,ES会根据传入的_routing参数(或mapping中设置的_routing, 如果参数和设置中都没有则默认使用_id), 按照公式shard_num = hash(\routing) % num_primary_shards,计算出文档要所在或要分配到的分片,再从集群元数据中找出对应主分片的位置,将请求路由到该分片进行读写操作。

2.2.2 近实时性-refresh操作

当一个文档写入Lucene后是不能被立即查询到的,Elasticsearch提供了一个refresh操作,会定时地调用lucene的reopen(新版本为openIfChanged)为内存中新写入的数据生成一个新的segment,此时被处理的文档均可以被检索到。refresh操作的时间间隔由refresh_interval参数控制,默认为1s, 当然还可以在写入请求中带上refresh表示写入后立即refresh,另外还可以调用refresh API显式refresh。

2.2.3 数据存储可靠性

  1. 引入translog 当一个文档写入Lucence后是存储在内存中的,即使执行了refresh操作仍然是在文件系统缓存中,如果此时服务器宕机,那么这部分数据将会丢失。为此ES增加了translog, 当进行文档写操作时会先将文档写入Lucene,然后写入一份到translog,写入translog是落盘的(如果对可靠性要求不是很高,也可以设置异步落盘,可以提高性能,由配置index.translog.durabilityindex.translog.sync_interval控制),这样就可以防止服务器宕机后数据的丢失。与传统的分布式系统不同,这里是先写入Lucene再写入translog,原因是写入Lucene可能会失败,为了减少写入失败回滚的复杂度,因此先写入Lucene.
  2. flush操作 另外每30分钟或当translog达到一定大小(由index.translog.flush_threshold_size控制,默认512mb), ES会触发一次flush操作,此时ES会先执行refresh操作将buffer中的数据生成segment,然后调用lucene的commit方法将所有内存中的segment fsync到磁盘。此时lucene中的数据就完成了持久化,会清空translog中的数据(6.x版本为了实现sequenceIDs,不删除translog)
  3. merge操作 由于refresh默认间隔为1s中,因此会产生大量的小segment,为此ES会运行一个任务检测当前磁盘中的segment,对符合条件的segment进行合并操作,减少lucene中的segment个数,提高查询速度,降低负载。不仅如此,merge过程也是文档删除和更新操作后,旧的doc真正被删除的时候。用户还可以手动调用_forcemerge API来主动触发merge,以减少集群的segment个数和清理已删除或更新的文档。
  4. 多副本机制 另外ES有多副本机制,一个分片的主副分片不能分片在同一个节点上,进一步保证数据的可靠性。

2.2.4 部分更新

lucene支持对文档的整体更新,ES为了支持局部更新,在Lucene的Store索引中存储了一个_source字段,该字段的key值是文档ID, 内容是文档的原文。当进行更新操作时先从_source中获取原文,与更新部分合并后,再调用lucene API进行全量更新, 对于写入了ES但是还没有refresh的文档,可以从translog中获取。另外为了防止读取文档过程后执行更新前有其他线程修改了文档,ES增加了版本机制,当执行更新操作时发现当前文档的版本与预期不符,则会重新获取文档再更新。

3 Elastic Stack生态

Elasticsearch相对于其他的搜索引擎最大的优势之一就是完整的产品矩阵和活跃的社区,下图是Elastic Stack的产品矩阵

3.1 Elastic大数据平台

产品矩阵中最核心的部分是Elastic大数据平台,也就是大家所熟知的ELK(现在应该叫ELKB)。其中

  • Elasticsearch是其中的搜索引擎,是整个Elastic Stack的核心所在,它底层使用Lucene,对外提供分布式的高可用,易扩展,近实时的数据存储和检索服务。
  • Logstash是一个数据采集工具。在早期的Elastic Stack中起到数据采集,处理的作用,在新的架构中,数据采集工作交给了更轻量级的beat来完成,Logstash则更多地用在数据汇聚,处理场景下。Logstash提供了200+的插件来支持各种各样的数据采集和数据场景,极大地提高了Elastic stack在各种应用场景下的应用能力。
  • Beats是一个轻量级的数据采集agent,部署在数据采集端,所有的beat底层都基于libbeat,并在其基础之上针对各种应用场景实现数据的采集和传输功能。目前除了官方提供的Filebeat,MetricBeat,PacketB eat等之外,还有大量社区贡献的beat,可以适应各种数据采集场景的需要。
  • Kibana是ELK中的数据可视化工具,提供了如Discover(搜索),DashBoard(仪表盘),DevTools(开发工具),Monitoring(监控),MachineLearning(机器学习), SIEM(安全分析),Management(管理)等多种功能,极大地降低了Elasticsearch用户的使用门槛和操作复杂度。

3.2 X-PACK工具包

从5.x开始,Elastic stack将ES的商业功能特性整合到了X-PACK中, 该工具包提供了包括机器学习,规格告警,高级安全特性等在内的众多特性,为使用方提供了更为丰富和专业的功能。

3.3 解决方案

Elastic Stack完善的产品矩阵和活跃的社区,使用ES被广泛应用于各种领域,如搜索,日志,指标,APM,安全,企业搜索等。用户的使用场景和经验反馈,进而促使了Elastic stack在大数据分析平台的基础之上构建一些更完整的,易于上手的解决方案。
如各种beat moudle,用户只需要简单的配置就可以快速地搭建日志或指标采集方案和对应的分析视图。
如APM server和agent,用户只需要根据指引,配置对应server和agent即可快速搭建APM服务。
如SIEM,集成了安全分析的许多功能模块,极大地满足了安全分析的需要。

3.4 Elastic云服务

为了能让用户更方便地使用Elastic Stack的功能,Elastic还提供了托管式云服务。用户只需要通过简单地配置即可快速搭建起Elastic Stack服务,极大地简化了用户的搭建流程。
在国内,Elastic还与腾讯云,阿里云等云厂商合作,提供了Elastic云服务,使得国内用户也能快捷方便地搭建起Elastic服务。

4. 主要功能

Elastic Stack发展至今已拥有丰富的功能

4.1 强大的查询能力

Elasticsearch是一个搜索引擎,而判断一个搜索引擎的优劣,就是看其对查询的支持能力。如下图为Elasticsearch支持的查询功能

基础查询能力上Elasticseach支持精确查询,全文查询,地理位置查询和一些高级查询。
Elasticsearch还支持对这些基础查询进行组合查询,并且可以调整各子查询的权重等
Elasticsearch在聚合层面也提供了强大的支持,不仅支持简单的像SUM, MAX这样的指标查询,还支持分桶查询。另外还支持对其他聚合结果的聚合Pipeline查询。

4.2 丰富的存储类型

Elasticsearch支持包括String(text/keyword), Numeric(long, integer, short ...), Date, Boolean, Binary, Range等多种数据类型,还支持如Nested, join, object, Geo-shape, Sparse vectord等多种数据类型,针对每种数据类型进行了特定的存储和检索优化,以应对不同场景的使用需要

4.3 强大的数据采集和管理能力

  • 数据采集和处理:Elastic Stack的beats和Logstash不仅提供了大量的官方插件,还有大量的社区贡献,可以满足各种场景的数据采集和处理需求。另外Elastic的ingest node 也提供了丰富的数据预处理能力。
  • 快照备份和恢复:支持将部分或全部数据备份到指定数据源,并支持插件开发
  • 索引声明周期管理:用户可以通过配置,使集群可以自动对数据进行roll over, 降冷,关闭或或删除等操作,提高了数据的持续管理能力。

4.4 安全性

Elasticsearch提供了加密通信,基于角色的访问控制,基于属性的访问控制,LDAP,令牌服务等多种安全功能,可以满足用户在安全方面的各种需求。

4.5 监控和告警

Elasticseasrch提供了对Elastic Stack组件的监控及告警能力,极大地方便了用户对Elastic Stack运行状态的了解和对问题的定位修复。
Elasitc提供了Altering功能,用户可以根据业务需要配置规则,实现满足业务需要的规则告警

4.6 机器学习

Elasticsearch当前提供了非监督机器学习功能,该功能当前主要用在异常检测方面。在日志检索,指标,APM,安全分析等领域均有使用。

由于功能太多这里就不一一列举了,详情可以参考:[Elastic Subscription]

5 应用场景

Elasticsearch有着广泛的应用场景,借助其强大的检索能力,其当前主要应用在搜索,日志分析,指标,APM,安全分析等领域。

5.1 搜索

Elasticsearch作为搜索引擎,其对绝大多数类型的搜索功能提供了支持。由于其具有可扩展性好,安全性高,近实时,功能全面等优点,其广泛应用在各种应用搜索,站内搜,企业搜索,代码搜索等场景。

5.2 日志分析

日志分析是Elasticsearch应用最广泛的领域,由于其ELK架构可以实现快速搭建和使用,再加上其强大的检索能力,使得其深受广大运维同学喜爱。

5.3 指标

Elasticsearch5.x开始使用lucene6.0,该版本引入了BKD 树,并对稀疏数据进行了优化,使得数值数据的存储和查询性能得到了很大提升。Elasticsearch也因此得以可以广泛应用于指标监控。

5.4 APM

Elastic Stack提供APM serverh和APM anget,用于帮助用户实现APM功能。APM功能来源于之前的Opbeat。Opbeat是由一个丹麦初创团队研发,该团队主打产品就是APM运维软件。

5.5 安全分析

随着互联网技术的蓬勃发展,安全分析领域开始面临海量数据存储和查询分析问题,Elastic为安全领域提供了从数据采集,数据格式处理,异常检测,可视化分析等一整套解决方案,极大地方便了安全分析在海量数据场景下的进行。在7.x版本的Kibana中甚至直接增加了一个SIEM应用,用于向安全分析领域提供完整的解决方案。

本文对Elasticsearch的发展历程,基本原理,主要功能和应用场景进行了简单总结,希望能帮助大家对Elasticsearch有一个条理清晰的了解。

欢迎关注公众号Elastic慕容,和我一起进入Elastic的奇妙世界吧

收起阅读 »

2019Elastic中国开发者大会的精彩日程现已上线

请不要错过2019年12月7日在北京举行的Elastic 中国开发者大会 2019 (Elastic Dev Day China 2019),本次活动由 Elastic 官方再一次在中国举办的开发者大会,主要围绕 Elastic 的开源产品: Elasticsearch、Logstash、Kibana 和 Beats等,探讨在搜索、数据实时分析、日志分析、安全等领域的实践与应用。

大会亮点:
  • Elastic 官方在中国组织召开的开发者大会
  • Elastic Stack 7.x 最新功能更新介绍
  • Elastic 官方团队 AMA 展台(Ask Me Anything)
  • 三大主题分会场尽显技术架构、搜索开发和实践应用之美
  • 来自中国互联网头部公司和知名企业的最佳实践干货分享
  • 涵盖搜索数据中台、ELK的容器化和云原生等众多丰富议题
  • 深度剖析大规模搜索生产系统的体系架构、设计演进和平台优化技术



大会日程已经上线:请点击获取大会日程详情!https://www.bagevent.com/event/6072003
 

unnamed_(3).png

unnamed.png

unnamed_(2).png

unnamed_(1).png

 
这是本年度关于ELK、Elasticsearch和企业搜索的最佳盛会;精彩内容岂能错过?座位有限,现在就得动手!

早鸟票还有少量剩余,欢迎前往抢购!

限时提供标准票的9折优惠码,购票时点击“使用优惠或邀请码”,输入:zwsq 即可享受9者优惠!
 

中文社区.png

 
 
关于大会的更多详情请参阅大会官方网站:http://conf.elasticsearch.cn/
任何咨咨询请发邮件到:zheng.liu@elastic.co
 
继续阅读 »
请不要错过2019年12月7日在北京举行的Elastic 中国开发者大会 2019 (Elastic Dev Day China 2019),本次活动由 Elastic 官方再一次在中国举办的开发者大会,主要围绕 Elastic 的开源产品: Elasticsearch、Logstash、Kibana 和 Beats等,探讨在搜索、数据实时分析、日志分析、安全等领域的实践与应用。

大会亮点:
  • Elastic 官方在中国组织召开的开发者大会
  • Elastic Stack 7.x 最新功能更新介绍
  • Elastic 官方团队 AMA 展台(Ask Me Anything)
  • 三大主题分会场尽显技术架构、搜索开发和实践应用之美
  • 来自中国互联网头部公司和知名企业的最佳实践干货分享
  • 涵盖搜索数据中台、ELK的容器化和云原生等众多丰富议题
  • 深度剖析大规模搜索生产系统的体系架构、设计演进和平台优化技术



大会日程已经上线:请点击获取大会日程详情!https://www.bagevent.com/event/6072003
 

unnamed_(3).png

unnamed.png

unnamed_(2).png

unnamed_(1).png

 
这是本年度关于ELK、Elasticsearch和企业搜索的最佳盛会;精彩内容岂能错过?座位有限,现在就得动手!

早鸟票还有少量剩余,欢迎前往抢购!

限时提供标准票的9折优惠码,购票时点击“使用优惠或邀请码”,输入:zwsq 即可享受9者优惠!
 

中文社区.png

 
 
关于大会的更多详情请参阅大会官方网站:http://conf.elasticsearch.cn/
任何咨咨询请发邮件到:zheng.liu@elastic.co
  收起阅读 »

Elastic认证工程师考试经验分享

笔者于2019年10月参加并通过了Elastic Certified Engineer Exam, 在准备考试的三四个月的时间内,对考试的要求,考试的准备,考试的流程等有一些了解,因此总结这篇文章,希望对后续参加考试的朋友有一定的帮助。

1. 考试简介

Elastic Certified Engineer Exam是Elastic官方推出的Elasticsearch使用能力认证考试,通过该考试表明考生具备了通过执行一些列操作构建完整Elasticsearch解决方案的能力,这些操作包括包括集群安装,配置,管理,数据索引,查询,分析等。 详细介绍可以参考[Elastic Certified Engineer]

2. 考察点

认证考试介绍页面中有对考察点有明确的说明,可以参考[Exam Objectives], 考察点主要是Elasticsearch的使用(不考察Elastic stack其他组件如kibana, beat, logstash等的使用),不考察Elasticsearch的实现原理,考察点主要包括:

  • 集群的安装和配置:基本安装,配置,安全配置,角色和用户管理等
  • 索引数据:索引和文档的各种操作
  • 查询:各种查询场景
  • 聚合:各种聚合查询,如指标聚合,分桶聚合,嵌套聚合,pipeline聚合等
  • Mapping和Analzysis: 索引mapping和分词相关操作
  • 集群管理: shard分配,集群健康诊断,备份与恢复,冷热分离,跨集群检索等。

上述只是简单列举,详情以Exam Objectives为准

3. 考试准备

建议参加[Official Elastic Training], 该培训对Elasticsearch的使用会有详细的讲解,并有配套的lab,学习完课程,并认真完成各lab基本就具备了通过考试的能力。
另外要对Elasticsearch官方文档的结构有较为清晰的了解,能快速的查找到相关文档,当然如果能熟练使用kibana文档跳转和文档的搜索功能也可以。
另外还有一些考试通过者的一些经验:

4. 考试报名

  1. 考试购买
    • 注册Elastic Training网站
    • 可以在认证考试页面进行考试报名 按照指示步骤进行操作购买支付即可,考试费用是$400美元,可以使用visa或master信用卡支付
    • 支付完成在注册邮箱和Training网站账号页面的inbox中均会收到两封邮件,一封是订单信息,另一封是考试网站指引 购买成功后考试有一年的有效期,可以在购买后的一年时间内的任意时间预约考试
  2. 考试预约
    • 按照邮件指引注册examlocal 这是一个第三方考试网站,注意注册时使用和注册training网站相同的邮箱
    • 在schedule an Exam页面搜索Elastic Certificate Exam
    • 选择合适的考试时间,注意时区的选择
    • 最后校验会有一个checklist,检测你当前机器是否符合要求 这里要注意
    • 要按照指引为浏览器安装插件
    • 准备VPN,以保证考试时网络没有问题
    • 考试时后台不能有任何进程,如果机器上有默认无法禁用的程序要注意
    • 电脑要带摄像头和麦克风

5. 考试环境和流程

  1. 考试环境
    考试环境是一个通过浏览器连接的远程centos系统,通过terminal连接考试的各集群服务器,通过系统内浏览器来查看官方文档和作答考卷。关于环境的讲解可以查看官方讲解视频,考试环境和讲解中完全一致
  2. 考试流程
    考试开始前15分钟,考生通过考试网站指引进入考试系统,此时考官便可以通过摄像头和麦克风看到听到你,但是你是看不到听不到考官的,考官会通过一个聊天窗口与你打字沟通。
    考官会要求你先出示你的证件,注意这里一定要使用护照等带有拼音的证件,毕竟外国人不认识中文,如果没有此类证件,想要使用身份证,需要提前写邮件给Elasitc申请。
    接着考官会要求你抱着电脑环视周围,查看桌面上是否有任何物品,如果有物品如护照等,会被要求拿走放到其他地方。
    接着考官会要求你打开你电脑的任务管理器,查看是否有除去浏览器的其他进程。
    上述检查均通过后,便可以开始考试,考试时间是3个小时,考题也都是常规的一些集群使用相关的知识点,没有偏题怪题。考前看其他人的经验大概90分钟完成,我也基本在这个时间点完成。
    考试过程中可以向考官申请中途休息和喝水,考官会暂停考试。建议做完第一遍后进行检查,可能会发现一些细节问题,如单节点集群考试创建的索引默认一副本会导致集群yellow等。

6. 考题回顾

正式进入考题前会有一个考题作答讲解和集群情况描述,我的环境是三个集群,第一个是三节点,另外两个都是一节点,每个集群都带有一个kibana。 我的考题共10道,我这里只对考题考点做简单描述:

  1. 冷热分离架构配置
  2. update_by_query + script按照要求更新索引
  3. 自定义分词插件,让king's和kings有相同的评分
  4. nested类型和nested query
  5. dynamic mapping
  6. multi-match, boost, most_fields
  7. date-histogram, sub-aggregation
  8. 开启security
  9. 集群备份snapshot
  10. match_phrase, hightlighting, sort

7. 考试结果

考试成绩会在三个工作日内公布,但实际一般一个工作日就会出结果。如果通过考试会收到一封考试通过的邮件,如下
按照邮件指引便可以得到一个电子证书,如下图

最后分享一下从大洋彼岸寄过来的纪念币

最后祝大家考试顺利(●'◡'●)

欢迎关注公众号Elastic慕容,和我一起进入Elastic的奇妙世界吧

继续阅读 »

笔者于2019年10月参加并通过了Elastic Certified Engineer Exam, 在准备考试的三四个月的时间内,对考试的要求,考试的准备,考试的流程等有一些了解,因此总结这篇文章,希望对后续参加考试的朋友有一定的帮助。

1. 考试简介

Elastic Certified Engineer Exam是Elastic官方推出的Elasticsearch使用能力认证考试,通过该考试表明考生具备了通过执行一些列操作构建完整Elasticsearch解决方案的能力,这些操作包括包括集群安装,配置,管理,数据索引,查询,分析等。 详细介绍可以参考[Elastic Certified Engineer]

2. 考察点

认证考试介绍页面中有对考察点有明确的说明,可以参考[Exam Objectives], 考察点主要是Elasticsearch的使用(不考察Elastic stack其他组件如kibana, beat, logstash等的使用),不考察Elasticsearch的实现原理,考察点主要包括:

  • 集群的安装和配置:基本安装,配置,安全配置,角色和用户管理等
  • 索引数据:索引和文档的各种操作
  • 查询:各种查询场景
  • 聚合:各种聚合查询,如指标聚合,分桶聚合,嵌套聚合,pipeline聚合等
  • Mapping和Analzysis: 索引mapping和分词相关操作
  • 集群管理: shard分配,集群健康诊断,备份与恢复,冷热分离,跨集群检索等。

上述只是简单列举,详情以Exam Objectives为准

3. 考试准备

建议参加[Official Elastic Training], 该培训对Elasticsearch的使用会有详细的讲解,并有配套的lab,学习完课程,并认真完成各lab基本就具备了通过考试的能力。
另外要对Elasticsearch官方文档的结构有较为清晰的了解,能快速的查找到相关文档,当然如果能熟练使用kibana文档跳转和文档的搜索功能也可以。
另外还有一些考试通过者的一些经验:

4. 考试报名

  1. 考试购买
    • 注册Elastic Training网站
    • 可以在认证考试页面进行考试报名 按照指示步骤进行操作购买支付即可,考试费用是$400美元,可以使用visa或master信用卡支付
    • 支付完成在注册邮箱和Training网站账号页面的inbox中均会收到两封邮件,一封是订单信息,另一封是考试网站指引 购买成功后考试有一年的有效期,可以在购买后的一年时间内的任意时间预约考试
  2. 考试预约
    • 按照邮件指引注册examlocal 这是一个第三方考试网站,注意注册时使用和注册training网站相同的邮箱
    • 在schedule an Exam页面搜索Elastic Certificate Exam
    • 选择合适的考试时间,注意时区的选择
    • 最后校验会有一个checklist,检测你当前机器是否符合要求 这里要注意
    • 要按照指引为浏览器安装插件
    • 准备VPN,以保证考试时网络没有问题
    • 考试时后台不能有任何进程,如果机器上有默认无法禁用的程序要注意
    • 电脑要带摄像头和麦克风

5. 考试环境和流程

  1. 考试环境
    考试环境是一个通过浏览器连接的远程centos系统,通过terminal连接考试的各集群服务器,通过系统内浏览器来查看官方文档和作答考卷。关于环境的讲解可以查看官方讲解视频,考试环境和讲解中完全一致
  2. 考试流程
    考试开始前15分钟,考生通过考试网站指引进入考试系统,此时考官便可以通过摄像头和麦克风看到听到你,但是你是看不到听不到考官的,考官会通过一个聊天窗口与你打字沟通。
    考官会要求你先出示你的证件,注意这里一定要使用护照等带有拼音的证件,毕竟外国人不认识中文,如果没有此类证件,想要使用身份证,需要提前写邮件给Elasitc申请。
    接着考官会要求你抱着电脑环视周围,查看桌面上是否有任何物品,如果有物品如护照等,会被要求拿走放到其他地方。
    接着考官会要求你打开你电脑的任务管理器,查看是否有除去浏览器的其他进程。
    上述检查均通过后,便可以开始考试,考试时间是3个小时,考题也都是常规的一些集群使用相关的知识点,没有偏题怪题。考前看其他人的经验大概90分钟完成,我也基本在这个时间点完成。
    考试过程中可以向考官申请中途休息和喝水,考官会暂停考试。建议做完第一遍后进行检查,可能会发现一些细节问题,如单节点集群考试创建的索引默认一副本会导致集群yellow等。

6. 考题回顾

正式进入考题前会有一个考题作答讲解和集群情况描述,我的环境是三个集群,第一个是三节点,另外两个都是一节点,每个集群都带有一个kibana。 我的考题共10道,我这里只对考题考点做简单描述:

  1. 冷热分离架构配置
  2. update_by_query + script按照要求更新索引
  3. 自定义分词插件,让king's和kings有相同的评分
  4. nested类型和nested query
  5. dynamic mapping
  6. multi-match, boost, most_fields
  7. date-histogram, sub-aggregation
  8. 开启security
  9. 集群备份snapshot
  10. match_phrase, hightlighting, sort

7. 考试结果

考试成绩会在三个工作日内公布,但实际一般一个工作日就会出结果。如果通过考试会收到一封考试通过的邮件,如下
按照邮件指引便可以得到一个电子证书,如下图

最后分享一下从大洋彼岸寄过来的纪念币

最后祝大家考试顺利(●'◡'●)

欢迎关注公众号Elastic慕容,和我一起进入Elastic的奇妙世界吧

收起阅读 »

【腾讯 - 深圳】Elasticsearch高级研发工程师

腾讯Elasticsearch团队负责支持腾讯云Elasticsearch产品及公司内部海量业务,我们的目标是建设高可用、高性能、低成本的Elasticsearch服务。我们正在持续招聘,级别不限,腾讯的薪资福利待遇丰厚,详细招聘信息如下:

Elasticsearch高级研发工程师【腾讯 - 深圳】 
岗位职责:
负责腾讯云Elasticsearch内核的架构优化、新特性开发;
负责预研分布式存储系统、NoSQL等相关技术,推动Elasticsearch技术发展;
负责腾讯云Elasticsearch产品的运营建设、日常维护;

职位要求:
1. 本科及以上学历,计算机、软件等相关专业;
2. 编程能力扎实,熟悉Java/C++中的一种,具有良好的数据结构、算法、操作系统等计算机基本知识;
3. 熟悉ElasticSearch/Lucene开源系统,有实际开发经验者优先;
4. 熟悉Hadoop、HBase、InfluxDB等开源系统,有云计算相关开发经验者优先;
5. 对新技术敏感,追求卓越,能快速学习并具备较强的技术领悟能力;
 
欢迎加入我们,一起探索Elasticsearch!大家可通过以下方式联系我们 或 投递简历:
邮件:johngqjiang@tencent.com
微信:jgq2008303393
 
 
继续阅读 »
腾讯Elasticsearch团队负责支持腾讯云Elasticsearch产品及公司内部海量业务,我们的目标是建设高可用、高性能、低成本的Elasticsearch服务。我们正在持续招聘,级别不限,腾讯的薪资福利待遇丰厚,详细招聘信息如下:

Elasticsearch高级研发工程师【腾讯 - 深圳】 
岗位职责:
负责腾讯云Elasticsearch内核的架构优化、新特性开发;
负责预研分布式存储系统、NoSQL等相关技术,推动Elasticsearch技术发展;
负责腾讯云Elasticsearch产品的运营建设、日常维护;

职位要求:
1. 本科及以上学历,计算机、软件等相关专业;
2. 编程能力扎实,熟悉Java/C++中的一种,具有良好的数据结构、算法、操作系统等计算机基本知识;
3. 熟悉ElasticSearch/Lucene开源系统,有实际开发经验者优先;
4. 熟悉Hadoop、HBase、InfluxDB等开源系统,有云计算相关开发经验者优先;
5. 对新技术敏感,追求卓越,能快速学习并具备较强的技术领悟能力;
 
欢迎加入我们,一起探索Elasticsearch!大家可通过以下方式联系我们 或 投递简历:
邮件:johngqjiang@tencent.com
微信:jgq2008303393
 
  收起阅读 »

Elastic Stack 安全功能免费啦!

6.8 和7.1开始,安全功能免费啦,
这意味着用户现在可以加密网络流量,创建和管理用户,定义保护索引和群集级别访问的角色,并使用Spaces完全保护Kibana
6.8 和7.1开始,安全功能免费啦,
这意味着用户现在可以加密网络流量,创建和管理用户,定义保护索引和群集级别访问的角色,并使用Spaces完全保护Kibana

搭建Elasitc stack集群需要注意的日志问题

@[toc] 搭建Elasitc stack集群时,我们往往把大部分注意力放在集群的搭建,索引的优化,分片的设置上等具体的调优参数上,很少有人会去关心Elasitc stack的日志配置的问题,大概是觉得,日志应该是一个公共的问题,默认的配置应该已经为我们处理好了。但很不幸,在不同的机器配置或者不同的运营策略下,如果采用默认的配置,会给我们带来麻烦。

默认配置带来的麻烦

以下例子是默认情况下,当Elasitc stack集群运行超过3个月之后的情况:

elasticsearch

elasticsearch默认情况下会每天rolling一个文件,当到达2G的时候,才开始清除超出的部分,当一个文件只有几十K的时候,文件会一直累计下来。

20181210163659128.png

logstash

一直增长的gc文件和不停增多的rolling日志文件

20181210164358500.png

kibana

默认日志输出到kibana.out文件当中,这个文件会变得越来越大

20181210163521285.png

kafka

这里提到kafka是因为在大部分的架构当中,我们都会用到kafka作为中间件数据缓冲区,因此不得不维护kafka集群。同样,如果不做特定的配置,也会遇到日志的问题:不停增多的rolling日志文件

20181210164731512.png

原因是kafka的默认log4j配置是使用DailyRollingFileAppender每隔一个小时生成一个文件 '.'yyyy-MM-dd-HH

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.kafkaAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.kafkaAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.kafkaAppender.File=${kafka.logs.dir}/server.log
log4j.appender.kafkaAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.kafkaAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.stateChangeAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.stateChangeAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.stateChangeAppender.File=${kafka.logs.dir}/state-change.log
log4j.appender.stateChangeAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.stateChangeAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.requestAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.requestAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.requestAppender.File=${kafka.logs.dir}/kafka-request.log
log4j.appender.requestAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.requestAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.cleanerAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.cleanerAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.cleanerAppender.File=${kafka.logs.dir}/log-cleaner.log
log4j.appender.cleanerAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.cleanerAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.controllerAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.controllerAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.controllerAppender.File=${kafka.logs.dir}/controller.log
log4j.appender.controllerAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.controllerAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.authorizerAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.authorizerAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.authorizerAppender.File=${kafka.logs.dir}/kafka-authorizer.log
log4j.appender.authorizerAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.authorizerAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

解决方案

因此,对于我们需要维护的这几个组件,需要配置合理的日志rotate策略。一个比较常用的策略就是时间+size,每天rotate一个日志文件或者每当日志文件大小超过256M,rotate一个新的日志文件,并且最多保留7天之内的日志文件。

elasticsearch 

通过修改log4j2.properties文件来解决。该文件在/etc/elasticsesarch目录下(或者config目录)。 默认配置是:

appender.rolling.type = RollingFile 
appender.rolling.name = rolling
appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log 
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %.-10000m%n
appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.log.gz 
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy 
appender.rolling.policies.time.interval = 1 
appender.rolling.policies.time.modulate = true 
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy 
appender.rolling.policies.size.size = 256MB 
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.fileIndex = nomax
appender.rolling.strategy.action.type = Delete 
appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path}
appender.rolling.strategy.action.condition.type = IfFileName 
appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-* 
appender.rolling.strategy.action.condition.nested_condition.type = IfAccumulatedFileSize 
appender.rolling.strategy.action.condition.nested_condition.exceeds = 2GB 

以上默认配置,会保存2GB的日志,只有累计的日志大小超过2GB的时候,才会删除旧的日志文件。 建议改为如下配置,仅保留最近7天的日志

appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.action.type = Delete
appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path}
appender.rolling.strategy.action.condition.type = IfFileName
appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-*
appender.rolling.strategy.action.condition.nested_condition.type = IfLastModified
appender.rolling.strategy.action.condition.nested_condition.age = 7D

这里必须注意,log4j2会因为末尾的空格导致无法识别配置

logstash

与elasticsearch类似,通过修改log4j2.properties文件来解决。该文件在/etc/logstash目录下(或者config目录)。 默认配置是不会删除历史日志的:

status = error
name = LogstashPropertiesConfig

appender.console.type = Console
appender.console.name = plain_console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %m%n

appender.json_console.type = Console
appender.json_console.name = json_console
appender.json_console.layout.type = JSONLayout
appender.json_console.layout.compact = true
appender.json_console.layout.eventEol = true

appender.rolling.type = RollingFile
appender.rolling.name = plain_rolling
appender.rolling.fileName = ${sys:ls.logs}/logstash-${sys:ls.log.format}.log
appender.rolling.filePattern = ${sys:ls.logs}/logstash-${sys:ls.log.format}-%d{yyyy-MM-dd}.log
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %-.10000m%n

需手动加上:

appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.action.type = Delete
appender.rolling.strategy.action.basepath = ${sys:ls.logs}
appender.rolling.strategy.action.condition.type = IfFileName
appender.rolling.strategy.action.condition.glob = ${sys:ls.logs}/logstash-${sys:ls.log.format}
appender.rolling.strategy.action.condition.nested_condition.type = IfLastModified
appender.rolling.strategy.action.condition.nested_condition.age = 7D

kibana

在kibana的配置文件中,只有以下几个选项:

logging.dest:
Default: stdout Enables you specify a file where Kibana stores log output.
logging.quiet:
Default: false Set the value of this setting to true to suppress all logging output other than error messages.
logging.silent:
Default: false Set the value of this setting to true to suppress all logging output.
logging.verbose:
Default: false Set the value of this setting to true to log all events, including system usage information and all requests. Supported on Elastic Cloud Enterprise.
logging.timezone
Default: UTC Set to the canonical timezone id (e.g. US/Pacific) to log events using that timezone. A list of timezones can be referenced at https://en.wikipedia.org/wiki/List_of_tz_database_time_zones.

我们可以指定输出的日志文件与日志内容,但是却不可以配置日志的rotate。这时,我们需要使用logrotate,这个linux默认安装的工具。 首先,我们要在配置文件里面指定生成pid文件:

pid.file: "pid.log"

然后,修改/etc/logrotate.conf:

/var/log/kibana {
    missingok
    notifempty
    sharedscripts
    daily
    rotate 7
    copytruncate
    /bin/kill -HUP $(cat /usr/share/kibana/pid.log 2>/dev/null) 2>/dev/null
    endscript
}

kafka

如果不想写脚本清理过多的文件的话,需要修改config/log4j.properties文件。使用RollingFileAppender代替DailyRollingFileAppender,同时设置MaxFileSizeMaxBackupIndex。即修改为:

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

log4j.rootLogger=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.kafkaAppender=org.apache.log4j.RollingFileAppender
log4j.appender.kafkaAppender.File=${kafka.logs.dir}/server.log
log4j.appender.kafkaAppender.MaxFileSize=10MB
log4j.appender.kafkaAppender.MaxBackupIndex=10
log4j.appender.kafkaAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.kafkaAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.stateChangeAppender=org.apache.log4j.RollingFileAppender
log4j.appender.stateChangeAppender.File=${kafka.logs.dir}/state-change.log
log4j.appender.stateChangeAppender.MaxFileSize=10M
log4j.appender.stateChangeAppender.MaxBackupIndex=10
log4j.appender.stateChangeAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.stateChangeAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.requestAppender=org.apache.log4j.RollingFileAppender
log4j.appender.requestAppender.File=${kafka.logs.dir}/kafka-request.log
log4j.appender.requestAppender.MaxFileSize=10MB
log4j.appender.requestAppender.MaxBackupIndex=10
log4j.appender.requestAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.requestAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.cleanerAppender=org.apache.log4j.RollingFileAppender
log4j.appender.cleanerAppender.File=${kafka.logs.dir}/log-cleaner.log
log4j.appender.cleanerAppender.MaxFileSize=10MB
log4j.appender.cleanerAppender.MaxBackupIndex=10
log4j.appender.cleanerAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.cleanerAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.controllerAppender=org.apache.log4j.RollingFileAppender
log4j.appender.controllerAppender.File=${kafka.logs.dir}/controller.log
log4j.appender.controllerAppender.MaxFileSize=10MB
log4j.appender.controllerAppender.MaxBackupIndex=10
log4j.appender.controllerAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.controllerAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.authorizerAppender=org.apache.log4j.RollingFileAppender
log4j.appender.authorizerAppender.File=${kafka.logs.dir}/kafka-authorizer.log
log4j.appender.authorizerAppender.MaxFileSize=10MB
log4j.appender.authorizerAppender.MaxBackupIndex=10
log4j.appender.authorizerAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.authorizerAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

# Turn on all our debugging info
#log4j.logger.kafka.producer.async.DefaultEventHandler=DEBUG, kafkaAppender
#log4j.logger.kafka.client.ClientUtils=DEBUG, kafkaAppender
#log4j.logger.kafka.perf=DEBUG, kafkaAppender
#log4j.logger.kafka.perf.ProducerPerformance$ProducerThread=DEBUG, kafkaAppender
#log4j.logger.org.I0Itec.zkclient.ZkClient=DEBUG
log4j.logger.kafka=INFO, kafkaAppender

log4j.logger.kafka.network.RequestChannel$=WARN, requestAppender
log4j.additivity.kafka.network.RequestChannel$=false

#log4j.logger.kafka.network.Processor=TRACE, requestAppender
#log4j.logger.kafka.server.KafkaApis=TRACE, requestAppender
#log4j.additivity.kafka.server.KafkaApis=false
log4j.logger.kafka.request.logger=WARN, requestAppender
log4j.additivity.kafka.request.logger=false

log4j.logger.kafka.controller=TRACE, controllerAppender
log4j.additivity.kafka.controller=false

log4j.logger.kafka.log.LogCleaner=INFO, cleanerAppender
log4j.additivity.kafka.log.LogCleaner=false

log4j.logger.state.change.logger=TRACE, stateChangeAppender
log4j.additivity.state.change.logger=false

#Change this to debug to get the actual audit log for authorizer.
log4j.logger.kafka.authorizer.logger=WARN, authorizerAppender
log4j.additivity.kafka.authorizer.logger=false
继续阅读 »

@[toc] 搭建Elasitc stack集群时,我们往往把大部分注意力放在集群的搭建,索引的优化,分片的设置上等具体的调优参数上,很少有人会去关心Elasitc stack的日志配置的问题,大概是觉得,日志应该是一个公共的问题,默认的配置应该已经为我们处理好了。但很不幸,在不同的机器配置或者不同的运营策略下,如果采用默认的配置,会给我们带来麻烦。

默认配置带来的麻烦

以下例子是默认情况下,当Elasitc stack集群运行超过3个月之后的情况:

elasticsearch

elasticsearch默认情况下会每天rolling一个文件,当到达2G的时候,才开始清除超出的部分,当一个文件只有几十K的时候,文件会一直累计下来。

20181210163659128.png

logstash

一直增长的gc文件和不停增多的rolling日志文件

20181210164358500.png

kibana

默认日志输出到kibana.out文件当中,这个文件会变得越来越大

20181210163521285.png

kafka

这里提到kafka是因为在大部分的架构当中,我们都会用到kafka作为中间件数据缓冲区,因此不得不维护kafka集群。同样,如果不做特定的配置,也会遇到日志的问题:不停增多的rolling日志文件

20181210164731512.png

原因是kafka的默认log4j配置是使用DailyRollingFileAppender每隔一个小时生成一个文件 '.'yyyy-MM-dd-HH

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.kafkaAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.kafkaAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.kafkaAppender.File=${kafka.logs.dir}/server.log
log4j.appender.kafkaAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.kafkaAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.stateChangeAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.stateChangeAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.stateChangeAppender.File=${kafka.logs.dir}/state-change.log
log4j.appender.stateChangeAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.stateChangeAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.requestAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.requestAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.requestAppender.File=${kafka.logs.dir}/kafka-request.log
log4j.appender.requestAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.requestAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.cleanerAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.cleanerAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.cleanerAppender.File=${kafka.logs.dir}/log-cleaner.log
log4j.appender.cleanerAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.cleanerAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.controllerAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.controllerAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.controllerAppender.File=${kafka.logs.dir}/controller.log
log4j.appender.controllerAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.controllerAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.authorizerAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.authorizerAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.authorizerAppender.File=${kafka.logs.dir}/kafka-authorizer.log
log4j.appender.authorizerAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.authorizerAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

解决方案

因此,对于我们需要维护的这几个组件,需要配置合理的日志rotate策略。一个比较常用的策略就是时间+size,每天rotate一个日志文件或者每当日志文件大小超过256M,rotate一个新的日志文件,并且最多保留7天之内的日志文件。

elasticsearch 

通过修改log4j2.properties文件来解决。该文件在/etc/elasticsesarch目录下(或者config目录)。 默认配置是:

appender.rolling.type = RollingFile 
appender.rolling.name = rolling
appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log 
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %.-10000m%n
appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.log.gz 
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy 
appender.rolling.policies.time.interval = 1 
appender.rolling.policies.time.modulate = true 
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy 
appender.rolling.policies.size.size = 256MB 
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.fileIndex = nomax
appender.rolling.strategy.action.type = Delete 
appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path}
appender.rolling.strategy.action.condition.type = IfFileName 
appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-* 
appender.rolling.strategy.action.condition.nested_condition.type = IfAccumulatedFileSize 
appender.rolling.strategy.action.condition.nested_condition.exceeds = 2GB 

以上默认配置,会保存2GB的日志,只有累计的日志大小超过2GB的时候,才会删除旧的日志文件。 建议改为如下配置,仅保留最近7天的日志

appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.action.type = Delete
appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path}
appender.rolling.strategy.action.condition.type = IfFileName
appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-*
appender.rolling.strategy.action.condition.nested_condition.type = IfLastModified
appender.rolling.strategy.action.condition.nested_condition.age = 7D

这里必须注意,log4j2会因为末尾的空格导致无法识别配置

logstash

与elasticsearch类似,通过修改log4j2.properties文件来解决。该文件在/etc/logstash目录下(或者config目录)。 默认配置是不会删除历史日志的:

status = error
name = LogstashPropertiesConfig

appender.console.type = Console
appender.console.name = plain_console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %m%n

appender.json_console.type = Console
appender.json_console.name = json_console
appender.json_console.layout.type = JSONLayout
appender.json_console.layout.compact = true
appender.json_console.layout.eventEol = true

appender.rolling.type = RollingFile
appender.rolling.name = plain_rolling
appender.rolling.fileName = ${sys:ls.logs}/logstash-${sys:ls.log.format}.log
appender.rolling.filePattern = ${sys:ls.logs}/logstash-${sys:ls.log.format}-%d{yyyy-MM-dd}.log
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %-.10000m%n

需手动加上:

appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.action.type = Delete
appender.rolling.strategy.action.basepath = ${sys:ls.logs}
appender.rolling.strategy.action.condition.type = IfFileName
appender.rolling.strategy.action.condition.glob = ${sys:ls.logs}/logstash-${sys:ls.log.format}
appender.rolling.strategy.action.condition.nested_condition.type = IfLastModified
appender.rolling.strategy.action.condition.nested_condition.age = 7D

kibana

在kibana的配置文件中,只有以下几个选项:

logging.dest:
Default: stdout Enables you specify a file where Kibana stores log output.
logging.quiet:
Default: false Set the value of this setting to true to suppress all logging output other than error messages.
logging.silent:
Default: false Set the value of this setting to true to suppress all logging output.
logging.verbose:
Default: false Set the value of this setting to true to log all events, including system usage information and all requests. Supported on Elastic Cloud Enterprise.
logging.timezone
Default: UTC Set to the canonical timezone id (e.g. US/Pacific) to log events using that timezone. A list of timezones can be referenced at https://en.wikipedia.org/wiki/List_of_tz_database_time_zones.

我们可以指定输出的日志文件与日志内容,但是却不可以配置日志的rotate。这时,我们需要使用logrotate,这个linux默认安装的工具。 首先,我们要在配置文件里面指定生成pid文件:

pid.file: "pid.log"

然后,修改/etc/logrotate.conf:

/var/log/kibana {
    missingok
    notifempty
    sharedscripts
    daily
    rotate 7
    copytruncate
    /bin/kill -HUP $(cat /usr/share/kibana/pid.log 2>/dev/null) 2>/dev/null
    endscript
}

kafka

如果不想写脚本清理过多的文件的话,需要修改config/log4j.properties文件。使用RollingFileAppender代替DailyRollingFileAppender,同时设置MaxFileSizeMaxBackupIndex。即修改为:

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

log4j.rootLogger=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.kafkaAppender=org.apache.log4j.RollingFileAppender
log4j.appender.kafkaAppender.File=${kafka.logs.dir}/server.log
log4j.appender.kafkaAppender.MaxFileSize=10MB
log4j.appender.kafkaAppender.MaxBackupIndex=10
log4j.appender.kafkaAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.kafkaAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.stateChangeAppender=org.apache.log4j.RollingFileAppender
log4j.appender.stateChangeAppender.File=${kafka.logs.dir}/state-change.log
log4j.appender.stateChangeAppender.MaxFileSize=10M
log4j.appender.stateChangeAppender.MaxBackupIndex=10
log4j.appender.stateChangeAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.stateChangeAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.requestAppender=org.apache.log4j.RollingFileAppender
log4j.appender.requestAppender.File=${kafka.logs.dir}/kafka-request.log
log4j.appender.requestAppender.MaxFileSize=10MB
log4j.appender.requestAppender.MaxBackupIndex=10
log4j.appender.requestAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.requestAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.cleanerAppender=org.apache.log4j.RollingFileAppender
log4j.appender.cleanerAppender.File=${kafka.logs.dir}/log-cleaner.log
log4j.appender.cleanerAppender.MaxFileSize=10MB
log4j.appender.cleanerAppender.MaxBackupIndex=10
log4j.appender.cleanerAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.cleanerAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.controllerAppender=org.apache.log4j.RollingFileAppender
log4j.appender.controllerAppender.File=${kafka.logs.dir}/controller.log
log4j.appender.controllerAppender.MaxFileSize=10MB
log4j.appender.controllerAppender.MaxBackupIndex=10
log4j.appender.controllerAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.controllerAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

log4j.appender.authorizerAppender=org.apache.log4j.RollingFileAppender
log4j.appender.authorizerAppender.File=${kafka.logs.dir}/kafka-authorizer.log
log4j.appender.authorizerAppender.MaxFileSize=10MB
log4j.appender.authorizerAppender.MaxBackupIndex=10
log4j.appender.authorizerAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.authorizerAppender.layout.ConversionPattern=[%d] %p %m (%c)%n

# Turn on all our debugging info
#log4j.logger.kafka.producer.async.DefaultEventHandler=DEBUG, kafkaAppender
#log4j.logger.kafka.client.ClientUtils=DEBUG, kafkaAppender
#log4j.logger.kafka.perf=DEBUG, kafkaAppender
#log4j.logger.kafka.perf.ProducerPerformance$ProducerThread=DEBUG, kafkaAppender
#log4j.logger.org.I0Itec.zkclient.ZkClient=DEBUG
log4j.logger.kafka=INFO, kafkaAppender

log4j.logger.kafka.network.RequestChannel$=WARN, requestAppender
log4j.additivity.kafka.network.RequestChannel$=false

#log4j.logger.kafka.network.Processor=TRACE, requestAppender
#log4j.logger.kafka.server.KafkaApis=TRACE, requestAppender
#log4j.additivity.kafka.server.KafkaApis=false
log4j.logger.kafka.request.logger=WARN, requestAppender
log4j.additivity.kafka.request.logger=false

log4j.logger.kafka.controller=TRACE, controllerAppender
log4j.additivity.kafka.controller=false

log4j.logger.kafka.log.LogCleaner=INFO, cleanerAppender
log4j.additivity.kafka.log.LogCleaner=false

log4j.logger.state.change.logger=TRACE, stateChangeAppender
log4j.additivity.state.change.logger=false

#Change this to debug to get the actual audit log for authorizer.
log4j.logger.kafka.authorizer.logger=WARN, authorizerAppender
log4j.additivity.kafka.authorizer.logger=false
收起阅读 »

社区邮件服务器已恢复

社区最近迁移到了阿里巴巴的服务器,默认屏蔽了25端口,并且申请也不给开,所以一段时间以来,大家的邮件都不能正常收到,不过经过两天努力,最终还是想办法解决了。🎉
新注册的用户可以重新发送确认邮件。🎤
 
最后,为 Elastic 开发者大会打个 call,阔别2年的大会今年回来了,众多精彩的分享,不管您是 Elasticsearch 初学者还是资深的用户,都不要错过哦, 最后,送上 8 折优惠码一张:F183f3d 。
继续阅读 »
社区最近迁移到了阿里巴巴的服务器,默认屏蔽了25端口,并且申请也不给开,所以一段时间以来,大家的邮件都不能正常收到,不过经过两天努力,最终还是想办法解决了。🎉
新注册的用户可以重新发送确认邮件。🎤
 
最后,为 Elastic 开发者大会打个 call,阔别2年的大会今年回来了,众多精彩的分享,不管您是 Elasticsearch 初学者还是资深的用户,都不要错过哦, 最后,送上 8 折优惠码一张:F183f3d 。 收起阅读 »

社区支持 Markdown 编辑器

为了改善大家的创作体验,提高大家的写作和分享热情!😁,经过两天的不懈奋斗,终于把 Markdown 编辑器搬上来了。 目前只支持文章的发布,可以通过切换编辑器来选择 Markdown 编辑模式。 希望不要再以编辑器作为理由发只有链接的文章了。 😁😁😎😎😎😎😁😁😀😀😀

  • 支持 Github 风格的 Markdown 格式
  • 支持本站附件功能
  • 支持 emoj 符号
  • 支持自动的页面导航
  • 以前的文章可再次编辑,切换 Markdown 模式然后修改保存

如何使用?

  1. 点击【发起】,选择文章
  2. 切换绿色按钮,将编辑器切换到 Markdown,然后在文本框内输入 Markdown 格式的内容即可。

在线 Markdown 脚本编辑预览工具:https://elasticsearch.cn/static/js/editor/markdown/


以下为样式测试参考,忽略其意义。

1510307393004.jpg

----------- 常用格式-----------------


# 标题1
## 标题2
### 标题3
#### 标题4
##### 标题5
###### 标题6
超大标题   //等于号写于文字下方
===
标题      //同超大标题
---

`短代码`
_ 注:长代码块,用三个: `  _

> This is the first level of quoting.
>
> > This is nested blockquote.
>
> Back to the first level.

* Red
* Green
* Blue

- Red
- Green
- Blue

+ Red
+ Green
+ Blue

1. 这是第一个
1. 这是第二个
1. 这是第三个

* * *
***
*****
- - -
---

[markdown-syntax](http://daringfireball.net/projects/markdown/syntax)

[id]: http://example.com/  "Optional Title Here"
This is [an example][id] reference-style link.

*内容*
**内容**
_内容_
__内容__

![这是张外链图片](https://static-www.elastic.co/assets/bltbfcd44f1256d8c88/blog-swifttype-thumb.jpg?q=845)

<http://elastic.co/>

<info@elastic.o>

    四个空格
    一个tab

----------- 样式预览-----------------

标题1

标题2

标题3

标题4

标题5
标题6

超大标题 //等于号写于文字下方

标题 //同超大标题

短代码

This is the first level of quoting.

This is nested blockquote.

Back to the first level.

  • Red
  • Green
  • Blue

  • Red
  • Green
  • Blue

  • Red
  • Green
  • Blue
  1. 这是第一个
  2. 这是第二个
  3. 这是第三个





markdown-syntax

This is an example reference-style link.

内容 内容 内容 内容

这是张外链图片

http://elastic.co/

info@elastic.o

四个空格
一个tab

https://github.com/infinitbyte/gopa 的 README 内容


What a Spider!

GOPA, A Spider Written in Go.

Travis Go Report Card Coverage Status Join the chat at https://gitter.im/infinitbyte/gopa

Goal

  • Light weight, low footprint, memory requirement should < 100MB
  • Easy to deploy, no runtime or dependency required
  • Easy to use, no programming or scripts ability needed, out of box features

Screenshoot

What a Spider! GOPA Spider!

How to use

Setup

First of all, get it, two opinions: download the pre-built package or compile it yourself.

Download Pre Built Package

Go to Release or Snapshot page, download the right package for your platform.

Note: Darwin is for Mac

Compile The Package Manually

So far, we have:

gopa, the main program, a single binary.
config/, elasticsearch related scripts etc.
gopa.yml, main configuration for gopa.

Optional Config

By default, Gopa works well except indexing, if you want to use elasticsearch as indexing, follow these steps:

  • Create a index in elasticsearch with script config/gopa-index-mapping.sh

    Example
    curl -XPUT "http://localhost:9200/gopa-index" -H 'Content-Type: application/json' -d'
    {
    "mappings": {
    "doc": {
      "properties": {
        "host": {
            "type": "keyword",
            "ignore_above": 256
        },
        "snapshot": {
          "properties": {
            "bold": {
              "type": "text"
            },
            "url": {
              "type": "keyword",
              "ignore_above": 256
            },
            "content_type": {
              "type": "keyword",
              "ignore_above": 256
            },
            "file": {
              "type": "keyword",
              "ignore_above": 256
            },
            "h1": {
              "type": "text"
            },
            "h2": {
              "type": "text"
            },
            "h3": {
              "type": "text"
            },
            "h4": {
              "type": "text"
            },
            "hash": {
              "type": "keyword",
              "ignore_above": 256
            },
            "id": {
              "type": "keyword",
              "ignore_above": 256
            },
            "images": {
              "properties": {
                "external": {
                  "properties": {
                    "label": {
                      "type": "text"
                    },
                    "url": {
                      "type": "keyword",
                      "ignore_above": 256
                    }
                  }
                },
                "internal": {
                  "properties": {
                    "label": {
                      "type": "text"
                    },
                    "url": {
                      "type": "keyword",
                      "ignore_above": 256
                    }
                  }
                }
              }
            },
            "italic": {
              "type": "text"
            },
            "links": {
              "properties": {
                "external": {
                  "properties": {
                    "label": {
                      "type": "text"
                    },
                    "url": {
                      "type": "keyword",
                      "ignore_above": 256
                    }
                  }
                },
                "internal": {
                  "properties": {
                    "label": {
                      "type": "text"
                    },
                    "url": {
                      "type": "keyword",
                      "ignore_above": 256
                    }
                  }
                }
              }
            },
            "path": {
              "type": "keyword",
              "ignore_above": 256
            },
            "sim_hash": {
              "type": "keyword",
              "ignore_above": 256
            },
            "lang": {
              "type": "keyword",
              "ignore_above": 256
            },
            "size": {
              "type": "long"
            },
            "text": {
              "type": "text"
            },
            "title": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword"
                }
              }
            },
            "version": {
              "type": "long"
            }
          }
        },
        "task": {
          "properties": {
            "breadth": {
              "type": "long"
            },
            "created": {
              "type": "date"
            },
            "depth": {
              "type": "long"
            },
            "id": {
              "type": "keyword",
              "ignore_above": 256
            },
            "original_url": {
              "type": "keyword",
              "ignore_above": 256
            },
            "reference_url": {
              "type": "keyword",
              "ignore_above": 256
            },
            "schema": {
              "type": "keyword",
              "ignore_above": 256
            },
            "status": {
              "type": "integer"
            },
            "updated": {
              "type": "date"
            },
            "url": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
    }
    }'

Note: Elasticsearch version should > v5.0

  • Enable index module in gopa.yml, update the elasticsearch's setting:
    - module: index
    enabled: true
    ui:
      enabled: true
    elasticsearch:
      endpoint: http://dev:9200
      index_prefix: gopa-
      username: elastic
      password: changeme

Start

Gopa doesn't require any dependencies, simply run ./gopa to start the program.

Gopa can be run as daemon(Note: Only available on Linux and Mac):

Example

➜  gopa git:(master) ✗ ./bin/gopa --daemon
  ________ ________ __________  _____
 /  _____/ \_____  \\______   \/  _  \
/   \  ___  /   |   \|     ___/  /_\  \
\    \_\  \/    |    \    |  /    |    \
 \______  /\_______  /____|  \____|__  /
        \/         \/                \/
[gopa] 0.10.0_SNAPSHOT
///last commit: 99616a2, Fri Oct 20 14:04:54 2017 +0200, medcl, update version to 0.10.0 ///

[10-21 16:01:09] [INF] [instance.go:23] workspace: data/gopa/nodes/0
[gopa] started.

Also run ./gopa -h to get the full list of command line options.

Example

➜  gopa git:(master) ✗ ./bin/gopa -h
  ________ ________ __________  _____
 /  _____/ \_____  \\______   \/  _  \
/   \  ___  /   |   \|     ___/  /_\  \
\    \_\  \/    |    \    |  /    |    \
 \______  /\_______  /____|  \____|__  /
        \/         \/                \/
[gopa] 0.10.0_SNAPSHOT
///last commit: 99616a2, Fri Oct 20 14:04:54 2017 +0200, medcl, update version to 0.10.0 ///

Usage of ./bin/gopa:
  -config string
        the location of config file (default "gopa.yml")
  -cpuprofile string
        write cpu profile to this file
  -daemon
        run in background as daemon
  -debug
        run in debug mode, wi
  -log string
        the log level,options:trace,debug,info,warn,error (default "info")
  -log_path string
        the log path (default "log")
  -memprofile string
        write memory profile to this file
  -pidfile string
        pidfile path (only for daemon)
  -pprof string
        enable and setup pprof/expvar service, eg: localhost:6060 , the endpoint will be: http://localhost:6060/debug/pprof/ and http://localhost:6060/debug/vars

Stop

It's safety to press ctrl+c stop the current running Gopa, Gopa will handle the rest,saving the checkpoint, you may restore the job later,the world is still in your hand.

If you are running Gopa as daemon, you may stop it like this:

 kill -QUIT `pgrep gopa`

Configuration

UI

  • Search Console http://127.0.0.1:9001/
  • Admin Console http://127.0.0.1:9001/admin/

API

  • TBD

Contributing

You are sincerely and warmly welcomed to play with this project, from UI style to core features, or just a piece of document, welcome! let's make it better.

License

Released under the Apache License, Version 2.0 .

Also XSS Test

alert('XSS test');

继续阅读 »

为了改善大家的创作体验,提高大家的写作和分享热情!😁,经过两天的不懈奋斗,终于把 Markdown 编辑器搬上来了。 目前只支持文章的发布,可以通过切换编辑器来选择 Markdown 编辑模式。 希望不要再以编辑器作为理由发只有链接的文章了。 😁😁😎😎😎😎😁😁😀😀😀

  • 支持 Github 风格的 Markdown 格式
  • 支持本站附件功能
  • 支持 emoj 符号
  • 支持自动的页面导航
  • 以前的文章可再次编辑,切换 Markdown 模式然后修改保存

如何使用?

  1. 点击【发起】,选择文章
  2. 切换绿色按钮,将编辑器切换到 Markdown,然后在文本框内输入 Markdown 格式的内容即可。

在线 Markdown 脚本编辑预览工具:https://elasticsearch.cn/static/js/editor/markdown/


以下为样式测试参考,忽略其意义。

1510307393004.jpg

----------- 常用格式-----------------


# 标题1
## 标题2
### 标题3
#### 标题4
##### 标题5
###### 标题6
超大标题   //等于号写于文字下方
===
标题      //同超大标题
---

`短代码`
_ 注:长代码块,用三个: `  _

> This is the first level of quoting.
>
> > This is nested blockquote.
>
> Back to the first level.

* Red
* Green
* Blue

- Red
- Green
- Blue

+ Red
+ Green
+ Blue

1. 这是第一个
1. 这是第二个
1. 这是第三个

* * *
***
*****
- - -
---

[markdown-syntax](http://daringfireball.net/projects/markdown/syntax)

[id]: http://example.com/  "Optional Title Here"
This is [an example][id] reference-style link.

*内容*
**内容**
_内容_
__内容__

![这是张外链图片](https://static-www.elastic.co/assets/bltbfcd44f1256d8c88/blog-swifttype-thumb.jpg?q=845)

<http://elastic.co/>

<info@elastic.o>

    四个空格
    一个tab

----------- 样式预览-----------------

标题1

标题2

标题3

标题4

标题5
标题6

超大标题 //等于号写于文字下方

标题 //同超大标题

短代码

This is the first level of quoting.

This is nested blockquote.

Back to the first level.

  • Red
  • Green
  • Blue

  • Red
  • Green
  • Blue

  • Red
  • Green
  • Blue
  1. 这是第一个
  2. 这是第二个
  3. 这是第三个





markdown-syntax

This is an example reference-style link.

内容 内容 内容 内容

这是张外链图片

http://elastic.co/

info@elastic.o

四个空格
一个tab

https://github.com/infinitbyte/gopa 的 README 内容


What a Spider!

GOPA, A Spider Written in Go.

Travis Go Report Card Coverage Status Join the chat at https://gitter.im/infinitbyte/gopa

Goal

  • Light weight, low footprint, memory requirement should < 100MB
  • Easy to deploy, no runtime or dependency required
  • Easy to use, no programming or scripts ability needed, out of box features

Screenshoot

What a Spider! GOPA Spider!

How to use

Setup

First of all, get it, two opinions: download the pre-built package or compile it yourself.

Download Pre Built Package

Go to Release or Snapshot page, download the right package for your platform.

Note: Darwin is for Mac

Compile The Package Manually

So far, we have:

gopa, the main program, a single binary.
config/, elasticsearch related scripts etc.
gopa.yml, main configuration for gopa.

Optional Config

By default, Gopa works well except indexing, if you want to use elasticsearch as indexing, follow these steps:

  • Create a index in elasticsearch with script config/gopa-index-mapping.sh

    Example
    curl -XPUT "http://localhost:9200/gopa-index" -H 'Content-Type: application/json' -d'
    {
    "mappings": {
    "doc": {
      "properties": {
        "host": {
            "type": "keyword",
            "ignore_above": 256
        },
        "snapshot": {
          "properties": {
            "bold": {
              "type": "text"
            },
            "url": {
              "type": "keyword",
              "ignore_above": 256
            },
            "content_type": {
              "type": "keyword",
              "ignore_above": 256
            },
            "file": {
              "type": "keyword",
              "ignore_above": 256
            },
            "h1": {
              "type": "text"
            },
            "h2": {
              "type": "text"
            },
            "h3": {
              "type": "text"
            },
            "h4": {
              "type": "text"
            },
            "hash": {
              "type": "keyword",
              "ignore_above": 256
            },
            "id": {
              "type": "keyword",
              "ignore_above": 256
            },
            "images": {
              "properties": {
                "external": {
                  "properties": {
                    "label": {
                      "type": "text"
                    },
                    "url": {
                      "type": "keyword",
                      "ignore_above": 256
                    }
                  }
                },
                "internal": {
                  "properties": {
                    "label": {
                      "type": "text"
                    },
                    "url": {
                      "type": "keyword",
                      "ignore_above": 256
                    }
                  }
                }
              }
            },
            "italic": {
              "type": "text"
            },
            "links": {
              "properties": {
                "external": {
                  "properties": {
                    "label": {
                      "type": "text"
                    },
                    "url": {
                      "type": "keyword",
                      "ignore_above": 256
                    }
                  }
                },
                "internal": {
                  "properties": {
                    "label": {
                      "type": "text"
                    },
                    "url": {
                      "type": "keyword",
                      "ignore_above": 256
                    }
                  }
                }
              }
            },
            "path": {
              "type": "keyword",
              "ignore_above": 256
            },
            "sim_hash": {
              "type": "keyword",
              "ignore_above": 256
            },
            "lang": {
              "type": "keyword",
              "ignore_above": 256
            },
            "size": {
              "type": "long"
            },
            "text": {
              "type": "text"
            },
            "title": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword"
                }
              }
            },
            "version": {
              "type": "long"
            }
          }
        },
        "task": {
          "properties": {
            "breadth": {
              "type": "long"
            },
            "created": {
              "type": "date"
            },
            "depth": {
              "type": "long"
            },
            "id": {
              "type": "keyword",
              "ignore_above": 256
            },
            "original_url": {
              "type": "keyword",
              "ignore_above": 256
            },
            "reference_url": {
              "type": "keyword",
              "ignore_above": 256
            },
            "schema": {
              "type": "keyword",
              "ignore_above": 256
            },
            "status": {
              "type": "integer"
            },
            "updated": {
              "type": "date"
            },
            "url": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
    }
    }'

Note: Elasticsearch version should > v5.0

  • Enable index module in gopa.yml, update the elasticsearch's setting:
    - module: index
    enabled: true
    ui:
      enabled: true
    elasticsearch:
      endpoint: http://dev:9200
      index_prefix: gopa-
      username: elastic
      password: changeme

Start

Gopa doesn't require any dependencies, simply run ./gopa to start the program.

Gopa can be run as daemon(Note: Only available on Linux and Mac):

Example

➜  gopa git:(master) ✗ ./bin/gopa --daemon
  ________ ________ __________  _____
 /  _____/ \_____  \\______   \/  _  \
/   \  ___  /   |   \|     ___/  /_\  \
\    \_\  \/    |    \    |  /    |    \
 \______  /\_______  /____|  \____|__  /
        \/         \/                \/
[gopa] 0.10.0_SNAPSHOT
///last commit: 99616a2, Fri Oct 20 14:04:54 2017 +0200, medcl, update version to 0.10.0 ///

[10-21 16:01:09] [INF] [instance.go:23] workspace: data/gopa/nodes/0
[gopa] started.

Also run ./gopa -h to get the full list of command line options.

Example

➜  gopa git:(master) ✗ ./bin/gopa -h
  ________ ________ __________  _____
 /  _____/ \_____  \\______   \/  _  \
/   \  ___  /   |   \|     ___/  /_\  \
\    \_\  \/    |    \    |  /    |    \
 \______  /\_______  /____|  \____|__  /
        \/         \/                \/
[gopa] 0.10.0_SNAPSHOT
///last commit: 99616a2, Fri Oct 20 14:04:54 2017 +0200, medcl, update version to 0.10.0 ///

Usage of ./bin/gopa:
  -config string
        the location of config file (default "gopa.yml")
  -cpuprofile string
        write cpu profile to this file
  -daemon
        run in background as daemon
  -debug
        run in debug mode, wi
  -log string
        the log level,options:trace,debug,info,warn,error (default "info")
  -log_path string
        the log path (default "log")
  -memprofile string
        write memory profile to this file
  -pidfile string
        pidfile path (only for daemon)
  -pprof string
        enable and setup pprof/expvar service, eg: localhost:6060 , the endpoint will be: http://localhost:6060/debug/pprof/ and http://localhost:6060/debug/vars

Stop

It's safety to press ctrl+c stop the current running Gopa, Gopa will handle the rest,saving the checkpoint, you may restore the job later,the world is still in your hand.

If you are running Gopa as daemon, you may stop it like this:

 kill -QUIT `pgrep gopa`

Configuration

UI

  • Search Console http://127.0.0.1:9001/
  • Admin Console http://127.0.0.1:9001/admin/

API

  • TBD

Contributing

You are sincerely and warmly welcomed to play with this project, from UI style to core features, or just a piece of document, welcome! let's make it better.

License

Released under the Apache License, Version 2.0 .

Also XSS Test

alert('XSS test');

收起阅读 »

ELK使用不完全记录

ELK入门搭建参考文章
ELK入门搭建参考文章

招聘

招聘需求:
 
技术总监1名:
1、 日志分析产品研发经验优先,8年以上工作经验
2、 精通elasticsearch、Redis、MongoDB、Neo4J等NoSQL系统,熟悉elasticsearch集群管理和性能调优,有在实际项目中使用搜索引擎工具、内存数据库、文档数据库、图数据库的经验
3、 熟悉Hadoop、Spark、Spark Streaming、Storm、HBase、ZooKeeper等大数据生态系统组件;熟悉Kafka、ZeroMQ等消息系统组件
4、 精通日志处理工具集ELK,flume,heka等
5、 熟悉Linux环境,熟练使用Python和Shell进行脚本编程
6、 精通JAVA语言,熟悉主流开源框架Struts2、Spring、Hibernate,SpringMVC的运行机制及使用。熟练掌握和使用J2EE开发中常见面向对象设计模式(Singleton,Proxy,Factory等)
7、 有系统运维管理平台项目开发及管理经验优先
8、 提供优厚待遇及期权,薪水50万以上
9、 金融行业背景优先考虑
 
 
技术专家2名:
1、熟悉Hadoop生态圈相关技术,如Hbase,Hive,Zookeeper,flume,kafka,storm
2、了解spark运行机制,研读spark部分内核源码;了解ELK日志分析平台(elasticsearch、logstash、kibana)使用
3、 熟悉Linux系统的基本操作和集群环境的搭建和部署
4、 熟悉JavaEE的开发,掌握JavaEE流行框架的使用,如:Struts2、Spring、Hibernate、SpringMVC等
5、熟悉主流数据库Oracle、DB2、MySQL、Mariadb的使用及性能优化;会使用NoSql数据库(如redis)解决开发过程中遇到的业务问题
6、提供优厚待遇和期权,薪水30万以上
7、金融行业优先考虑
如有意向请联系郝女士   联系电话:13520834022      邮箱:haojinjin16@163.com
招聘单位:洋大数据信息技术(北京)有限公司
继续阅读 »
招聘需求:
 
技术总监1名:
1、 日志分析产品研发经验优先,8年以上工作经验
2、 精通elasticsearch、Redis、MongoDB、Neo4J等NoSQL系统,熟悉elasticsearch集群管理和性能调优,有在实际项目中使用搜索引擎工具、内存数据库、文档数据库、图数据库的经验
3、 熟悉Hadoop、Spark、Spark Streaming、Storm、HBase、ZooKeeper等大数据生态系统组件;熟悉Kafka、ZeroMQ等消息系统组件
4、 精通日志处理工具集ELK,flume,heka等
5、 熟悉Linux环境,熟练使用Python和Shell进行脚本编程
6、 精通JAVA语言,熟悉主流开源框架Struts2、Spring、Hibernate,SpringMVC的运行机制及使用。熟练掌握和使用J2EE开发中常见面向对象设计模式(Singleton,Proxy,Factory等)
7、 有系统运维管理平台项目开发及管理经验优先
8、 提供优厚待遇及期权,薪水50万以上
9、 金融行业背景优先考虑
 
 
技术专家2名:
1、熟悉Hadoop生态圈相关技术,如Hbase,Hive,Zookeeper,flume,kafka,storm
2、了解spark运行机制,研读spark部分内核源码;了解ELK日志分析平台(elasticsearch、logstash、kibana)使用
3、 熟悉Linux系统的基本操作和集群环境的搭建和部署
4、 熟悉JavaEE的开发,掌握JavaEE流行框架的使用,如:Struts2、Spring、Hibernate、SpringMVC等
5、熟悉主流数据库Oracle、DB2、MySQL、Mariadb的使用及性能优化;会使用NoSql数据库(如redis)解决开发过程中遇到的业务问题
6、提供优厚待遇和期权,薪水30万以上
7、金融行业优先考虑
如有意向请联系郝女士   联系电话:13520834022      邮箱:haojinjin16@163.com
招聘单位:洋大数据信息技术(北京)有限公司 收起阅读 »

南京Elastic社区第一次线下活动

1. 主办方
Elastic中文社区  趋势科技
eslogo.jpg


2. 时间地点
 活动时间:2016年6月25日 14:00 - 17:30 
 活动地点:雨花区软件大道48号苏豪国际广场B座(靠花神庙地铁站)
suhao.PNG


3. 主题 
分享一:ES和Kibana在实时流量分析中的应用
演讲者简介:
杨润达​ 南京云利来软件科技有限公司研发部
 
主题简介:
流量的抓取和存储,流量的可视化,有关流量异常的案例分析,在线的kibana功能展示。
 
分享二:ELK平台SaaS化的问题和解决方案
演讲者简介:
翰思-王晓亮.jpg
 
王晓亮(Tomo Wang) 瀚思安信高级研发工程师
毕业于南京大学,曾就职于趋势科技、Opera,现任瀚思安信高级研发工程师,负责瀚思在线安全分析平台“安全易”的研发工作。
 
主题简介:
ELK(ElasticSearch,Logstash,Kibana)是一套有效的开源日志分析平台,它们作为工具使用非常便利,但是如果要围绕它们搭建在线服务,却有诸多问题。这次的分享主要介绍“安全易”在SaaS化ELK平台的过程中遇到的问题以及对应的技术方案。
 
分享三:ES在苏宁海量日志平台的实践
演讲者简介:
苏宁-彭燕卿.jpg

彭燕卿 苏宁云商IT总部监控研发中心技术副总监
9年软件研发经验,09年加入苏宁,先后从事了SOA系统开发、苏宁易购等大型网站的性能分析调优、监控平台等系统研发和架构工作,目前主要从事苏宁监控系统架构及技术管理工作,专注于APM以及Elasticsearch等实时计算领域。
 
主题简介:
实时日志平台ES架构演变,ES使用过程中遇到的坑及调优,Kibana二次开发等。
 
分享四:甲方安全看日志消息在ELK中的流转​
演讲者简介:
李天爽 闻心科技上海研发中心总监
毕业于南京大学,曾担任趋势科技高级工程师,携程信息安全部资深安全研发工程师。
 
主题简介:
分享携程的日志平台架构、安全事件在ELK中的生命周期、ES的权限方案等。
 
分享五:ES在移动病毒分析和检测中的应用
演讲者简介:
趋势-李啸.jpg

李啸(White Li) 趋势科技中国研发中心资深工程师
毕业于南京邮电大学,曾就职于小米、百度,专注于大规模分布式系统的架构和运维,现负责趋势科技移动安全专家系统的开发工作。
 
主题简介:
介绍ES在样本分析、检测系统中的应用和逐步演变,重点探讨碰到的问题和解决方案。
 
4. 主题slides

ES南京meetup资料


 
继续阅读 »
1. 主办方
Elastic中文社区  趋势科技
eslogo.jpg


2. 时间地点
 活动时间:2016年6月25日 14:00 - 17:30 
 活动地点:雨花区软件大道48号苏豪国际广场B座(靠花神庙地铁站)
suhao.PNG


3. 主题 
分享一:ES和Kibana在实时流量分析中的应用
演讲者简介:
杨润达​ 南京云利来软件科技有限公司研发部
 
主题简介:
流量的抓取和存储,流量的可视化,有关流量异常的案例分析,在线的kibana功能展示。
 
分享二:ELK平台SaaS化的问题和解决方案
演讲者简介:
翰思-王晓亮.jpg
 
王晓亮(Tomo Wang) 瀚思安信高级研发工程师
毕业于南京大学,曾就职于趋势科技、Opera,现任瀚思安信高级研发工程师,负责瀚思在线安全分析平台“安全易”的研发工作。
 
主题简介:
ELK(ElasticSearch,Logstash,Kibana)是一套有效的开源日志分析平台,它们作为工具使用非常便利,但是如果要围绕它们搭建在线服务,却有诸多问题。这次的分享主要介绍“安全易”在SaaS化ELK平台的过程中遇到的问题以及对应的技术方案。
 
分享三:ES在苏宁海量日志平台的实践
演讲者简介:
苏宁-彭燕卿.jpg

彭燕卿 苏宁云商IT总部监控研发中心技术副总监
9年软件研发经验,09年加入苏宁,先后从事了SOA系统开发、苏宁易购等大型网站的性能分析调优、监控平台等系统研发和架构工作,目前主要从事苏宁监控系统架构及技术管理工作,专注于APM以及Elasticsearch等实时计算领域。
 
主题简介:
实时日志平台ES架构演变,ES使用过程中遇到的坑及调优,Kibana二次开发等。
 
分享四:甲方安全看日志消息在ELK中的流转​
演讲者简介:
李天爽 闻心科技上海研发中心总监
毕业于南京大学,曾担任趋势科技高级工程师,携程信息安全部资深安全研发工程师。
 
主题简介:
分享携程的日志平台架构、安全事件在ELK中的生命周期、ES的权限方案等。
 
分享五:ES在移动病毒分析和检测中的应用
演讲者简介:
趋势-李啸.jpg

李啸(White Li) 趋势科技中国研发中心资深工程师
毕业于南京邮电大学,曾就职于小米、百度,专注于大规模分布式系统的架构和运维,现负责趋势科技移动安全专家系统的开发工作。
 
主题简介:
介绍ES在样本分析、检测系统中的应用和逐步演变,重点探讨碰到的问题和解决方案。
 
4. 主题slides

ES南京meetup资料


  收起阅读 »

杭州 Elastic社区第一次线下活动 开始报名啦!!!

PPT下载地址:
 百度云盘:  http://pan.baidu.com/s/1slQn93v   提取码:jqqi
 淘云盘: http://yunpan.taobao.com/s/E2TDSFivxt  提取码: vwIWlm
  
 Elastic 中文社区联手杭州码耘网络共同举办第一次线下聚会,欢迎对elastic、搜索、大数据等技术感兴趣的朋友来玩玩
  • 时间:2016-6-18 13:00:00
  • 地点:杭州市滨江区上峰电商产品园1-227(从聚才路门口进来会比较近,离阿里网易5分钟路程)


                               
 
 
分享主题 :   
  •   有赞搜索引擎实践   ——   洪斌@有赞大数据团队负责人
  •    Elastic结合Hbase的应用实践  —— 汪兴@浙大中控
  •    购阿购数据分析平台对Elasticsearch使用实践     —— 万斌@北京购阿购技术服务有限公司
  •    beats介绍与扩展   ——  曾勇@elastic
  •    基于ELK的云日志产品实践 —— 宁海元@袋鼠云
  •    elasticsearch-jdbc介绍以及基于binlog的增量数据同步方案 —— 卢栋@码耘网络  

 
 
报名方式:
  •   扫描下面微信二维码加入杭州Elastic聚会群,成功加入即算报名成功
  •   无法扫描的同学加我微信(573513542),我来拉你进群


                     
QQ20160613-2@2x.png



乘车:  
   附近公交站: 
  • 秋溢路聚才路口(139路直达)
  • 江虹路秋溢路口(139路、175路)
  • 滨安路江虹路口(225、B支6 路)

   地铁:
  •  坐到滨和路站或者西兴站,然后打车过来起步价

 
    ps :  如果到了滨江不认识路,可以打我手机(15858279062) 我可以来接你。
 
继续阅读 »
PPT下载地址:
 百度云盘:  http://pan.baidu.com/s/1slQn93v   提取码:jqqi
 淘云盘: http://yunpan.taobao.com/s/E2TDSFivxt  提取码: vwIWlm
  
 Elastic 中文社区联手杭州码耘网络共同举办第一次线下聚会,欢迎对elastic、搜索、大数据等技术感兴趣的朋友来玩玩
  • 时间:2016-6-18 13:00:00
  • 地点:杭州市滨江区上峰电商产品园1-227(从聚才路门口进来会比较近,离阿里网易5分钟路程)


                               
 
 
分享主题 :   
  •   有赞搜索引擎实践   ——   洪斌@有赞大数据团队负责人
  •    Elastic结合Hbase的应用实践  —— 汪兴@浙大中控
  •    购阿购数据分析平台对Elasticsearch使用实践     —— 万斌@北京购阿购技术服务有限公司
  •    beats介绍与扩展   ——  曾勇@elastic
  •    基于ELK的云日志产品实践 —— 宁海元@袋鼠云
  •    elasticsearch-jdbc介绍以及基于binlog的增量数据同步方案 —— 卢栋@码耘网络  

 
 
报名方式:
  •   扫描下面微信二维码加入杭州Elastic聚会群,成功加入即算报名成功
  •   无法扫描的同学加我微信(573513542),我来拉你进群


                     
QQ20160613-2@2x.png



乘车:  
   附近公交站: 
  • 秋溢路聚才路口(139路直达)
  • 江虹路秋溢路口(139路、175路)
  • 滨安路江虹路口(225、B支6 路)

   地铁:
  •  坐到滨和路站或者西兴站,然后打车过来起步价

 
    ps :  如果到了滨江不认识路,可以打我手机(15858279062) 我可以来接你。
  收起阅读 »

北京 Elastic社区第一次线下活动

1、主办方:
    

      ElasticSearch中文社区    奇点机智

QQ20160511-0@2x.png




2、时间与地点:


      5月15日14:00 - 17:30(周日)

     北京海淀区中关村鼎好电子大厦太库孵化器路演厅


QQ20160511-8@2x.png


 

沙龙主题:


分享一:5miles基于es的对外搜索业务实践 

QQ20160511-1@2x.png


王浩宇

5miles搜索工程师

主题简介:

和大家交流一些5miles对外搜索业务中的工作,例如基于es function_score 的rerank的实现,通过geohash减少请求,通过多个data center来实现请求异步,风险控制等

 

分享二: Elasticsearch与Spark的整合

QQ20160511-2@2x.png



祝威廉

多年大数据经验,现专注于Spark/ES 相关领域

主题简介:

个人对ElasticSearch 和 Spark的整合一些看法,简要介绍通过对elasticsearch-hadoop项目的改进,以Spark 和 ElasticSearch 为依托,构建一个Ad-Hoc 查询引擎。

 

分享三:ElasticStack 5.0 介绍


QQ20160511-3@2x.png



medcl

Developer@Elastic

主题简介:

ElasticStack 5.0的新特性介绍


 

活动流程:


13:00-13:45  签到及入场

13:45-14:00  主持人介绍活动

14:00-15:00  王浩宇    5miles基于es的对外搜索业务实践

15:00-16:00  祝威廉    ElasticSearch 与 Spark 的整合 

16:00-16:30  茶歇与自由沟通

16:30-17:30  medcl   ElasticStack 5.0 介绍


QQ20160511-5@2x.png




报名方式:

本次活动全程免费,欢迎报名
http://www.huodongxing.com/event/6334153926600#rd


活动联系:
联系人:凌霄
手机:18600209779
邮箱:hellolingxiao@gmail.com



QQ20160511-7@2x.png

想要加入Elastic北京微信群,扫描上方二维码加小助手拉你进群

QQ20160511-6@2x.png






 
继续阅读 »
1、主办方:
    

      ElasticSearch中文社区    奇点机智

QQ20160511-0@2x.png




2、时间与地点:


      5月15日14:00 - 17:30(周日)

     北京海淀区中关村鼎好电子大厦太库孵化器路演厅


QQ20160511-8@2x.png


 

沙龙主题:


分享一:5miles基于es的对外搜索业务实践 

QQ20160511-1@2x.png


王浩宇

5miles搜索工程师

主题简介:

和大家交流一些5miles对外搜索业务中的工作,例如基于es function_score 的rerank的实现,通过geohash减少请求,通过多个data center来实现请求异步,风险控制等

 

分享二: Elasticsearch与Spark的整合

QQ20160511-2@2x.png



祝威廉

多年大数据经验,现专注于Spark/ES 相关领域

主题简介:

个人对ElasticSearch 和 Spark的整合一些看法,简要介绍通过对elasticsearch-hadoop项目的改进,以Spark 和 ElasticSearch 为依托,构建一个Ad-Hoc 查询引擎。

 

分享三:ElasticStack 5.0 介绍


QQ20160511-3@2x.png



medcl

Developer@Elastic

主题简介:

ElasticStack 5.0的新特性介绍


 

活动流程:


13:00-13:45  签到及入场

13:45-14:00  主持人介绍活动

14:00-15:00  王浩宇    5miles基于es的对外搜索业务实践

15:00-16:00  祝威廉    ElasticSearch 与 Spark 的整合 

16:00-16:30  茶歇与自由沟通

16:30-17:30  medcl   ElasticStack 5.0 介绍


QQ20160511-5@2x.png




报名方式:

本次活动全程免费,欢迎报名
http://www.huodongxing.com/event/6334153926600#rd


活动联系:
联系人:凌霄
手机:18600209779
邮箱:hellolingxiao@gmail.com



QQ20160511-7@2x.png

想要加入Elastic北京微信群,扫描上方二维码加小助手拉你进群

QQ20160511-6@2x.png






  收起阅读 »

社区使用WeCenter,一个开源的php+mysql社区问答系统搭建

前言

之前学习Lucene和ElasticSearch的时候经常逛逛Elastic的中文社区,发现社区做的蛮不错的,风格和ui都比较清新,今天突然看到了一个站和其风格类似,我就肯定是个开源的产品二次开发的,后来发现了WeCenter,一个很不错的社区问答系统

简介

WeCenter 是一款知识型的社交化开源社区程序,专注于企业和行业社区内容的整理、归类、检索和再发行。

为什么选择WeCenter

管理中心,一手掌控
管理中心为你建立起快速通路,所有功能开关,只需轻点一下,即可轻松完成配置,如此众多的操控,任你一挥而就

开放源码,便捷开发
WeCenter 含有多项创新功能,遵循 MVC 架构,充分利用当下最新技术,对于开发者来说都会大有帮助,二次开发,更强定制,更易上手

个性路由,个性定制
WeCenter 让你用你喜欢的方式,更灵活地定制 URL 路由,URL 地址不再是千篇一律的样式,在 SEO 优化上祝你一臂之力
设计之妙,上手即知
我们创造的每一件产品,从来都不仅仅追求设计的美观。我们在考虑设计的同时,更希望用户更能容易定制模板,最终我们选择了 Bootstrap,定制模板时你会发现一切都是那么的方便,简易

安装初体验

从官网下载源代码后将UPLOAD放入你的http服务器入目下,开始安装体验之旅

QQ图片20160425102527.png

原文地址:http://www.kailing.pub/article ... .html
继续阅读 »
前言

之前学习Lucene和ElasticSearch的时候经常逛逛Elastic的中文社区,发现社区做的蛮不错的,风格和ui都比较清新,今天突然看到了一个站和其风格类似,我就肯定是个开源的产品二次开发的,后来发现了WeCenter,一个很不错的社区问答系统

简介

WeCenter 是一款知识型的社交化开源社区程序,专注于企业和行业社区内容的整理、归类、检索和再发行。

为什么选择WeCenter

管理中心,一手掌控
管理中心为你建立起快速通路,所有功能开关,只需轻点一下,即可轻松完成配置,如此众多的操控,任你一挥而就

开放源码,便捷开发
WeCenter 含有多项创新功能,遵循 MVC 架构,充分利用当下最新技术,对于开发者来说都会大有帮助,二次开发,更强定制,更易上手

个性路由,个性定制
WeCenter 让你用你喜欢的方式,更灵活地定制 URL 路由,URL 地址不再是千篇一律的样式,在 SEO 优化上祝你一臂之力
设计之妙,上手即知
我们创造的每一件产品,从来都不仅仅追求设计的美观。我们在考虑设计的同时,更希望用户更能容易定制模板,最终我们选择了 Bootstrap,定制模板时你会发现一切都是那么的方便,简易

安装初体验

从官网下载源代码后将UPLOAD放入你的http服务器入目下,开始安装体验之旅

QQ图片20160425102527.png

原文地址:http://www.kailing.pub/article ... .html 收起阅读 »

Shanghai Elastic Meetup启动啦!

Shanghai Elastic Meetup

时间:2016年5月7日 13:30

地点:上海市徐汇区广元西路55号浩然科技大厦1808(交通大学内)

报名链接:

[Meetup](http://www.meetup.com/Shanghai ... 07915/)

[微信](https://jinshuju.net/f/Ed5I5o)

## 《ES用于时间序列存储 - Hickwall监控报警平台简介》

唐锐华  携程旅行网软件技术专家

简介:
  
  
  随着携程业务的扩张,新应用不断涌现,基础监控和应用监控的需求迅猛增长,zabbix已经不堪负重。在调研了很多开源的解决方案之后发觉或多或少都存在不太满意的地方。
  所以在借鉴多种方案的基础上重新设计开发了一套监控告警系统。其中对比过多种现有存储方案之后我们选择了ES。这里和大家分享一下这个系统和ES用在在我们场景中的优缺点。

提纲:

* 为什么会有这个项目
* 现有开源项目的调研
* 项目的整体设计与其特点
* ES在使用过程中碰到的问题

## 《ES在日志分析产品中的实践》

简介:

主要介绍如何在JAVA开发产品中使用ES,以及常用的ES JAVA接口,以及JAVA代码阅读的简单说明

2010年进入深圳天源迪科从事运营商业务系统相关的开发工作,期间做过软件开发,需求分析师,架构师等职务,后面2006年进入江苏保旺达从事安全产品相关的研发。从毕业到工作十几年的时间大部分都在做和技术相关的工作,本人非常热爱技术,热爱开发,现任赛克蓝德公司技术总监,从事数据分析领域相关产品的研发,现在主要研发日志分析产品(SeciLog)。

## 《Hangout: 一个logstash indexer的替代方案》
讲师简介:

刘佳  携程旅行网软件技术专家

简介:

logstash以其丰富的插件功能,成为ELK技术栈中不可或缺的一个组件。 但目前版本的logstash主要由jruby实现,在处理日志的吞吐量方面不尽如人意。 hangout是一个类logsatsh的java实现,提供了logstash里常用的filter功能。 这里分享一下hangout的特性,实际生产环境的吞吐量以及多实例的管理方式。

提纲:

* 为何开发hangout   
* 支持的filter
* 与logsatsh性能对比
* 影响吞吐量的主要参数及其含
* 用mesos+marathon管理hangout
    
继续阅读 »
Shanghai Elastic Meetup

时间:2016年5月7日 13:30

地点:上海市徐汇区广元西路55号浩然科技大厦1808(交通大学内)

报名链接:

[Meetup](http://www.meetup.com/Shanghai ... 07915/)

[微信](https://jinshuju.net/f/Ed5I5o)

## 《ES用于时间序列存储 - Hickwall监控报警平台简介》

唐锐华  携程旅行网软件技术专家

简介:
  
  
  随着携程业务的扩张,新应用不断涌现,基础监控和应用监控的需求迅猛增长,zabbix已经不堪负重。在调研了很多开源的解决方案之后发觉或多或少都存在不太满意的地方。
  所以在借鉴多种方案的基础上重新设计开发了一套监控告警系统。其中对比过多种现有存储方案之后我们选择了ES。这里和大家分享一下这个系统和ES用在在我们场景中的优缺点。

提纲:

* 为什么会有这个项目
* 现有开源项目的调研
* 项目的整体设计与其特点
* ES在使用过程中碰到的问题

## 《ES在日志分析产品中的实践》

简介:

主要介绍如何在JAVA开发产品中使用ES,以及常用的ES JAVA接口,以及JAVA代码阅读的简单说明

2010年进入深圳天源迪科从事运营商业务系统相关的开发工作,期间做过软件开发,需求分析师,架构师等职务,后面2006年进入江苏保旺达从事安全产品相关的研发。从毕业到工作十几年的时间大部分都在做和技术相关的工作,本人非常热爱技术,热爱开发,现任赛克蓝德公司技术总监,从事数据分析领域相关产品的研发,现在主要研发日志分析产品(SeciLog)。

## 《Hangout: 一个logstash indexer的替代方案》
讲师简介:

刘佳  携程旅行网软件技术专家

简介:

logstash以其丰富的插件功能,成为ELK技术栈中不可或缺的一个组件。 但目前版本的logstash主要由jruby实现,在处理日志的吞吐量方面不尽如人意。 hangout是一个类logsatsh的java实现,提供了logstash里常用的filter功能。 这里分享一下hangout的特性,实际生产环境的吞吐量以及多实例的管理方式。

提纲:

* 为何开发hangout   
* 支持的filter
* 与logsatsh性能对比
* 影响吞吐量的主要参数及其含
* 用mesos+marathon管理hangout
     收起阅读 »