Elasticsearch 集群物理拆分

声明:
本文转自我的个人博客,有兴趣的可以查看原文。
转发请注明来源。

背景

公司使用 Elasticsearch 来做全文检索和大数据量的结构化查询,由于历史包袱,只有一个 Elasticsearch 集群,各个业务线都随便使用该集群,没有有效的管理和制约,比较混乱。而且,随着数据量的暴增,开始出现性能瓶颈,比如一个慢查询拖慢整个集群状态,甚至搞挂整个集群,所以开始着手对集群进行系统改造。

老系统

下图是老系统:

老系统架构
老系统架构

可以看到,系统就一个 Elasticsearch 集群,所有 index 公用一个集群,当集群出现问题时,会影响所有 index,甚至导致全站挂掉。其次,一个集群涉及到的 index 太多,涉及的业务线太多,当我们需要对集群进行改造、升级时,会带来极大挑战。

基于此,需要将 Elasticsearch 物理拆分成多个集群。

新系统

新系统如下图所示,重构时顺便做了其他修改,但跟本文无关,所以先隐掉。

新系统架构
新系统架构

客户端请求,经过中间的处理,转发到不同的 Elasticsearch 集群,各个集群物理隔离,这样,即使集群挂了,也只影响一小部分。

行动

拆分策略

确定要物理拆分集群后,首先要确定的是按照什么标准拆分,最重要的是哪些 index 应该放在一个集群。

首先想的是根据访问量来划分,保证每个集群的访问量基本相等。后来考虑到不同 index 的访问量是变化的,不可能每个集群的访问量都一直一样,而且,对于出现了访问量激增的情况下,我们可以通过增加机器来改善,所以,该方案没有意义。

然后,考虑根据优先级划分,将 index 分为高、中、低三个优先级,使每个优先级都分散在不同集群,这样,即使某个集群挂掉,也不至于所有高优先级的 index 涉及的业务挂掉。该方案也没有实施,一是优先级并不好确定,其次,优先级会动态变化,同时,会有index被删除,也会有index加入。

最后,我们按照业务线划分,同一业务线的 index 部署在同一集群,这样,便于维护。

index 迁移

确定了拆分策略,到落实阶段了,问题便成了怎么迁移,我们分两种方案迁移。

写入少且量小的 index

对于这种index,比如有的 index 就百万、千万级数据量,同时,每天就写入一次,这种 index,我们采用的策略是直接从老集群把数据迁移到新集群,现在有不少工具可以实现这种功能,比如 elasticdump,就可以一行命令把 index 给迁移到新集群。

写入多或量大的 index

对于这种 index,我们采用重建 index 的方式,因为我们不可能停止服务,所以,我们采用的是全量 index + 增量 index 的方式,当新集群上 index 完成后,将业务切到新集群。

  1. 全量 index:使用 es-hadoop 来做。
  2. 增量 index:在开始全量 index 前,监听 binlog,将消息丢进 NSQ,停止消费对应channel;当全量 index 完成后,开始消费该channel,当消费完成后,索引重建完毕。

全量 index 和增量 index 都需要对业务相当了解,在写HQL和消费 NSQ 消息脚本时,可以寻求业务部门相助。

问题

  1. 全量 index 时,如果数据量太大,是可能造成写入失败的。在这种情况下,一是优化新建 index 性能,二是分批次新建 index。
  2. 全量 index 需要编写 HQL,增量 index 需要将 DB 数据变动写入 NSQ,还要写消费脚本,针对每个 index 都需要这两个脚本,如果 index 变动或者涉及到的数据来源发生变动就需要重新对应脚本,会比较繁杂,所以,还缺少高效的全量 index 和增量 index 方案,如果有好的方案,记得告诉我。
  3. 缺乏有效的测试方案,在整个 index 迁移过程中,主要采用抽样对比新老集群数据来测试,一定要仔细!
  4. 沟通,仔细、耐心。

失败的拆分方案

最后,提供一种失败的拆分方案,大家就不要尝试了,血的教训。

Elasticsearch 提供了 index shard allocation 功能,我们可以利用该功能对 Elasticsearch 集群进行逻辑拆分。比如,我们可以给每个 Elasticsearch 节点打上标签,然后将不同业务涉及的 index 指定到不同节点,这样,虽然还是一个物理集群,但是,从逻辑上来说,可以理解为几个集群。按理来说,如果某个 index 特别大,或者有慢查询,是不会影响其他业务线的 index 的。但是,该方案有个很严重的问题,当我们人为让 index 在一个集群内不同节点之间迁移时,集群为了均衡数据,其他 index 也会迁移,这样,集群内部网络带宽占用就会很高,而且,Elasticsearch 没有提供控制集群内部迁移速递的 API,此时,集群处于极不稳定状态,特别是整个集群的数据量大的时候。我们遇到过集群内部网络带宽用尽,集群节点间的心跳无法正常接收,从而造成脑裂,一度不停选举master,整个集群挂掉的情况。即使采用数据迁移完成,由于没有物理隔离,还是有整个集群挂掉的可能性的,所以,还是物理拆分吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容