话题 (es) 已与当前话题合并
elasticsearch

elasticsearch

怎样订阅Elasticsearch的邮件列表?

Elasticsearchmedcl 回复了问题 • 2 人关注 • 1 个回复 • 36 次浏览 • 5 小时前 • 来自相关话题

Elastic日报 第424期 (2018-10-21)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 20 次浏览 • 19 小时前 • 来自相关话题

1.Logstash和Elasticsearch 集成。 http://t.cn/EzYLgoO 2.如何在Logstash中设置Elasticsearch输出模板。 http://t.cn/EzYLx6u 3.(自备梯子)怎样真正成为高级开发人员。 http://t.cn/EzYyl2E 编辑:至尊宝 归档:https://elasticsearch.cn/article/996 订阅:https://tinyletter.com/elastic-daily
1.Logstash和Elasticsearch 集成。 http://t.cn/EzYLgoO 2.如何在Logstash中设置Elasticsearch输出模板。 http://t.cn/EzYLx6u 3.(自备梯子)怎样真正成为高级开发人员。 http://t.cn/EzYyl2E 编辑:至尊宝 归档:https://elasticsearch.cn/article/996 订阅:https://tinyletter.com/elastic-daily

logstash 给elasticsearch 发送自定义日志数据,出现错误:Could not index event to Elasticsearch...有大神知道问题所在吗?

Logstashsailershen 回复了问题 • 4 人关注 • 4 个回复 • 1445 次浏览 • 1 天前 • 来自相关话题

ES重索引(reindex)时如何不停止写入服务(业务存在少量物理删除文档操作)?

Elasticsearchhufuman 回复了问题 • 13 人关注 • 6 个回复 • 926 次浏览 • 1 天前 • 来自相关话题

query + filter 语句进行筛选

Elasticsearchzqc0512 回复了问题 • 3 人关注 • 2 个回复 • 87 次浏览 • 2 天前 • 来自相关话题

ES库查询数据不一致性

Elasticsearchcode4j 回复了问题 • 3 人关注 • 3 个回复 • 82 次浏览 • 3 天前 • 来自相关话题

es一直在gc overhead的日志,时间在1s内,这样正常吗?

回复

Elasticsearch陈水鱼 发起了问题 • 1 人关注 • 0 个回复 • 36 次浏览 • 3 天前 • 来自相关话题

APM 索引名称问题

回复

Elasticsearchjuin 发起了问题 • 1 人关注 • 0 个回复 • 30 次浏览 • 3 天前 • 来自相关话题

我在家用chrome es head 插件能连上es集群,但是JAVA代码 tsclient连不上

Elasticsearchrochy 回复了问题 • 2 人关注 • 1 个回复 • 51 次浏览 • 3 天前 • 来自相关话题

nested 查询排序结果异常

回复

Elasticsearch胡萝卜超甜 发起了问题 • 1 人关注 • 0 个回复 • 102 次浏览 • 3 天前 • 来自相关话题

求助,集群迁移后出现的问题

Elasticsearchzqc0512 回复了问题 • 2 人关注 • 1 个回复 • 62 次浏览 • 4 天前 • 来自相关话题

无法启动 es6.3.0

Elasticsearchsun_changlong 回复了问题 • 3 人关注 • 2 个回复 • 442 次浏览 • 4 天前 • 来自相关话题

配置elastalert ,2 query hits (2 already seen), 0 matches, 0 alerts sent是什么原因

回复

Elasticsearchjerrymouse 回复了问题 • 1 人关注 • 1 个回复 • 36 次浏览 • 4 天前 • 来自相关话题

该如何一次查询中实现:过滤得到多个子实体同时在一个父实体的父实体分页列表?

Elasticsearchlaoyang360 回复了问题 • 3 人关注 • 2 个回复 • 56 次浏览 • 4 天前 • 来自相关话题

如何实现将mysql 1对多数据导入到es 的nested 嵌套字段中

Elasticsearchlaoyang360 回复了问题 • 4 人关注 • 5 个回复 • 89 次浏览 • 4 天前 • 来自相关话题

怎样订阅Elasticsearch的邮件列表?

回复

Elasticsearchmedcl 回复了问题 • 2 人关注 • 1 个回复 • 36 次浏览 • 5 小时前 • 来自相关话题

ES重索引(reindex)时如何不停止写入服务(业务存在少量物理删除文档操作)?

回复

Elasticsearchhufuman 回复了问题 • 13 人关注 • 6 个回复 • 926 次浏览 • 1 天前 • 来自相关话题

query + filter 语句进行筛选

回复

Elasticsearchzqc0512 回复了问题 • 3 人关注 • 2 个回复 • 87 次浏览 • 2 天前 • 来自相关话题

ES库查询数据不一致性

回复

Elasticsearchcode4j 回复了问题 • 3 人关注 • 3 个回复 • 82 次浏览 • 3 天前 • 来自相关话题

es一直在gc overhead的日志,时间在1s内,这样正常吗?

回复

Elasticsearch陈水鱼 发起了问题 • 1 人关注 • 0 个回复 • 36 次浏览 • 3 天前 • 来自相关话题

APM 索引名称问题

回复

Elasticsearchjuin 发起了问题 • 1 人关注 • 0 个回复 • 30 次浏览 • 3 天前 • 来自相关话题

我在家用chrome es head 插件能连上es集群,但是JAVA代码 tsclient连不上

回复

Elasticsearchrochy 回复了问题 • 2 人关注 • 1 个回复 • 51 次浏览 • 3 天前 • 来自相关话题

nested 查询排序结果异常

回复

Elasticsearch胡萝卜超甜 发起了问题 • 1 人关注 • 0 个回复 • 102 次浏览 • 3 天前 • 来自相关话题

求助,集群迁移后出现的问题

回复

Elasticsearchzqc0512 回复了问题 • 2 人关注 • 1 个回复 • 62 次浏览 • 4 天前 • 来自相关话题

无法启动 es6.3.0

回复

Elasticsearchsun_changlong 回复了问题 • 3 人关注 • 2 个回复 • 442 次浏览 • 4 天前 • 来自相关话题

配置elastalert ,2 query hits (2 already seen), 0 matches, 0 alerts sent是什么原因

回复

Elasticsearchjerrymouse 回复了问题 • 1 人关注 • 1 个回复 • 36 次浏览 • 4 天前 • 来自相关话题

该如何一次查询中实现:过滤得到多个子实体同时在一个父实体的父实体分页列表?

回复

Elasticsearchlaoyang360 回复了问题 • 3 人关注 • 2 个回复 • 56 次浏览 • 4 天前 • 来自相关话题

如何实现将mysql 1对多数据导入到es 的nested 嵌套字段中

回复

Elasticsearchlaoyang360 回复了问题 • 4 人关注 • 5 个回复 • 89 次浏览 • 4 天前 • 来自相关话题

如果搜索词要通过找出拼音,同义词,分词都匹配的结果,是不是在建索引时就得按这三种情况建索引

回复

Elasticsearchrochy 回复了问题 • 3 人关注 • 5 个回复 • 121 次浏览 • 4 天前 • 来自相关话题

Elastic日报 第424期 (2018-10-21)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 20 次浏览 • 19 小时前 • 来自相关话题

1.Logstash和Elasticsearch 集成。 http://t.cn/EzYLgoO 2.如何在Logstash中设置Elasticsearch输出模板。 http://t.cn/EzYLx6u 3.(自备梯子)怎样真正成为高级开发人员。 http://t.cn/EzYyl2E 编辑:至尊宝 归档:https://elasticsearch.cn/article/996 订阅:https://tinyletter.com/elastic-daily
1.Logstash和Elasticsearch 集成。 http://t.cn/EzYLgoO 2.如何在Logstash中设置Elasticsearch输出模板。 http://t.cn/EzYLx6u 3.(自备梯子)怎样真正成为高级开发人员。 http://t.cn/EzYyl2E 编辑:至尊宝 归档:https://elasticsearch.cn/article/996 订阅:https://tinyletter.com/elastic-daily

Elastic日报 第417期 (2018-10-14)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 91 次浏览 • 2018-10-14 10:29 • 来自相关话题

1.使用Amazon Cognito进行Kibana访问控制。 http://t.cn/E7WTASh 2.使用GuardDuty实时监控您的安全性。 http://t.cn/E7WTpbr 3.(自备梯子)如何理解任何编程任务。 http://t.cn/EhkDGBF 活动预告: 1、Elastic 官方开发者认证现场考试+ Elastic 开发者大会 VIP 门票 https://elasticsearch.cn/article/827 编辑:至尊宝 归档:https://elasticsearch.cn/article/830 订阅:https://tinyletter.com/elastic-daily
1.使用Amazon Cognito进行Kibana访问控制。 http://t.cn/E7WTASh 2.使用GuardDuty实时监控您的安全性。 http://t.cn/E7WTpbr 3.(自备梯子)如何理解任何编程任务。 http://t.cn/EhkDGBF 活动预告: 1、Elastic 官方开发者认证现场考试+ Elastic 开发者大会 VIP 门票 https://elasticsearch.cn/article/827 编辑:至尊宝 归档:https://elasticsearch.cn/article/830 订阅:https://tinyletter.com/elastic-daily

Elastic日报 第410期 (2018-09-30)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 202 次浏览 • 2018-09-30 14:45 • 来自相关话题

1.将Apache Pig和Hadoop与Elasticsearch及Elasticsearch-Hadoop Connector一起使用。 http://t.cn/EPkOKwG 2.(自备梯子)日志管理:Graylog vs ELK http://t.cn/EPkpnzZ 3.(自备梯子)如何学习数据科学。 http://t.cn/Ev0BfUZ 活动预告: 1、Elastic 中国开发者大会门票发售中 https://conf.elasticsearch.cn/2018/shenzhen.html 编辑:至尊宝 归档:https://elasticsearch.cn/article/821 订阅:https://tinyletter.com/elastic-daily
1.将Apache Pig和Hadoop与Elasticsearch及Elasticsearch-Hadoop Connector一起使用。 http://t.cn/EPkOKwG 2.(自备梯子)日志管理:Graylog vs ELK http://t.cn/EPkpnzZ 3.(自备梯子)如何学习数据科学。 http://t.cn/Ev0BfUZ 活动预告: 1、Elastic 中国开发者大会门票发售中 https://conf.elasticsearch.cn/2018/shenzhen.html 编辑:至尊宝 归档:https://elasticsearch.cn/article/821 订阅:https://tinyletter.com/elastic-daily

Elastic日报 第403期 (2018-09-23)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 148 次浏览 • 2018-09-23 10:04 • 来自相关话题

1.将Apache Hive与ElasticSearch一起使用。 http://t.cn/EPzJFKK 2.大数据与分析与数据科学:有什么区别? http://t.cn/EPzxm6P 3.(自备梯子)招聘数据科学家之前需要做的3件事。 http://t.cn/EPz6j4f 活动预告: 1、Elastic 中国开发者大会门票发售中 https://conf.elasticsearch.cn/2018/shenzhen.html 编辑:至尊宝 归档:https://elasticsearch.cn/article/814 订阅:https://tinyletter.com/elastic-daily
1.将Apache Hive与ElasticSearch一起使用。 http://t.cn/EPzJFKK 2.大数据与分析与数据科学:有什么区别? http://t.cn/EPzxm6P 3.(自备梯子)招聘数据科学家之前需要做的3件事。 http://t.cn/EPz6j4f 活动预告: 1、Elastic 中国开发者大会门票发售中 https://conf.elasticsearch.cn/2018/shenzhen.html 编辑:至尊宝 归档:https://elasticsearch.cn/article/814 订阅:https://tinyletter.com/elastic-daily

你看懂 Elasticsearch Log 中的 GC 日志了吗?

Elasticsearchrockybean 发表了文章 • 0 个评论 • 258 次浏览 • 2018-09-22 23:29 • 来自相关话题

如果你关注过 elasticsearch 的日志,可能会看到如下类似的内容:

[2018-06-30T17:57:23,848][WARN ][o.e.m.j.JvmGcMonitorService] [qoo--eS] [gc][228384] overhead, spent [2.2s] collecting in the last [2.3s]

[2018-06-30T17:57:29,020][INFO ][o.e.m.j.JvmGcMonitorService] [qoo--eS] [gc][old][228385][160772] duration [5s], collections [1]/[5.1s], total [5s]/[4.4d], memory [945.4mb]->[958.5mb]/[1007.3mb], all_pools {[young] [87.8mb]->[100.9mb]/[133.1mb]}{[survivor] [0b]->[0b]/[16.6mb]}{[old] [857.6mb]->[857.6mb]/[857.6mb]}

看到其中的[gc]关键词你也猜到了这是与 GC 相关的日志,那么你了解每一部分的含义吗?如果不了解,你可以继续往下看了。

我们先从最简单的看起:

  1. 第一部分是日志发生的时间
  2. 第二部分是日志级别,这里分别是WARNINFO
  3. 第三部分是输出日志的类,我们后面也会讲到这个类
  4. 第四部分是当前 ES 节点名称
  5. 第五部分是 gc 关键词,我们就从这个关键词聊起。

友情提示:对 GC 已经了如指掌的同学,可以直接翻到最后看答案。

1. 什么是 GC?

GC,全称是 Garbage Collection (垃圾收集)或者 Garbage Collector(垃圾收集器)。

在使用 C语言编程的时候,我们要手动的通过 mallocfree来申请和释放数据需要的内存,如果忘记释放内存,就会发生内存泄露的情况,即无用的数据占用了宝贵的内存资源。而Java 语言编程不需要显示的申请和释放内存,因为 JVM 可以自动管理内存,这其中最重要的一部分就是 GC,即 JVM 可以自主地去释放无用数据(垃圾)占用的内存。

我们研究 GC 的主要原因是 GC 的过程会有 Stop The World(STW)的情况发生,即此时用户线程会停止工作,如果 STW 的时间过长,则应用的可用性、实时性等就下降的很厉害。

GC主要解决如下3个问题:

  1. 如何找到垃圾?
  2. 如何回收垃圾?
  3. 何时回收垃圾?

我们一个个来看下。

1.1 如何找到垃圾?

所谓垃圾,指的是不再被使用(引用)的对象。Java 的对象都是在堆(Heap)上创建的,我们这里默认也只讨论堆。那么现在问题就变为如何判定一个对象是否还有被引用,思路主要有如下两种:

  1. 引用计数法,即在对象被引用时加1,去除引用时减1,如果引用值为0,即表明该对象可回收了。
  2. 可达性分析法,即通过遍历已知的存活对象(GC Roots)的引用链来标记出所有存活对象

方法1简单粗暴效率高,但准确度不行,尤其是面对互相引用的垃圾对象时无能为力。

方法2是目前常用的方法,这里有一个关键是 GC Roots,它是判定的源头,感兴趣的同学可以自己去研究下,这里就不展开讲了。

1.2 如何回收垃圾?

垃圾找到了,该怎么回收呢?看起来似乎是个很傻的问题。直接收起来扔掉不就好了?!对应到程序的操作,就是直接将这些对象占用的空间标记为空闲不就好了吗?那我们就来看一下这个基础的回收算法:标记-清除(Mark-Sweep)算法。

1.2.1 标记-清除 算法(Mark Sweep)

该算法很简单,使用通过可达性分析分析方法标记出垃圾,然后直接回收掉垃圾区域。它的一个显著问题是一段时间后,内存会出现大量碎片,导致虽然碎片总和很大,但无法满足一个大对象的内存申请,从而导致 OOM,而过多的内存碎片(需要类似链表的数据结构维护),也会导致标记和清除的操作成本高,效率低下,如下图所示:

1.2.2 复制算法(Copying)

为了解决上面算法的效率问题,有人提出了复制算法。它将可用内存一分为二,每次只用一块,当这一块内存不够用时,便触发 GC,将当前存活对象复制(Copy)到另一块上,以此往复。这种算法高效的原因在于分配内存时只需要将指针后移,不需要维护链表等。但它最大的问题是对内存的浪费,使用率只有 50%。

但这种算法在一种情况下会很高效:Java 对象的存活时间极短。据 IBM 研究,Java 对象高达 98% 是朝生夕死的,这也意味着每次 GC 可以回收大部分的内存,需要复制的数据量也很小,这样它的执行效率就会很高。

1.2.3 标记-整理算法(Mark Compact)

该算法解决了第1中算法的内存碎片问题,它会在回收阶段将所有内存做整理,如下图所示:

但它的问题也在于增加了整理阶段,也就增加了 GC 的时间。

1.2.4 分代收集算法(Generation Collection)

既然大部分 Java 对象是朝生夕死的,那么我们将内存按照 Java 生存时间分为 新生代(Young)老年代(Old),前者存放短命僧,后者存放长寿佛,当然长寿佛也是由短命僧升级上来的。然后针对两者可以采用不同的回收算法,比如对于新生代采用复制算法会比较高效,而对老年代可以采用标记-清除或者标记-整理算法。这种算法也是最常用的。JVM Heap 分代后的划分一般如下所示,新生代一般会分为 Eden、Survivor0、Survivor1区,便于使用复制算法。

将内存分代后的 GC 过程一般类似下图所示:

  1. 对象一般都是先在 Eden区创建
  2. Eden区满,触发 Young GC,此时将 Eden中还存活的对象复制到 S0中,并清空 Eden区后继续为新的对象分配内存
  3. Eden区再次满后,触发又一次的 Young GC,此时会将 EdenS0中存活的对象复制到 S1中,然后清空EdenS0后继续为新的对象分配内存
  4. 每经过一次 Young GC,存活下来的对象都会将自己存活次数加1,当达到一定次数后,会随着一次 Young GC 晋升到 Old
  5. Old区也会在合适的时机进行自己的 GC

1.2.5 常见的垃圾收集器

前面我们讲了众多的垃圾收集算法,那么其具体的实现就是垃圾收集器,也是我们实际使用中会具体用到的。现代的垃圾收集机制基本都是分代收集算法,而 YoungOld区分别有不同的垃圾收集器,简单总结如下图:

从上图我们可以看到 YoungOld区有不同的垃圾收集器,实际使用时会搭配使用,也就是上图中两两连线的收集器是可以搭配使用的。这些垃圾收集器按照运行原理大概可以分为如下几类:

  • Serial GC串行,单线程的收集器,运行 GC 时需要停止所有的用户线程,且只有一个 GC 线程
  • Parallel GC并行,多线程的收集器,是 Serial 的多线程版,运行时也需要停止所有用户线程,但同时运行多个 GC 线程,所以效率高一些
  • Concurrent GC并发,多线程收集器,GC 分多阶段执行,部分阶段允许用户线程与 GC 线程同时运行,这也就是并发的意思,大家要和并行做一个区分。
  • 其他

我们下面简单看一下他们的运行机制。

1.2.5.1 Serial GC

该类 Young区的为 Serial GCOld区的为Serial Old GC。执行大致如下所示:

1.2.5.2 Parallel GC

该类Young 区的有 ParNewParallel ScavengeOld 区的有Parallel Old。其运行机制如下,相比 Serial GC ,其最大特点在于 GC 线程是并行的,效率高很多:

1.2.5.3 Concurrent Mark-Sweep GC

该类目前只是针对 Old 区,最常见就是CMS GC,它的执行分为多个阶段,只有部分阶段需要停止用户进程,这里不详细介绍了,感兴趣可以去找相关文章来看,大体执行如下:

1.2.5.4 其他

目前最新的 GC 有G1GCZGC,其运行机制与上述均不相同,虽然他们也是分代收集算法,但会把 Heap 分成多个 region 来做处理,这里不展开讲,感兴趣的可以参看最后参考资料的内容。

1.2.6 Elasticsearch 的 GC 组合

Elasticsearch 默认的 GC 配置是CMS GC ,其 Young 区ParNewOld 区CMS,大家可以在 config/jvm.options中看到如下的配置:

## GC configuration
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly

1.3 何时进行回收?

现在我们已经知道如何找到和回收垃圾了,那么什么时候回收呢?简单总结如下:

  1. Young 区的GC 都是在 Eden 区满时触发
  2. Serial Old 和 Parallel Old 在 Old 区是在 Young GC 时预测Old 区是否可以为 young 区 promote 到 old 区 的 object 分配空间,如果不可用则触发 Old GC。这个也可以理解为是 Old区满时。
  3. CMS GC 是在 Old 区大小超过一定比例后触发,而不是 Old 区满。这个原因在于 CMS GC 是并发的算法,也就是说在 GC 线程收集垃圾的时候,用户线程也在运行,因此需要预留一些 Heap 空间给用户线程使用,防止由于无法分配空间而导致 Full GC 发生。

2. GC Log 如何阅读?

前面讲了这么多,终于可以回到开篇的问题了,我们直接来看答案

[2018-06-30T17:57:23,848][WARN ][o.e.m.j.JvmGcMonitorService] [qoo--eS] [gc][228384] overhead, spent [2.2s] collecting in the last [2.3s]

[gc][这是第228384次GC 检查] 在最近 2.3 s 内花了 2.2s 用来做垃圾收集,这占比似乎有些过了,请抓紧来关注下。

[2018-06-30T17:57:29,020][INFO ][o.e.m.j.JvmGcMonitorService] [qoo--eS] [gc][old][228385][160772] duration [5s], collections [1]/[5.1s], total [5s]/[4.4d], memory [945.4mb]->[958.5mb]/[1007.3mb], all_pools {[young] [87.8mb]->[100.9mb]/[133.1mb]}{[survivor] [0b]->[0b]/[16.6mb]}{[old] [857.6mb]->[857.6mb]/[857.6mb]}

我们直接来看具体的含义好了,相信有了前面的 GC 基础知识,大家在看这里解释的时候就非常清楚了。

  • [gc][本次是 old GC][这是第228385次 GC 检查][从 JVM 启动至今发生的第 160772次 GC]

  • duration [本次检查到的 GC 总耗时 5 秒,可能是多次的加和],

  • collections [从上次检查至今总共发生1次 GC]/[从上次检查至今已过去 5.1 秒],

  • total [本次检查到的 GC 总耗时为 5 秒]/[从 JVM 启动至今发生的 GC 总耗时为 4.4 天],

  • memory [ GC 前 Heap memory 空间]->[GC 后 Heap memory 空间]/[Heap memory 总空间],

  • all_pools(分代部分的详情) {[young 区][GC 前 Memory ]->[GC后 Memory]/[young区 Memory 总大小] } {[survivor 区][GC 前 Memory ]->[GC后 Memory]/[survivor区 Memory 总大小] }{[old 区][GC 前 Memory ]->[GC后 Memory]/[old区 Memory 总大小] }

3. 看看源码

从日志中我们可以看到输出这些日志的类名叫做JvmGcMonitorService,我们去源码中搜索很快会找到它/Users/rockybean/code/elasticsearch/core/src/main/java/org/elasticsearch/monitor/jvm/JvmGcMonitorService.java,这里就不详细展开讲解源码了,它执行的内容大概如下图所示:

关于打印日志的格式在源码也有,如下所示:

private static final String SLOW_GC_LOG_MESSAGE =
"[gc][{}][{}][{}] duration [{}], collections [{}]/[{}], total [{}]/[{}], memory [{}]->[{}]/[{}], all_pools {}";
private static final String OVERHEAD_LOG_MESSAGE = "[gc][{}] overhead, spent [{}] collecting in the last [{}]";

另外细心的同学会发现输出的日志中 gc 只分了 young 和 old ,原因在于 ES 对 GC Name 做了封装,封装的类为:org.elasticsearch.monitor.jvm.GCNames,相关代码如下:

    public static String getByMemoryPoolName(String poolName, String defaultName) {
        if ("Eden Space".equals(poolName) || "PS Eden Space".equals(poolName) || "Par Eden Space".equals(poolName) || "G1 Eden Space".equals(poolName)) {
            return YOUNG;
        }
        if ("Survivor Space".equals(poolName) || "PS Survivor Space".equals(poolName) || "Par Survivor Space".equals(poolName) || "G1 Survivor Space".equals(poolName)) {
            return SURVIVOR;
        }
        if ("Tenured Gen".equals(poolName) || "PS Old Gen".equals(poolName) || "CMS Old Gen".equals(poolName) || "G1 Old Gen".equals(poolName)) {
            return OLD;
        }
        return defaultName;
    }

    public static String getByGcName(String gcName, String defaultName) {
        if ("Copy".equals(gcName) || "PS Scavenge".equals(gcName) || "ParNew".equals(gcName) || "G1 Young Generation".equals(gcName)) {
            return YOUNG;
        }
        if ("MarkSweepCompact".equals(gcName) || "PS MarkSweep".equals(gcName) || "ConcurrentMarkSweep".equals(gcName) || "G1 Old Generation".equals(gcName)) {
            return OLD;
        }
        return defaultName;
    }

在上面的代码中,你会看到很多我们在上一节中提到的 GC 算法的名称。

至此,源码相关部分也讲解完毕,感兴趣的大家可以自行去查阅。

4. 总结

讲解 GC 的文章已经很多,本文又唠唠叨叨地讲一遍基础知识,是希望对于第一次了解 GC 的同学有所帮助。因为只有了解了这些基础知识,你才不至于被这些 GC 的输出吓懵。希望本文对你理解 ES 的 GC 日志 有所帮助。

5. 参考资料

  1. Java Hotspot G1 GC的一些关键技术(https://mp.weixin.qq.com/s/4ufdCXCwO56WAJnzng_-ow
  2. Understanding Java Garbage Collection(https://www.cubrid.org/blog/understanding-java-garbage-collection
  3. 《深入理解Java虚拟机:JVM高级特性与最佳实践》

6. 相关推荐

如果你想深入的了解 JAVA GC 的知识,可以关注 ElasticTalk 公众号,回复 GC关键词后即可获取作者推荐的电子书等资料。

elasticTalk,qrcode

Elastic日报 第396期 (2018-09-16)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 183 次浏览 • 2018-09-16 08:00 • 来自相关话题

1.(自备梯子)Kibana的第三方地图和平铺服务。 http://t.cn/EvfhXE9 2.Logstash教程:快速入门指南。 http://t.cn/Evf7oTo 3.(自备梯子)苹果想要挽救你的生命。 http://t.cn/Evfzk6z 活动预告: 1、Elastic 中国开发者大会门票发售中 https://conf.elasticsearch.cn/2018/shenzhen.html 编辑:至尊宝 归档:https://elasticsearch.cn/article/801 订阅:https://tinyletter.com/elastic-daily
1.(自备梯子)Kibana的第三方地图和平铺服务。 http://t.cn/EvfhXE9 2.Logstash教程:快速入门指南。 http://t.cn/Evf7oTo 3.(自备梯子)苹果想要挽救你的生命。 http://t.cn/Evfzk6z 活动预告: 1、Elastic 中国开发者大会门票发售中 https://conf.elasticsearch.cn/2018/shenzhen.html 编辑:至尊宝 归档:https://elasticsearch.cn/article/801 订阅:https://tinyletter.com/elastic-daily

Elastic日报 第389期 (2018-09-09)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 216 次浏览 • 2018-09-09 11:25 • 来自相关话题

1.ELK Stack完整指南 - 2018年。 http://t.cn/R9RHO6l 2.安全最佳实践:高增长初创企业的经验教训。 http://t.cn/RsoQXK2 3.(自备梯子)再见,面向对象编程。 http://t.cn/Rt4icdt 活动预告: 1、Elastic 中国开发者大会门票发售中 https://conf.elasticsearch.cn/2018/shenzhen.html 编辑:至尊宝 归档:https://elasticsearch.cn/article/793 订阅:https://tinyletter.com/elastic-daily
1.ELK Stack完整指南 - 2018年。 http://t.cn/R9RHO6l 2.安全最佳实践:高增长初创企业的经验教训。 http://t.cn/RsoQXK2 3.(自备梯子)再见,面向对象编程。 http://t.cn/Rt4icdt 活动预告: 1、Elastic 中国开发者大会门票发售中 https://conf.elasticsearch.cn/2018/shenzhen.html 编辑:至尊宝 归档:https://elasticsearch.cn/article/793 订阅:https://tinyletter.com/elastic-daily

Elastic日报 第382期 (2018-09-02)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 178 次浏览 • 2018-09-02 08:40 • 来自相关话题

1.如何将Heroku日志导入到Logsene / Managed ELK Stack。 http://t.cn/RFSfTz6 2.5分钟将CoreOS日志导入到ELK。 http://t.cn/RFSxz0S 3.苹果圈:iPhone XS推出9月12日确认,新iPhone SE 2泄漏,苹果公司的恐慌方案。 http://t.cn/RFS9bWj 活动预告: 1、Elastic 中国开发者大会门票发售中 https://conf.elasticsearch.cn/2018/shenzhen.html 2、Elastic Meetup 9月8日 北京线下交流活动免费报名中 https://elasticsearch.cn/article/759 编辑:至尊宝 归档:https://elasticsearch.cn/article/782 订阅:https://tinyletter.com/elastic-daily 
1.如何将Heroku日志导入到Logsene / Managed ELK Stack。 http://t.cn/RFSfTz6 2.5分钟将CoreOS日志导入到ELK。 http://t.cn/RFSxz0S 3.苹果圈:iPhone XS推出9月12日确认,新iPhone SE 2泄漏,苹果公司的恐慌方案。 http://t.cn/RFS9bWj 活动预告: 1、Elastic 中国开发者大会门票发售中 https://conf.elasticsearch.cn/2018/shenzhen.html 2、Elastic Meetup 9月8日 北京线下交流活动免费报名中 https://elasticsearch.cn/article/759 编辑:至尊宝 归档:https://elasticsearch.cn/article/782 订阅:https://tinyletter.com/elastic-daily 

Curator从入门到实战

ElasticsearchLeon J 发表了文章 • 1 个评论 • 480 次浏览 • 2018-08-30 22:05 • 来自相关话题

Curator 是elasticsearch 官方的一个索引管理工具,可以通过配置文件的方式帮助我们对指定的一批索引进行创建/删除、打开/关闭、快照/恢复等管理操作。

场景

比如,出于读写性能的考虑,我们通常会把基于时间的数据按时间来创建索引。

indices当数据量到达一定量级时,为了节省内存或者磁盘空间,我们往往会根据实际情况选择关闭或者删除一定时间之前的索引。通常我们会写一段脚本调用elasticsearch的api,放到crontab中定期执行。这样虽然可以达到目的,但是脚本多了之后会变得难以维护。

Curator是如何解决这类问题的呢?我们一步一步来:

安装

首先,Curator是基于python实现的,我们可以直接通过pip来安装,这种方式最简单。

pip install elasticsearch-curator

基本配置

接下来,需要为 Curator 配置es连接:

# ~/.curator/curator.yml

client:
  hosts:
    - 127.0.0.1
  port: 9200

logging:
  loglevel: INFO

其中hosts 允许配置多个地址,但是只能属于同一个集群。

这边只列举了最基本的配置,官方文档中包含了更详细的配置。

动作配置

然后需要配置我们需要执行的动作,每个动作会按顺序执行:

# /etc/curator/actions/maintain_log.yml

actions:
  1:
    #创建第二天的索引
    action: create_index
    description: "create new time-based index for log-*"
    options:
      name: '<log-{now/d+1d}>'
  2:
    #删除3天前的索引
    action: delete_indices
    description: "delete outdated indices for log-*"
    filters:
    - filtertype: pattern
      kind: prefix
      value: log
    - filtertype: age
      source: name
      direction: older
      timestring: '%Y.%m.%d'
      unit: days
      unit_count: 3

action 定义了需要执行的动作,curator支持十多种动作,可以在官方文档查看完整的动作列表。

options 定义了执行动作所需的参数,不同动作的参数也不尽相同,具体文档中都有写明。

filters 定义了动作的执行对象,通过设置filter,可以过滤出我们需要操作的索引。同一个action下的filter之间是的关系。比如在上面的定义中,delete_indices下定义了两个filters:

  • 模式匹配:匹配前缀为log的索引
  • “年龄”匹配:根据索引名中“%Y.%m.%d”时间格式,过滤出3天以前的索引

curator支持十多种filter,可以在官方文档查看完整列表。

执行

最后,我们通过curator命令行工具来执行:

curator --config /etc/curator/curator.yml /etc/curator/actions/maintain_log.yml

得到命令行输出:

2018-08-30 12:31:26,829 INFO      Preparing Action ID: 1, "create_index"
2018-08-30 12:31:26,841 INFO      Trying Action ID: 1, "create_index": create new time-based index for log-*
2018-08-30 12:31:26,841 INFO      "<log-{now/d+1d}>" is using Elasticsearch date math.
2018-08-30 12:31:26,841 INFO      Creating index "<log-{now/d+1d}>" with settings: {}
2018-08-30 12:31:27,049 INFO      Action ID: 1, "create_index" completed.
2018-08-30 12:31:27,050 INFO      Preparing Action ID: 2, "delete_indices"
2018-08-30 12:31:27,058 INFO      Trying Action ID: 2, "delete_indices": delete outdated indices for log-*
2018-08-30 12:31:27,119 INFO      Deleting selected indices: ['log-2018.08.24', 'log-2018.08.25', 'log-2018.08.27', 'log-2018.08.26', 'log-2018.08.23']
2018-08-30 12:31:27,119 INFO      ---deleting index log-2018.08.24
2018-08-30 12:31:27,120 INFO      ---deleting index log-2018.08.25
2018-08-30 12:31:27,120 INFO      ---deleting index log-2018.08.27
2018-08-30 12:31:27,120 INFO      ---deleting index log-2018.08.26
2018-08-30 12:31:27,120 INFO      ---deleting index log-2018.08.23
2018-08-30 12:31:27,282 INFO      Action ID: 2, "delete_indices" completed.
2018-08-30 12:31:27,283 INFO      Job completed.

从日志中可以看到,我们已经成功创建了隔天的索引,并删除了28号以前的索引。

定时执行

配置好curator后,还需要配置定时任务

使用crontab -e编辑crontab,

添加一行:

0 23 * * * /usr/local/bin/curator --config /root/.curator/curator.yml /etc/curator/actions/maintain_log.yml >> /var/curator.log 2>&1

crontab配置中的第一段是执行的周期,6个值分别是“分 时 日 月 周”,*表示全部。所以这段配置的含义是在每天23点执行我们的这段脚本。

单个执行

除了定时任务,我们也可以在不依赖action配置文件的情况下用curator执行一些临时的批量操作。curator提供了curator_cli的命令来执行单个action,比如我们想对所有log开头的索引做快照,使用一条命令即可完成:

curator_cli snapshot --repository repo_name --filter_list {"filtertype": "pattern","kind": "prefix", "value": "log"}

是不是特别方便?

执行流程

image-20180830200126973

在命令执行过程中,Curator 会进行以下几步操作:

  1. 从ES拉取所有的索引信息
  2. 根据设置的过滤条件过滤出需要操作的索引
  3. 对过滤后的索引执行指定的动作

复杂需求

实际生产中,会有一些更复杂的需求,简单的action和filter组合并不能满足我们的业务。Curator还提供了python包,方便我们自己写脚本时调用它提供的actions和filters,减少我们的开发工作量。

以上通过一个实际的场景向大家介绍了Curator的使用方式,但是只用到了它一小部分的功能。大家可以通过文中的链接查看官方文档,发掘出更多的使用姿势。希望对大家有所帮助!

elasticTalk,qrcode

​Elastic日报 第375期 (2018-08-26)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 194 次浏览 • 2018-08-26 08:22 • 来自相关话题

1.Kibana高级搜索入门。 http://t.cn/Rk1SYUC 2.(自备梯子)四大NoSQL数据库。 http://t.cn/Rk1anR2 3.(自备梯子)您必须在“按时交付的软件”和“良好软件”之间进行选择。 http://t.cn/Rk1abPX 活动预告: 1、Elastic 中国开发者大会最后一波早鸟票发售进行中 https://conf.elasticsearch.cn/2018/shenzhen.html 2、Elastic Meetup 9月8日 北京线下沙龙正在报名中 https://elasticsearch.cn/article/759 编辑:至尊宝 归档:https://elasticsearch.cn/article/772 订阅:https://tinyletter.com/elastic-daily
1.Kibana高级搜索入门。 http://t.cn/Rk1SYUC 2.(自备梯子)四大NoSQL数据库。 http://t.cn/Rk1anR2 3.(自备梯子)您必须在“按时交付的软件”和“良好软件”之间进行选择。 http://t.cn/Rk1abPX 活动预告: 1、Elastic 中国开发者大会最后一波早鸟票发售进行中 https://conf.elasticsearch.cn/2018/shenzhen.html 2、Elastic Meetup 9月8日 北京线下沙龙正在报名中 https://elasticsearch.cn/article/759 编辑:至尊宝 归档:https://elasticsearch.cn/article/772 订阅:https://tinyletter.com/elastic-daily

Elastic日报 第368期 (2018-08-19)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 197 次浏览 • 2018-08-19 10:09 • 来自相关话题

1.如何使用Nginx作为CentOS 7上的反向代理来保护Kibana。 http://t.cn/RDes1PI 2.如何使用ELK stack管理Nginx日志。 http://t.cn/RkUKe2L 3.(自备梯子)数据科学项目最重要的部分是写博客文章。 http://t.cn/RkU9jJW 活动预告: 1、Elastic Meetup 北京线下沙龙征稿中 https://elasticsearch.cn/article/759 2、Elastic 中国开发者大会预热票今天发售! https://conf.elasticsearch.cn/2018/shenzhen.html  编辑:至尊宝 归档:https://elasticsearch.cn/article/763 订阅:https://tinyletter.com/elastic-daily
1.如何使用Nginx作为CentOS 7上的反向代理来保护Kibana。 http://t.cn/RDes1PI 2.如何使用ELK stack管理Nginx日志。 http://t.cn/RkUKe2L 3.(自备梯子)数据科学项目最重要的部分是写博客文章。 http://t.cn/RkU9jJW 活动预告: 1、Elastic Meetup 北京线下沙龙征稿中 https://elasticsearch.cn/article/759 2、Elastic 中国开发者大会预热票今天发售! https://conf.elasticsearch.cn/2018/shenzhen.html  编辑:至尊宝 归档:https://elasticsearch.cn/article/763 订阅:https://tinyletter.com/elastic-daily

推荐一个同步Mysql数据到Elasticsearch的工具

ElasticsearchMCTW 发表了文章 • 12 个评论 • 924 次浏览 • 2018-08-14 15:47 • 来自相关话题

把Mysql的数据同步到Elasticsearch是个很常见的需求,但在Github里找到的同步工具用起来或多或少都有些别扭。 例如:某记录内容为"aaa|bbb|ccc",将其按|分割成数组同步到es,这样的简单任务都难以实现,再加上配置繁琐,文档语焉不详... 所以我写了个同步工具MysqlsMom:力求用最简单的配置完成复杂的同步任务。目前除了我所在的部门,也有越来越多的互联网公司在生产环境中使用该工具了。 欢迎各位大佬进行试用并提出意见,任何建议、鼓励、批评都受到欢迎。 github: https://github.com/m358807551/mysqlsmom Alt text

简介:同步 Mysql 数据到 elasticsearch 的工具; QQ、微信:358807551

特点

  1. Python 编写;
  2. 支持基于 sql 语句的全量同步,基于 binlog 的增量同步,基于更新字段的增量同步三种同步方式;
  3. 全量更新只占用少量内存;支持通过sql语句同步数据;
  4. 增量更新自动断点续传;
  5. 取自 Mysql 的数据可经过一系列自定义函数的处理后再同步至 Elasticsearch
  6. 能用非常简单的配置完成复杂的同步任务;

环境

  • python2.7;
  • 增量同步需开启 redis
  • 分析 binlog 的增量同步需要 Mysql 开启 binlogbinlog-format=row);

快速开始

全量同步MySql数据到es

  1. clone 项目到本地;

  2. 安装依赖;

    cd mysqlsmom
    pip install -r requirements.txt

    默认支持 elasticsearch-2.4版本,支持其它版本请运行(将5.4换成需要的elasticsearch版本)

    pip install --upgrade elasticsearch==5.4
  3. 编辑 ./config/example_init.py,按注释提示修改配置;

    # coding=utf-8
    
    STREAM = "INIT"
    
    # 修改数据库连接
    CONNECTION = {
       'host': '127.0.0.1',
       'port': 3306,
       'user': 'root',
       'passwd': ''
    }
    
    # 修改elasticsearch节点
    NODES = [{"host": "127.0.0.1", "port": 9200}]
    
    TASKS = [
       {
           "stream": {
               "database": "test_db",  # 在此数据库执行sql语句
               "sql": "select * from person"  # 将该sql语句选中的数据同步到 elasticsearch
           },
           "jobs": [
               {
                   "actions": ["insert", "update"],
                   "pipeline": [
                       {"set_id": {"field": "id"}}  # 默认设置 id字段的值 为elasticsearch中的文档id
                   ],
                   "dest": {
                       "es": {
                           "action": "upsert",
                           "index": "test_index",   # 设置 index
                           "type": "test",          # 设置 type
                           "nodes": NODES
                       }
                   }
               }
           ]
       }
    ]
  4. 运行

    cd mysqlsmom
    python mysqlsmom.py ./config/example_init.py

    等待同步完成即可;

分析 binlog 的增量同步

  1. 确保要增量同步的MySql数据库开启binlog,且开启redis(为了存储最后一次读到的binlog文件名及读到的位置。未来可能支持本地文件存储该信息。)

  2. 下载项目到本地,且安装好依赖后,编辑 ./config/example_init.py,按注释提示修改配置;

    # coding=utf-8
    
    STREAM = "BINLOG"
    SERVER_ID = 99  # 确保每个用于binlog同步的配置文件的SERVER_ID不同;
    SLAVE_UUID = __name__
    
    # 配置开启binlog权限的MySql连接
    BINLOG_CONNECTION = {
       'host': '127.0.0.1',
       'port': 3306,
       'user': 'root',
       'passwd': ''
    }
    
    # 配置es节点
    NODES = [{"host": "127.0.0.1", "port": 9200}]
    
    TASKS = [
       {
           "stream": {
               "database": "test_db",  # [table]所在的数据库
               "table": "person"  # 监控该表的binlog
           },
           "jobs": [
               {
                   "actions": ["insert", "update"],
                   "pipeline": [
                       {"only_fields": {"fields": ["id", "name", "age"]}},  # 只同步这些字段到es,注释掉该行则同步全部字段的值到es
                       {"set_id": {"field": "id"}}  # 设置es中文档_id的值取自 id(或根据需要更改)字段
                   ],
                   "dest": {
                       "es": {
                           "action": "upsert",
                           "index": "test_index",  # 设置 index
                           "type": "test",         # 设置 type
                           "nodes": NODES
                       }
                   }
               }
           ]
       }
    ]
  3. 运行

    cd mysqlsmom
    python mysqlsmom.py ./config/example_binlog.py

    该进程会一直运行,实时同步新增和更改后的数据到elasticsearch;

    注意:第一次运行该进程时不会同步MySql中已存在的数据,从第二次运行开始,将接着上次同步停止时的位置继续同步;

    同步旧数据请看全量同步MySql数据到es

基于更新时间的增量同步

Mysql 表中有类似 update_time 的时间字段,且在每次插入、更新数据后将该字段的值设置为操作时间,则可在不用开启 binlog 的情况下进行增量同步。

  1. 下载项目到本地,且安装好依赖后,编辑 ./config/example_cron.py,按注释提示修改配置;

    # coding=utf-8
    
    STREAM = "CRON"
    
    # 修改数据库连接
    CONNECTION = {
       'host': '127.0.0.1',
       'port': 3306,
       'user': 'root',
       'passwd': ''
    }
    
    # redis存储上次同步时间等信息
    REDIS = {
       "host": "127.0.0.1",
       "port": 6379,
       "db": 0,
       "password": "password",  # 不需要密码则注释或删掉该行
    }
    
    # 一次同步 BULK_SIZE 条数据到elasticsearch,不设置该配置项默认为1
    BULK_SIZE = 1
    
    # 修改elasticsearch节点
    NODES = [{"host": "127.0.0.1", "port": 9200}]
    
    TASKS = [
       {
           "stream": {
               "database": "test_db",  # 在此数据库执行sql语句
               "sql": "select id, name from person where update_time >= ?",  # 将该sql语句选中的数据同步到 elasticsearch
               "seconds": 10,  # 每隔 seconds 秒同步一次,
               "init_time": "2018-08-15 18:05:47"  # 只有第一次同步会加载
           },
           "jobs": [
               {
                   "pipeline": [
                       {"set_id": {"field": "id"}}  # 默认设置 id字段的值 为 es 中的文档id
                   ],
                   "dest": {
                       "es": {
                           "action": "upsert",
                           "index": "test_index",   # 设置 index
                           "type": "test"          # 设置 type
                       }
                   }
               }
           ]
       }
    ]
  2. 运行

    cd mysqlsmom
    python mysqlsmom.py ./config/example_cron.py

组织架构

Alt text

Mysqlsmom 使用实战

Mysqlsmom 的灵活性依赖于:

  • row_handlers.py 中添加自定义函数对取自Mysql的数据进行二次加工。
  • row_filters.py 中添加自定义函数决定是否要同步某一条数据。
  • config/ 目录下的任意配置文件应用上面的函数。

如果不了解 Python 也没关系,上述两个文件中自带的函数足以应付大多数种情况,遇到特殊的同步需求可以在 Github 发起 issue 或通过微信、QQ联系作者。

同步多张表

在一个配置文件中即可完成:

...
TASKS = [
    # 同步表1
    {
        "stream": {
            "database": "数据库名1",
            "table": "表名1"
        },
        "jobs": [...]
    }
    # 同步表2
    {
        "stream": {
            "database": "数据库名2",
            "table": "表名2"
        },
        "jobs": [...]
    }
]

一个 Mysql Connection 对应一个配置文件。

一张表同步到多个索引

分为两种情况。

一种是把相同的数据同步到不同的索引,配置如下:

...
TASKS = [
    {
        "stream": {...},
        "jobs": [
            {
                "actions": [...],
                "pipeline": [...],
                "dest": [
                    # 同步到索引1
                    {
                        "es": {"action": "upsert", "index": "索引1", "type": "类型1", "nodes": NODES},
                    },
                    # 同步到索引2
                    {
                        "es": {"action": "upsert", "index": "索引2", "type": "类型2", "nodes": NODES},
                    }
                ]
            }
        ]
    },
    ...
]

另一种是把同一个表产生的数据经过不同的 pipeline 同步到不同的索引:

...
TASKS = [
    {
        "stream": {...},
        "jobs": [
            {
                "actions": {...},
                "pipeline": [...],  # 对数据经过一系列处理
                "dest": {"es": {"index": "索引1", ...}}  # 同步到索引1
            },
            {
                "actions": {...},
                "pipeline": [...],  # 与上面的pipeline不同
                "dest": {"es": {"index": "索引2", ...}}  # 同步到索引2
            }
        ]
    }
]
  • TASKS 中的每一项对应一张要同步的表。
  • jobs 中的每一项对应对一条记录的一种处理方式。
  • dest 中的每一项对应一个es索引类型。

只同步某些字段

对每条来自 Mysql 的 记录的处理都在 pipeline 中进行处理。

"pipeline": [
    {"only_fields": {"fields": ["id", "name"]}},  # 只同步 id 和 name字段
    {"set_id": {"field": "id"}}  # 然后设置 id 字段为es中文档的_id
]

字段重命名

对于 Mysql 中的字段名和 elasticsearch 中的域名不一致的情况:

"pipeline": [
    # 将name重命名为name1,age 重命名为age1
    {"replace_fields": {"name": ["name1"], "age": ["age1"]}},
    {"set_id": {"field": "id"}}
]

pipeline 会依次执行处理函数,上面的例子等价于:

"pipeline": [
    # 先重命名 name 为 name1
    {"replace_fields": {"name": ["name1"]}},
    # 再重命名 age 为 age1
    {"replace_fields": {"age": ["age1"]}},
    {"set_id": {"field": "id"}}
]

还有一种特殊情形,es 中两个字段存相同的数据,但是分词方式不同。

例如 name_default 的分析器为 defaultname_raw 设置为不分词,需要将 name 的值同时同步到这两个域:

"pipeline": [
    {"replace_fields": {"name": ["name_default", "name_raw"]}},
    {"set_id": {"field": "id"}}
]

当然上述问题有一个更好的解决方案,在 esmappings 中配置 name 字段的 fields 属性即可,这超出了本文档的内容。

切分字符串为数组

有时 Mysql 存储字符串类似:"aaa|bbb|ccc",希望转化成数组: ["aaa", "bbb", "ccc"] 再进行同步

"pipeline": [
    # tags 存储类似"aaa|bbb|ccc"的字符串,将 tags 字段的值按符号 `|` 切分成数组
    {"split": {"field": "tags", "flag": "|"}},
    {"set_id": {"field": "id"}}
] 

同步删除文档

只有 binlog 同步 能实现删除 elasticsearch 中的文档,配置如下:

TASKS = [
    {
        "stream": {
            "database": "test_db",
            "table": "person"
        },
        "jobs": [
            # 插入、更新
            {
                "actions": ["insert", "update"],
                "pipeline": [
                    {"set_id": {"field": "id"}}  # 设置 id 字段的值为 es 中文档 _id
                ],
                "dest": {
                    "es": {
                        "action": "upsert",
                        ...
                    }
                }
            },
            # 重点在这里,配置删除
            {
                "actions": ["delete"],  # 当读取到 binlog 中该表的删除操作时
                "pipeline": [{"set_id": {"field": "id"}}],  # 要删除的文档 _id
                "dest": {
                    "es": {
                        "action": "delete",  # 在 es 中执行删除操作
                        ...  # 与上面的 index 和 type 相同
                    }
                }
            }
        ]
    },
    ...
]

更多示例正在更新

常见问题

为什么我的增量同步不及时?

  1. 连接本地数据库增量同步不及时

    该情况暂未收到过反馈,如能复现请联系作者。

  2. 连接线上数据库发现增量同步不及时

    2.1 推荐使用内网IP连接数据库。连接线上数据库(如开启在阿里、腾讯服务器上的Mysql)时,推荐使用内网IP地址,因为外网IP会受到带宽等限制导致获取binlog数据速度受限,最终可能造成同步延时。

待改进

  1. 据部分用户反馈,全量同步百万级以上的数据性能不佳。

未完待续

文档近期会较频繁更新,任何问题、建议都收到欢迎,请在issues留言,会在24小时内回复;或联系QQ、微信: 358807551;

Elastic日报 第361期 (2018-08-12)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 215 次浏览 • 2018-08-12 09:58 • 来自相关话题

1.(自备梯子)ELK Stack 详细配置。 http://t.cn/RDWHBvW 2.Elasticsearch安全性:身份验证,加密,备份。 http://t.cn/RDWl15I 3.(自备梯子)数据科学中必备的数学知识。 http://t.cn/RDWYsfF 活动预告: Elastic 中国开发者大会预热票发售进行中  https://conf.elasticsearch.cn/2018/shenzhen.html 编辑:至尊宝 归档:https://elasticsearch.cn/article/752 订阅:https://tinyletter.com/elastic-daily
1.(自备梯子)ELK Stack 详细配置。 http://t.cn/RDWHBvW 2.Elasticsearch安全性:身份验证,加密,备份。 http://t.cn/RDWl15I 3.(自备梯子)数据科学中必备的数学知识。 http://t.cn/RDWYsfF 活动预告: Elastic 中国开发者大会预热票发售进行中  https://conf.elasticsearch.cn/2018/shenzhen.html 编辑:至尊宝 归档:https://elasticsearch.cn/article/752 订阅:https://tinyletter.com/elastic-daily

Elastic日报 第354 (2018-08-05)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 173 次浏览 • 2018-08-05 09:57 • 来自相关话题

1.Kubernetes使用Fluentd和Logz.io记录日志。 http://t.cn/RDPaFVJ 2.Docker使用EFK记录日志。 http://t.cn/RDPNDt3 3.(自备梯子)如何像数据科学家一样思考的12个步骤。 http://t.cn/RDP9e3d 活动预告: Elastic 中国开发者大会 2018 ,开始接受演讲申请和赞助合作 https://conf.elasticsearch.cn/2018/shenzhen.html  编辑:至尊宝 归档:https://elasticsearch.cn/article/744 订阅:https://tinyletter.com/elastic-daily
1.Kubernetes使用Fluentd和Logz.io记录日志。 http://t.cn/RDPaFVJ 2.Docker使用EFK记录日志。 http://t.cn/RDPNDt3 3.(自备梯子)如何像数据科学家一样思考的12个步骤。 http://t.cn/RDP9e3d 活动预告: Elastic 中国开发者大会 2018 ,开始接受演讲申请和赞助合作 https://conf.elasticsearch.cn/2018/shenzhen.html  编辑:至尊宝 归档:https://elasticsearch.cn/article/744 订阅:https://tinyletter.com/elastic-daily

我曲解Elasticsearch了吗?

Elasticsearchandy chen 发表了文章 • 7 个评论 • 356 次浏览 • 2018-07-18 20:05 • 来自相关话题

我曲解了Elasticsearch,我以为是每个节点可以存放不同的数据,哈哈哈😄。既然不是这样,引发了我另一个思考,说是Elasticsearch能处理TB以及PB的数据,这样的话,一台存放PB级数据的机器该是个多“可怕”的配置。每个节点的数据都一样,这是真正意义的分布式吗?我觉得按Elasticsearch的概念只是利用了节点的硬件资源。我真心希望我的理解是错的,这样我将欢欣鼓舞。
我曲解了Elasticsearch,我以为是每个节点可以存放不同的数据,哈哈哈😄。既然不是这样,引发了我另一个思考,说是Elasticsearch能处理TB以及PB的数据,这样的话,一台存放PB级数据的机器该是个多“可怕”的配置。每个节点的数据都一样,这是真正意义的分布式吗?我觉得按Elasticsearch的概念只是利用了节点的硬件资源。我真心希望我的理解是错的,这样我将欢欣鼓舞。