ElasticSearch数据同步与无缝迁移

ElasticSearch作为一款开源的全文搜索引擎在如今的软件开发得到了越来越广泛的应用,在业务功能开发方面,可以选用ElasticSearch提供比数据库查询更强大的搜索方式,同时基于搜索结果评分(权重)和高亮让我们很轻易地通过它实现一个站内的搜索引擎。

ElasticSearch VS 数据库

刚接触ElasticSearch(ES)时我们经常将它与数据库类比起来学习,从结构上:

  • Indices类似于数据库的database
  • Type类似于数据库的table
  • Fields类似于数据表的列
  • Documents类似于数据表的行(即每条记录)
    同时,数据库提供的搜索语法都能在ES上找到影子,比如数据库提供AND、OR逻辑运算符,ES中有must, should,而数据库的如“like”等文字匹配功能在ES中则更加强大。

尽管如此,ES本质上的定位仍是一个搜索引擎。NoSQL和ES一样都有着相同松散的结构,虽然我们也有一些讨论是否可以用ES来替代非关系型数据库(撇开ES是不是一种NoSQL),但是一个现实是ES和NoSQL依旧是互有利弊;再者,传统关系型数据库的事务性、多表关联结构也是ES无法提供的。
所以,在实际的开发过程中,关系型数据库、NoSQL、ES依旧是相辅相成的关系,我们一般只会在较复杂的搜索场景下会选用ES提供搜索服务,而其源数据依旧来自于数据库,所以这就引出了ES与数据库之间的数据同步问题。

全量数据导入

在第一次将存储在数据库里面的数据导入到ES需要执行全量导入,当后续有数据更新时通过消息队列通知ES更新数据。

使用消息队列实现ES增量同步

消息队列在软件开发领域是一个十分常见的名词。
在操作系统层面,我们可以利用消息队列做进程间的通信;在一个单体应用,比如Android应用,利用一个MessageQueue类来解决UI线程与耗时子线程之间的界面刷新问题,在物联网领域,基于发布/订阅模型模型的MQTT协议被广泛应用于平台对海量设备的消息分发,而在分布式系统,以及最近几年日益热门的微服务架构中,是一个十分常用的实现异步消息、解耦应用、最终一致性的组件。
常见的消息队列采用“发布-订阅”模式,初入门者几乎可以认为这是个“观察者模式”。

消息队列模式-“发布-订阅”模式

目前常用的消息队列框架有KafkaRabbitMQ
消息队列实现增量同步的方式,是在主服务对数据库进行创建、删除、修改一条记录时,发布一条主题消息给消息队列,同时同步服务需要订阅相关主题,这样消息队列就可以将更新的记录转发给同步服务,同步服务再根据消息的内容在ES里面进行更新记录。
消息队列实现增量同步除了可以解耦主服务和同步服务,还有一个好处就是保证同步的容错性,比如当数据库添加一条记录时,如果直接采用HTTP的方式(可能是一个post请求)与同步服务取得联系时出现连接失败、post请求失败的时候,如果不采取任何措施这条记录就会无法得到同步。而消息队列的失败重发的机制可以很好的解决这个问题,同时消息队列,FIFO(先进先出)的机制也保证了消息转发的顺序。

ES索引更改后怎样做无缝重建

ES索引更改发生在ElasticSearch 索引结构发生变化,比如随着业务的发展对Type中字段的增减以及字段类型的更改,或者发生在ES版本升级带来的结构变化时,例如ES 5.0版本将之前的string类型拆分为textkeyword类型,当我们希望对ES进行版本升级时,那么之前的string类型就不可再用了。

与常见的Web服务的蓝绿部署实现无宕机升级类似,ES无缝升级也可以类比实现。Web服务的蓝绿部署的原理是使用LoadBalancer(负载均衡器)做流量切换,新旧服务都有不同的访问URL,但是只有LoadBalancer的URL对外可访问,即:

    1. 服务升级前:负载均衡指向旧服务V1
    1. 服务升级中:发布新服务V2,负载均衡依旧指向旧服务,此时存在新旧服务同时存在
    1. 服务升级完成:新服务V2启动完成,负载均衡切换指向,将访问流量导向新服务V2
    1. 服务升级完成:负载均衡切换指向后停掉旧服务V1
蓝绿部署

ES索引的别名

ES提供了通过索引别名(alias)来访问索引的方式:比如

curl -XPOST 'http://localhost:9200/_aliases' -d 
{
    "actions": [
        {"add": {"index": "test_20181007", "alias": "test"}}
    ]
}

就为索引test_20181007创建了一条别名test,这样访问localhost:9200/test/_searchlocalhost:9200/test_20181007/_search都可以搜索索引里面的内容。
ES的别名的存在为ES的无缝升级和切换提供了可能,类似于负载均衡切换指向一样,我们可以让ES别名在升级前后,指向新旧不同版本的索引即可。

ES无缝升级

    1. 新建带版本的新索引
PUT /test_v2
{
    "settings": { ... any settings ... },
    "mappings": {
        "type_one": { ... any mappings ... },
    }
}
    1. 暂停增量更新
      由于在升级期间我们不希望后续的记录更新到旧索引上,所以需要将消息队列进行暂停(pause)操作,在新索引创建成功后再开启。
    1. 执行全量数据导入
    1. 切换对外别名指向
      一个别名可以指向多个索引,所以我们在添加别名到新索引的同时必须从旧的索引中删除它。这个操作需要原子化,这意味着我们需要使用 _aliases 操作:
POST /_aliases
{
    "actions": [
        { "remove": { "index": "test_v1", "alias": "test" }},
        { "add":    { "index": "test_v2", "alias": "test" }}
    ]
}
    1. 删除旧索引
DELETE /test_v1
    1. 开启增量更新
      这样在升级过程中的数据库中有更新的记录将会在新索引上同步

我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。

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

推荐阅读更多精彩内容