首页 > 其他分享 >Elasticsearch 系列(六)- ES数据同步和ES集群

Elasticsearch 系列(六)- ES数据同步和ES集群

时间:2024-04-28 22:45:08浏览次数:28  
标签:node 集群 分片 Elasticsearch 节点 ES

本章将和大家分享ES的数据同步方案和ES集群相关知识。废话不多说,下面我们直接进入主题。

一、ES数据同步

1、数据同步问题

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

在微服务中,负责酒店管理(操作mysql )的业务与负责酒店搜索(操作Elasticsearch )的业务可能在两个不同的微服务上,数据同步该如何实现呢?

2、数据同步方案一:同步调用

3、数据同步方案二:异步通知

4、数据同步方案三:监听binlog

5、数据同步三种方案对比总结

方案一:同步调用

  • 优点:实现简单,粗暴
  • 缺点:业务耦合度高

方案二:异步通知

  • 优点:低耦合,实现难度一般
  • 缺点:依赖mq的可靠性

方案三:监听binlog

  • 优点:完全解除服务间耦合
  • 缺点:开启binlog增加数据库负担、实现复杂度高

二、ES集群

1、ES集群结构 

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

  • 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),存储到多个节点。
  • 单点故障问题:将分片数据在不同节点备份(replica )。
单点 集群

2、搭建ES集群

每个索引库的分片数量、副本数量都是在创建索引库时指定的,并且分片数量一旦设置以后无法修改。语法如下:

PUT /itcast
{
  "settings": {
    "number_of_shards": 3, // 分片数量
    "number_of_replicas": 1 // 副本数量
  },
  "mappings": {
    "properties": {
      // mapping映射定义 ...
    }
  }
}

具体的ES搭建此处先不做介绍。

3、ES集群的节点角色

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

节点类型 配置参数 默认值 节点职责
master eligible node.master true 备选主节点:主节点可以管理和记录集群状态、决定分片在哪个节点、处理创建和删除索引库的请求。
data node.data true 数据节点:存储数据、搜索、聚合、CRUD
ingest node.ingest true 数据存储之前的预处理
coordinating 上面3个参数都为false则为coordinating节点 协调节点:路由请求到其它节点,合并其它节点处理的结果,返回给用户

4、ES集群的分布式查询

Elasticsearch中的每个节点角色都有自己不同的职责,因此建议集群部署时,每个节点都有独立的角色。

5、ES集群的脑裂

默认情况下,每个节点都是master eligible节点,因此一旦master节点宕机,其它候选节点会选举一个成为主节点。当主节点与其他节点网络故障时,可能发生脑裂问题。

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

主从结构脑裂问题示意图:

1、正常时只有一个主节点 2、网络阻塞

3、另外两个候选节点node2和node3重新选举主节点 4、网络恢复,此时就出现了两个主节点,这就是脑裂问题

6、小结1

1)master eligible节点的作用是什么?

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

2)data节点的作用是什么?

  • 数据的CRUD

3)coordinator节点的作用是什么?

  • 路由请求到其它节点
  • 合并查询到的结果,返回给用户

7、ES集群的分布式存储

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

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

shard = hash(_routing) % number_of_shards

说明:

  • _routing默认是文档的id
  • 算法与分片数量有关,因此索引库一旦创建,分片数量不能修改!

新增文档流程:

8、ES集群的分布式查询

Elasticsearch的查询分成两个阶段:

  • scatter phase:分散阶段,coordinating node会把请求分发到每一个分片。
  • gather phase:聚集阶段,coordinating node汇总data node的搜索结果,并处理为最终结果集返回给用户。

9、小结2

1)分布式新增如何确定分片?

  • coordinating node根据id做hash运算,得到结果对shard数量取余,余数就是对应的分片。

2)分布式查询的两个阶段

  • 分散阶段:coordinating node将查询请求分发给不同分片
  • 收集阶段:将查询结果汇总到coordinating node,整理并返回给用户

10、ES集群的故障转移

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

故障转移示意图如下:

 1、正常状态  2、主节点宕机

 3、重新选举主节点

 4.1、数据迁移  4.2、数据迁移

故障转移:

  • master宕机后,EligibleMaster选举为新的主节点。
  • master节点监控分片、节点状态,将故障节点上的分片转移到正常节点,确保数据安全。

至此本文就全部介绍完了,如果觉得对您有所启发请记得点个赞哦!!! 

标签:node,集群,分片,Elasticsearch,节点,ES
From: https://www.cnblogs.com/xyh9039/p/18148296

相关文章

  • 【Nano Framework ESP32篇】使用 LCD 屏幕
    在开始主题之前,先介绍一个刷固件工具。这个工具在idf中是集成的,不过,乐鑫也单独发布了这个工具——esptool。下载链接:Releases·espressif/esptool·GitHub。这货是用Python写的,只是封装成了exe,方便直接运行罢了。在使用时,需要-p参数指定串口号,如COM15,-b指定波特率(......
  • AtCoder Beginner Contest 351
    B-SpottheDifference难度:⭐题目大意给定两个矩阵,找不同解题思路数据很小,暴力就行;神秘代码#include<bits/stdc++.h>#defineintunsignedlonglong#defineIOSios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#defineendl'\n'usingnamespa......
  • Compression Stream API
    使用gzip或者默认格式压缩和解压缩数据<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/><titl......
  • start windows executable in multi-process and wait its ending
    theexecutableimporttimeimportrandomimportsystime.sleep(random.random())print(sys.argv[1])thecallingcontrolimportsubprocessll=[]foriiinrange(8):ll.append(subprocess.Popen(f"pythonab.pymk{ii}"#maybesom......
  • Codeforces Round 941 (Div. 1) 题解(A-C)
    比赛链接:https://codeforces.com/contest/1965官解链接:https://codeforces.com/blog/entry/128914比较手速的一场,C与D之间出现了较大的gifficultygap。所幸C题猜得比较快(虽然证明其实比较难),最终rank190,performance2525,成功压线拿下Grandmaster。cpchenpi,堂堂上红!......
  • Codeforces Round 941 (Div. 2)
    A.CardExchange贪心。如果有某个数出现\(k\)次及以上,则通过操作使其数量变为\(k\),再变为其他出现过的数,则会增加至至少\(k\)个,一直进行如上操作,可以发现数组最终只剩\(k-1\)个数;否则为\(n\)。#include<bits/stdc++.h>usingnamespacestd;#definecctieios::......
  • vue3项目打包的时候报错'openBlock' is not exported by node_modules/...
    用了一个手写签名的,开发环境中一切正常,但是在打包发布的时候,就报错了。'openBlock'isnotexportedbynode_modules/vue-esign/node_modules/vue/dist/vue.runtime.esm.js.... 这个应该是vue版本重复导致的。 解决:在vite.config.ts中加入 dedupe:['vue'],  dedupe是......
  • 揭秘Python中的JSON数据格式与Requests模块
    From: https://mp.weixin.qq.com/s/QgGyn2efYtVKI65RwXoiEA------------------------------------------------------------------------------------importpytestimportjsonimportrequestsfromrequests.authimportHTTPBasicAuthfromrequests.adaptersimportHTTPA......
  • Ubuntu22.04 搭建Kubernetes 1.28版本集群
    依赖安装准备工作需要在所有节点上进行。安装ssh服务安装 openssh-serversudoapt-getinstallopenssh-server修改配置文件vim/etc/ssh/sshd_config找到配置项LoginGraceTime120PermitRootLoginprohibit-passwordStrictModesyes把 prohibit-password ......
  • UES-03-函数
    带参数默认值的函数函数的参数数量不受声明时指定的参数个数影响,可以有任意多个。函数声明时使用参数默认值直接在形参后面添加'=defaultValue'即可。可以给任意位置的参数添加默认值,只有当没有给这个位置的参数传值或者传的值为undefined时该参数使用默认值。在使用参数......