【玩转ElasticSearch】多个ElasticSearch Cluster的一致性问题

本篇讨论同时使用多个ES Cluster进行搜索的时候,如何保证数据的一致性。

• 名词解释

Cluster:集群,一个集群包含多个Node,且会有一个Master Node。

Node:节点,一般来说一个机器部署一个Node。

Shard:分片,指的是一个Index分成多少份,这些Shards会分散到各个Node上面。

• 为什么要使用多个ES Cluster?

高可用方面:

ElastcSearch拥有许多高可用的特性,例如Replica,例如Data Node挂掉后的数据迁移,例如Master Node挂掉后的自动重选,但这不代表万无一失了。常见的坑是,某个Node表现糟糕但是偏偏又没挂(挂了反而更好),此时整个Cluster的性能就会被一个坑爹Node拖累,这往往就是雪崩的开始。因此,从高可用方面来考虑,应当部署多个ES Cluster(部分作为灾备)。

性能方面:

单个Cluster的搜索能力是有瓶颈的。Cluster越大,Node越多,自然Shard就越多。而Shard不是越多越好,Shard增多会导致通讯成本的增加、查询收束时Re-ranking环节的负担增加。如果有100台机器,那么比起一个100 Node、300 Shards的巨型Cluster,使用十个10 Node 30 Shards的小型Cluster可能表现会更好。

• 什么叫多个ElastcSearch Cluster的一致性问题?

本篇讨论的就是使用多个小型Cluster、而不是一个巨大Cluster进行搜索时会出现的问题。

假设部署了两个Cluster,记为Cluster A和Cluster B,请求均摊去两个Cluster。有一天,你对两个Cluster同时新增了一条数据,但由于一些网络延迟之类的理由,A已经添加了但是B还没有,这时候一个用户搜索请求进来,可能会出现这么个情况:

如果请求的pageSize=4。page=1时,用户请求去了Cluster B;page=2时,用户请求去了Cluster A。这样,用户会看到以下的结果:

用户:黑人问号.jpg

更糟糕的是,万一在ES前面有一层缓存挡着,而缓存不巧记录了这个诡异的结果,那影响就会扩大了(所有用户:黑人问号.jpg)。

• 解决方案A:单点大法

1. 进入业务请求低谷期时,把所有请求切去1个ES Cluster;

2. 所有ES Cluster开始进行数据同步;

3. 同步完毕后,同时准备离开请求低谷期了,请求开始均摊到多个ES Cluster上。

优点:简单粗暴就是美。能简单粗暴解决的,就不要套复杂的东西。

缺点:1)每天高峰期不能新增数据;2)必须要在低谷期内完成所有数据同步,万一数据同步流程很长且时间不可控则很难实现;3)单点要能够顶过低谷期,万一流量判断错误、或者被攻击,导致单点崩溃,可能发生严重事故。

• 解决方案B:切别名大法

多个ElastcSearch Index的名字切换是个原子操作(搜索"elasticsearch alias"),所以可以这样:

1. 创建两个一样的Index(记为A1、A2);

2. 同步数据到A1;

3. 同步完后,设置别名A,指向刚刚同步好数据的A1(记为A->A1);

4. 使用A进行搜索,请求均摊到每个ES Cluster上;

5. 每次Re-load的时候,所有ES Cluster将数据更新到那个待机中的Index(例如A->A1,那么就更新A2,反之亦然)。在所有ES Cluster都完成数据更新后,同时切换别名(如A->A1,则A->A2,反之亦然)。

优点:比方案A优雅多了。

缺点:1)每个Index要创建两份,存储成本翻倍;2)跟方案A一样,不能实时添加数据。

• 解决方案C:哈希大法

1. 对请求进行哈希/散列,确保一个请求每次都会去到同一个ES Cluster;

2. 每个ES Cluster该干嘛干嘛。

优点:比方案B优雅多了,还能实时添加数据。

缺点:万一其中一个ES Cluster挂掉了,怎么办?均摊请求的做法可以很轻松地将挂掉的ES Cluster整个踢出去,那哈希法呢?

• 解决方案D:一致性哈希大法

终于还是到了这一招,新增一层虚拟层,将每个ES Cluster抽象成一个环上的虚拟节点。每个请求在哈希后,先映射去虚拟层,再映射去真实的ES Cluster。

由于每个ES Cluster都存储了完整的数据拷贝,我们并不需要考虑一致性哈希的数据迁移问题。每次新增/删除ES Cluster,就重新分配虚拟节点的位置(环上均分),就可以了。

• 一个新的问题:如何确保多个ES Cluster的更新操作的一致性?

上述全文都在讨论搜索的一致性,那么如何保证插入/更新的一致性呢?

我的解法是,加入一层可以被多人重复消费的消息队列(例如Kafka),作为所有ES Cluster插入/更新的中间层。

这个方案的好处是:

1)主更新程序只有一个,提高可控性和发现问题的能力;

2)使用消息队列来统一发布内容,降低了对数据源的压力;

3)图中消费者这个角色,Elastic Stack官方提供了一个轻量级高可用解决方案,就是Beat。

• 最后留一个小问题

前文讨论了多个Cluster+缓存时出现的一致性问题,其实单Cluster+缓存也可能出现这个问题(极少就是了)。那么,有没有办法彻底解决这个问题呢?

• 结语

ElasticSearch本身是个分布式系统,但如果将其作为一个更大的分布式系统的一个单元的话,将会出现什么问题呢?本文希望可以通过循序渐进的方法,分析围绕ES的高可用方案设计,有许多问题是分布式系统里常见的问题,希望可以对读者有所启发。

时间: 2024-09-19 06:45:14

【玩转ElasticSearch】多个ElasticSearch Cluster的一致性问题的相关文章

如何使用Elasticsearch和cAdvisor监控Docker容器

如果你正在运行 Swarm 模式的集群,或者只运行单台 Docker,你都会有下面的疑问: 我如何才能监控到它们都在干些什么?这个问题的答案是"很不容易". 你需要监控下面的参数: 容器的数量和状态. 一台容器是否已经移到另一个节点了,如果是,那是在什么时候,移动到哪个节点? 给定节点上运行着的容器数量. 一段时间内的通信峰值. 孤儿卷和网络(LCTT 译注:孤儿卷就是当你删除容器时忘记删除它的卷,这个卷就不会再被使用,但会一直占用资源). 可用磁盘空间.可用 inode 数. 容器数

表格存储结合Elasticsearch进行搜索的场景分析和实践

表格存储结合Elasticsearch进行搜索的场景分析和实践 表格存储(TableStore)是什么 TableStore是一个构建在阿里云飞天分布式系统上的Nosql数据库服务,熟悉阿里云的同学肯定听说过飞天5K,飞天是一个可以管理5000台机器的分布式系统,TableStore作为构建在其上的一个Nosql数据库,可以承载海量(单表几百TB)的数据存储,同时数据有三份拷贝,数据安全性有极高的保证. TableStore的数据是以行进行组织的,每行包含多个主键列和多个属性列,主键列的列名和类

Elasticsearch+Hbase实现海量数据秒回查询

---------------------------------------------------------------------------------------------[版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/53966430作者:朱培      ID:sdksdk0      -------------------------------------------------

ElasticSearch的基本用法与集群搭建

一.简介 ElasticSearch和Solr都是基于Lucene的搜索引擎,不过ElasticSearch天生支持分布式,而Solr是4.0版本后的SolrCloud才是分布式版本,Solr的分布式支持需要ZooKeeper的支持. 这里有一个详细的ElasticSearch和Solr的对比:http://solr-vs-elasticsearch.com/ 二.基本用法 Elasticsearch集群可以包含多个索引(indices),每一个索引可以包含多个类型(types),每一个类型包含

ElasticSearch大数据分布式弹性搜索引擎使用—从0到1

  阅读目录: 背景 安装 查找.下载rpm包 .执行rpm包安装 配置elasticsearch专属账户和组 设置elasticsearch文件所有者 切换到elasticsearch专属账户测试能否成功启动 安装自启动elasticsearch servicewrapper包 下载elasticsearch servicewrapper 包 elasticsearch servicewrapper开源包的配置小bug servicewrapper安装 chkconfig -add 加入lin

Manage Spring Boot Logs with Elasticsearch, Logstash and Kibana

下载地址:https://www.elastic.co/downloads   When time comes to deploy a new project, one often overlooked aspect is log management. ELK stack (Elasticsearch, Logstash, Kibana) is, among other things, a powerful and freely available log management solutio

使用 Elasticsearch 实现博客站内搜索

  一直以来,为了优化本博客站内搜索效果和速度,我使用 bing 的 site: 站内搜索做为数据源,在服务端获取.解析.处理并缓存搜索结果,直接输出 HTML.这个方案唯一的问题是时效性难以保证,尽管我可以在发布和修改文章时主动告诉 bing,但它什么时候更新索引则完全不受我控制. 本着不折腾就浑身不自在的原则,我最终还是使用 Elasticsearch 搭建了自己的搜索服务.Elasticsearch 是一个基于 Lucene 构建的开源.分布式.RESTful 搜索引擎,很多大公司都在用,

Elasticsearch + php + msyql+nginx安装流程

sudo yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-develglib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devele krb5 krb5-dev

全文检索(elasticsearch入门)

Elasticsearch篇: Elasticsearch是一个采用java语言开发的,基于Lucene构造的开源,分布式的搜索引擎. 设计用于云计算中,能够达到实时搜索,稳定可靠. Elasticsearch的数据模型是JSON. 对于需要分布式需求的这是一个非常好的选择,部署简单,同网段内会自动组成集群服务无需配置.其集成数据库同步插件,不仅支持几乎实时的全文检索服务,还支持距离查询,提供类似类似百度地图离我最近查询. 官方主页:http://www.elasticsearch.org/