Elasticsearch --- 数据同步、集群

news/2024/7/7 5:56:33 标签: elasticsearch, java, 大数据

一、数据同步

elasticsearch中的酒店数据来自于mysql数据库,因此mysql数据发生改变时,elasticsearch也必须跟着改变,这个就是elasticsearch与mysql之间的数据同步

 

思路分析:

常见的数据同步方案有三种:

  • 同步调用

  • 异步通知

  • 监听binlog

 

1.1、同步调用

方案一:同步调用

基本步骤如下:

  • hotel-demo对外提供接口,用来修改elasticsearch中的数据

  • 酒店管理服务在完成数据库操作后,直接调用hotel-demo提供的接口,

 

1.2、异步通知

方案二:异步通知

流程如下:

  • hotel-admin对mysql数据库数据完成增、删、改后,发送MQ消息

  • hotel-demo监听MQ,接收到消息后完成elasticsearch数据修改

 

1.3、监听binlog

方案三:监听binlog

流程如下:

  • 给mysql开启binlog功能

  • mysql完成增、删、改操作都会记录在binlog中

  • hotel-demo基于canal监听binlog变化,实时更新elasticsearch中的内容

 

1.4、选择

方式一:同步调用

  • 优点:实现简单,粗暴

  • 缺点:业务耦合度高

方式二:异步通知

  • 优点:低耦合,实现难度一般

  • 缺点:依赖mq的可靠性

方式三:监听binlog

  • 优点:完全解除服务间耦合

  • 缺点:开启binlog增加数据库负担、实现复杂度高

  

 

二、集群

单机的elasticsearch做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。

  • 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),存储到多个节点

  • 单点故障问题:将分片数据在不同节点备份(replica )

ES集群相关概念:

  • 集群(cluster):一组拥有共同的 cluster name 的 节点。

  • 节点(node) :集群中的一个 Elasticearch 实例

  • 分片(shard):索引可以被拆分为不同的部分进行存储,称为分片。在集群环境下,一个索引的不同分片可以拆分到不同的节点中

    解决问题:数据量太大,单点存储量有限的问题。

此处,我们把数据分成3片:shard0、shard1、shard2

  • 主分片(Primary shard):相对于副本分片的定义。

  • 副本分片(Replica shard)每个主分片可以有一个或者多个副本,数据和主分片一样

 

数据备份可以保证高可用,但是每个分片备份一份,所需要的节点数量就会翻一倍,成本实在是太高了!

为了在高可用和成本间寻求平衡,我们可以这样做:

  • 首先对数据分片,存储到不同节点

  • 然后对每个分片进行备份,放到对方节点,完成互相备份

这样可以大大减少所需要的服务节点数量,如图,我们以3分片,每个分片备份一份为例:

现在,每个分片都有1个备份,存储在3个节点:

  • node0:保存了分片0和1

  • node1:保存了分片0和2

  • node2:保存了分片1和2

 

2.1、集群脑裂问题

2.1.1、集群职责划分

elasticsearch中集群节点有不同的职责划分:

默认情况下,集群中的任何一个节点都同时具备上述四种角色。

 

但是真实的集群一定要将集群职责分离:

  • master节点:对CPU要求高,但是内存要求第

  • data节点:对CPU和内存要求都高

  • coordinating节点:对网络带宽、CPU要求高

职责分离可以让我们根据不同节点的需求分配不同的硬件去部署。而且避免业务之间的互相干扰。

一个典型的es集群职责划分如图:

 

2.1.2、脑裂问题

脑裂是因为集群中的节点失联导致的。

例如一个集群中,主节点与其它节点失联:

此时,node2和node3认为node1宕机,就会重新选主:  当node3当选后,集群继续对外提供服务,node2和node3自成集群,node1自成集群,两个集群数据不同步,出现数据差异。

当网络恢复后,因为集群中有两个master节点,集群状态的不一致,出现脑裂的情况:

 解决脑裂的方案是,要求选票超过 ( eligible节点数量 + 1 )/ 2 才能当选为主,因此eligible节点数量最好是奇数。对应配置项是discovery.zen.minimum_master_nodes,在es7.0以后,已经成为默认配置,因此一般不会发生脑裂问题

例如:3个节点形成的集群,选票必须超过 (3 + 1) / 2 ,也就是2票。node3得到node2和node3的选票,当选为主。node1只有自己1票,没有当选。集群中依然只有1个主节点,没有出现脑裂。

 

小结

master eligible节点的作用是什么?

  • 参与集群选主

  • 主节点可以管理集群状态、管理分片信息、处理创建和删除索引库的请求

data节点的作用是什么?

  • 数据的CRUD

coordinator节点的作用是什么?

  • 路由请求到其它节点

  • 合并查询到的结果,返回给用户

 

2.2、集群分布式存储

当新增文档时,应该保存到不同分片,保证数据均衡,那么coordinating node如何确定数据该存储到哪个分片呢?

原理:

elasticsearch会通过hash算法来计算文档应该存储到哪个分片:

说明:

  • _routing默认是文档的id

  • 算法与分片数量有关,因此索引库一旦创建,分片数量不能修改!

新增文档的流程如下:

 解读:

  1. 新增一个id=1的文档

  2. 对id做hash运算,假如得到的是2,则应该存储到shard-2

  3. shard-2的主分片在node3节点,将数据路由到node3

  4. 保存文档

  5. 同步给shard-2的副本replica-2,在node2节点

  6. 返回结果给coordinating-node节点

 

2.3、集群分布式查询

elasticsearch的查询分成两个阶段:

  • scatter phase:分散阶段,coordinating node会把请求分发到每一个分片

  • gather phase:聚集阶段,coordinating node汇总data node的搜索结果,并处理为最终结果集返回给用户

  

2.4、集群故障转移

集群的master节点会监控集群中的节点状态,如果发现有节点宕机,会立即将宕机节点的分片数据迁移到其它节点,确保数据安全,这个叫做故障转移。

1)例如一个集群结构如图:

现在,node1是主节点,其它两个节点是从节点。

 

2)突然,node1发生了故障:

 宕机后的第一件事,需要重新选主,例如选中了node2:

node2成为主节点后,会检测集群监控状态,发现:shard-1、shard-0没有副本节点。因此需要将node1上的数据迁移到node2、node3:


http://www.niftyadmin.cn/n/287633.html

相关文章

如何规范使用Git及提交代码的要求

Git是目前最流行的版本控制系统之一,它可以帮助开发人员更好地管理代码版本,并协作开发。使用Git进行代码管理需要遵循一些规范和技巧,本文将介绍如何规范地使用Git,常用的Git命令和技巧,以及如何创建分支和提交代码。…

Linux:《tar》归档命令

准备好4个文件然后使用tar命令进行归档 最常用的是 -c, --create(小写) 建立新的存档 -f, --file [HOSTNAME:]F 指定存档或设备 (缺省为 /dev/rmt0) -z, --gzip, --ungzip 用 gzip 对存档压缩或解压 -j&…

软件测试面试题最牛汇总,不会有人没有这份文档吧

常见的面试题汇总 1、你做了几年的测试、自动化测试,说一下 selenium 的原理是什么? 我做了五年的测试,1年的自动化测试; selenium 它是用 http 协议来连接 webdriver ,客户端可以使用 Java 或者 Python 各种编程语言…

顺丰、圆通、韵达演绎2022年报众生相

2022年,国内快递行业正整体逐步迈入高质量发展的新阶段。根据国家邮政局公布的数据显示,2022年,快递行业有效应对了超预期因素的冲击,总体保持了稳步增长,全国快递服务企业业务量累计完成1105.8亿件,同比增…

【Python习题集5】函数的设计

函数的设计 一、实验内容二、实验总结 一、实验内容 1.编写两个函数分别按单利和复利计算利息,根据本金、年利率、存款年限得到本息和和利息。调用这两个函数计算1000元在银行存3年,在年利率是6%的情况下,单利和复利分别获得的本息和和利息。…

node 开发

文章目录 快速认识node开始使用node编程hello world模块和包什么是模块创建和加载模块创建包node.js 的包管理本地模式 和全局模式创建全局连接包的发布 调试 快速认识node 开始使用node编程 hello world 打开你的文本编辑器,在上面输入: console。l…

idea中的debug操作详解

行断点 默认模式 方法断点 菱形,加在方法前,用的比较多的地方:加在接口前会进入这个接口的实现类。 异常断点 如果说你的程序抛了某个异常,你需要知道在哪里抛出的,可以直接设置异常断点,设置后程序会…

vue使用 codemirror

安装 npm install codemirror 注意版本&#xff0c;不要使用新版 "codemirror": "5.65.8", 组件 <template><div class"in-coder-panel"><textarea :ref"textareaRef" v-model"code" autofocus"true…