ElasticSearch数据同步与无缝迁移

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: ElasticSearch作为一款开源的全文搜索引擎在如今的软件开发得到了越来越广泛的应用,在业务功能开发方面,可以选用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协议被广泛应用于平台对海量设备的消息分发,而在分布式系统,以及最近几年日益热门的微服务架构中,是一个十分常用的实现异步消息、解耦应用、最终一致性的组件。
常见的消息队列采用“发布-订阅”模式,初入门者几乎可以认为这是个“观察者模式”。

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

目前常用的消息队列框架有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
img_d46cea826d868cce79de826c2b7682c8.png
蓝绿部署

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. 开启增量更新
      这样在升级过程中的数据库中有更新的记录将会在新索引上同步

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

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
3月前
|
关系型数据库 MySQL 调度
【TiDB原理与实战详解】4、DM 迁移和TiCDC数据同步~学不会? 不存在的!
TiDB Data Migration (DM) 和 TiCDC 是两款用于数据库迁移和同步的强大工具。DM 支持将兼容 MySQL 协议的数据库(如 MySQL、MariaDB)的数据异步迁移到 TiDB 中,具备全量和增量数据传输能力,并能合并分库分表的数据。TiCDC 则专注于 TiDB 的增量同步,利用 TiKV 日志实现高可用性和水平扩展,支持多种下游系统和输出格式。两者均可通过 TiUP 工具进行部署与管理,简化了集群的安装、配置及任务管理过程。
|
6月前
|
监控 API 索引
实战问题:Elasticsearch 2.X 数据如何迁移到 7.X?
实战问题:Elasticsearch 2.X 数据如何迁移到 7.X?
45 0
|
6月前
|
canal 消息中间件 关系型数据库
【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
265 0
|
6月前
|
SQL JSON DataWorks
DataWorks产品使用合集之DataWorks 数据集成任务中,将数据同步到 Elasticsearch(ES)中,并指定 NESTED 字段中的 properties 类型如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
84 0
|
canal 搜索推荐 关系型数据库
docker环境安装mysql、canal、elasticsearch,基于binlog利用canal实现mysql的数据同步到elasticsearch中(三)
docker环境安装mysql、canal、elasticsearch,基于binlog利用canal实现mysql的数据同步到elasticsearch中
256 0
|
分布式计算 大数据 API
完美避坑!记一次Elasticsearch集群迁移架构实战
Elastic自身设计了集群分片的负载平衡机制,当有新数据节点加入集群或者离开集群,集群会自动平衡分片的负载分布。
|
Java 对象存储 流计算
阿里云ElasticSearch迁移-基于OSS全增量快照
阿里云ElasticSearch迁移-基于OSS全增量快照
阿里云ElasticSearch迁移-基于OSS全增量快照
|
存储 JavaScript 关系型数据库
将 mysql 数据同步到 Elasticsearch
将 mysql 数据同步到 Elasticsearch
141 0
|
索引 Python
阿里云ElasticSearch索引元数据迁移-基于Python3原生类库
阿里云ElasticSearch索引元数据迁移-基于Python3原生类库
|
canal SQL 关系型数据库
docker环境安装mysql、canal、elasticsearch,基于binlog利用canal实现mysql的数据同步到elasticsearch中(二)
docker环境安装mysql、canal、elasticsearch,基于binlog利用canal实现mysql的数据同步到elasticsearch中
385 0

热门文章

最新文章