虽然ES本身就是一个分布式系统,但在生产实践中,往往还是让所有ES节点落在单机房内,各个数据中心之间,采用其他方式来同步数据。那么如何来做数据同步,以及如何确保数据一致性,就成了不得不面对的问题。现提出我知道的方案,供大家讨论,也希望大家伙能分享自己的方案~~~
方案一,双写
在数据写入ES时,通过MQ或者其他方式实现数据双写或者多写,目前很多MQ都有数据持久化功能,可以保障数据不丢;再结合ES各种状态码来处理数据重复问题,即可实现多中心数据的最终一致。
方案二,第三方数据同步
例如使用mysql的主从同步功能,在不同数据中心之间,从本机房的mysql同步数据到ES,依托mysql数据一致性来保障ES数据一致。datax,StreamSet均提供了类似功能。
方案三,基于ES translog同步
读取translog,同步并重放,类似于mysql binlog方式。看起来这种方式最干净利落,但涉及到ES底层代码修改,成本也较高,目前已有的实践:。[/url]
抛砖引玉~~~
方案一,双写
在数据写入ES时,通过MQ或者其他方式实现数据双写或者多写,目前很多MQ都有数据持久化功能,可以保障数据不丢;再结合ES各种状态码来处理数据重复问题,即可实现多中心数据的最终一致。
方案二,第三方数据同步
例如使用mysql的主从同步功能,在不同数据中心之间,从本机房的mysql同步数据到ES,依托mysql数据一致性来保障ES数据一致。datax,StreamSet均提供了类似功能。
方案三,基于ES translog同步
读取translog,同步并重放,类似于mysql binlog方式。看起来这种方式最干净利落,但涉及到ES底层代码修改,成本也较高,目前已有的实践:。[/url]
抛砖引玉~~~
3 个回复
medcl - 今晚打老虎。
赞同来自: laoyang360 、Dm 、yayg2008 、JackGe 、famoss 、chinagrowing 、harvey 、wajika 、0c0c0f 、cccthought更多 »
方案2最复杂,需要从原始数据开始进行处理,需要从 MySQL 到 ES 的文档转换,MySQL 的数据表达方式往往不够直观,使用起来不是很方便。
方案3,目前 ES 的 Translog 不能直接读取,修改底层代码产生新的分支,不具实际可行性。
还有方案么,有的:
方案4,ES 正在实现新的 CCR,cross cluster replication, 基于底层 sequence id 机制,实现的 Changes API,一个集群可被另外一个集群或是本集群“订阅”,从而可以实现数据复制,进行同步,可以是跨数据中心集群也可以本地集群的数据同步。
laoyang360 - Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:https://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net
赞同来自:
luyuncheng
赞同来自: