【微服务】Elasticsearch集群介绍搭建(六)

news2024/11/27 14:45:34

🚗Es学习·第六站~
🚩Es学习起始站:【微服务】Elasticsearch概述&环境搭建(一)
🚩本文已收录至专栏:微服务探索之旅
👍希望您能有所收获

一.引入

单机的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数据

三.部署ES集群

(1) 创建Es集群

因为docker容器之间相互隔离,如下我们用3个docker容器模拟3个es的节点。不过生产环境推荐大家每台服务节点仅部署一个es的实例。

部署es集群可以直接使用docker-compose来完成,不过要求你的Linux虚拟机至少有4G的内存空间。

  1. 首先编写一个docker-compose文件,并上传到虚拟机。文件内容如下:
version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1
    container_name: es01  # 容器名称
    environment:
      - node.name=es01  # 节点名称
      - cluster.name=es-docker-cluster  # 集群名称
      - discovery.seed_hosts=es02,es03  # 其他节点ip地址
      - cluster.initial_master_nodes=es01,es02,es03  # 初始化主节点
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elastic
  es02:
    image: elasticsearch:7.12.1
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes:
      - data02:/usr/share/elasticsearch/data
    ports:
      - 9201:9200
    networks:
      - elastic
  es03:
    image: elasticsearch:7.12.1
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes:
      - data03:/usr/share/elasticsearch/data
    networks:
      - elastic
    ports:
      - 9202:9200
volumes:
  data01:
    driver: local
  data02:
    driver: local
  data03:
    driver: local

networks:
  elastic:
    driver: bridge
  1. es运行需要修改一些linux系统权限,修改/etc/sysctl.conf文件
vi /etc/sysctl.conf

在文件添加如下配置

vm.max_map_count=262144

执行命令,使修改生效

sysctl -p
  1. 运行docker-compose 文件部署集群:
docker-compose up -d

(2) 集群状态监控

kibana可以监控es集群,但是不太方便且新版本需要依赖es的x-pack 功能,配置也比较复杂。

推荐使用cerebro来监控es集群状态,官方网址:https://github.com/lmenezes/cerebro

安装解压好后,进入bin目录,双击其中的cerebro.bat文件即可启动服务。

访问http://localhost:9000 即可进入管理界面:
在这里插入图片描述

输入你的elasticsearch的任意节点的地址和端口,点击connect即可:
在这里插入图片描述

如此可以看到我们部署的三个节点。上面绿色的条,代表集群处于绿色(健康状态)。实心五角表示主节点。

(3) 使用集群Es

(3.1) 利用kibana创建索引库

在DevTools中输入指令:

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

(3.2) 利用cerebro创建索引库

利用cerebro还可以创建索引库:
在这里插入图片描述

填写索引库信息:
在这里插入图片描述

点击右下角的create按钮:
在这里插入图片描述

(4) 查看分片效果

回到首页,即可查看索引库分片效果:
在这里插入图片描述

如此可以看到我们成功解决了开头提到的两个问题

四.集群职责划分

elasticsearch中集群节点有不同的职责划分:
在这里插入图片描述

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

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

  • master节点:对CPU要求高,但是内存要求低
  • data节点:对CPU和内存要求都高
  • coordinating节点:对网络带宽、CPU要求高

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

一个典型的es集群职责划分如图:
在这里插入图片描述

五.脑裂问题分析

脑裂问题是因为集群中的节点失联导致的。默认情况下,每个节点都是master eligible节点,因此一旦master节点宕机,其他候选节点会选举一个成为主节点。

例如一个集群中,主节点与其它节点失联:
在这里插入图片描述

此时,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个主节点,没有出现脑裂。

六.集群分布式存储

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

(1) 分片存储测试

插入三条数据:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

测试可以看到,三条数据分别在不同分片:
在这里插入图片描述

结果:
在这里插入图片描述

(2) 分片存储原理

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节点

七.集群分布式查询

elasticsearch的查询分成两个阶段:

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

  • gather phase:聚集阶段,coordinating node汇总data node的搜索结果,并处理为最终结果集返回给用户
    在这里插入图片描述

八.集群故障转移

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

1)例如一个集群结构如图:
在这里插入图片描述

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

2)突然,node1发生了故障:
在这里插入图片描述

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/331768.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

暗月内网渗透实战——项目七

首先环境配置 VMware的网络配置图 环境拓扑图 开始渗透 信息收集 使用kali扫描一下靶机的IP地址 靶机IP:192.168.0.114 攻击机IP:192.168.0.109 获取到了ip地址之后,我们扫描一下靶机开放的端口 靶机开放了21,80,999,3389,5985,6588端口…

20、CSS中单位:【px和%】【em和rem】【vw|vh|vmin|vmax】的区别

CSS中的px 和 % px (pixels) 是固定单位,也可以叫基本单位,代表像素,可以确保元素的大小不受屏幕分辨率的影响。 % (percentage) 是相对单位,代表元素大小相对于其父元素或视口(viewport)的大小的百分比。使用百分比可…

linux001之linux系统部署安装

注意:本次安装讲解以乌班图(Ubuntu) 虚拟机来说明讲解,既然学习linux,就无需用图形界面了,直接用服务器版本 1. 下载乌班图 网址:https://www.ubuntu.org.cn/download/server 然后就可以看到右下角有下载提示&#xff…

Scala - Idea 项目报错 Cannot resolve symbol XXX

一.引言 Idea 编译 Scala 项目大面积报错 Cannot resolve symbol xxx。 二.Cannot resolve symbol xxx 1.问题描述 Idea 内的 Scala 工程打开后显示下述异常: 即 Scala 常规语法全部失效,代码出现大面积红色报错。 2.尝试解决方法 A.设置 Main Sourc…

车道线检测-E2E_LSFitting 论文学习笔记

论文:《End-to-end Lane Detection through Differentiable Least-Squares Fitting》 代码:https://github.com/wvangansbeke/LaneDetection_End2End 材料:https://zhuanlan.zhihu.com/p/94419168 特点: 拟合二次曲线&#xff1b…

Kafka安装及zookeeper is not a recognized option问题解决

一安装JAVA JDK(略) 二安装ZooKeeper 下载安装包,建议bin版本 http://zookeeper.apache.org/releases.html#download解压并进入ZooKeeper,将“zoo_sample.cfg”重命名为“zoo.cfg” D:\Kafka\apache-zookeeper-3.7.1-bin\conf…

Python中类和对象(2)

1.继承 Python 的类是支持继承的:它可以使用现有类的所有功能,并在无需重新编写代码的情况下对这些功能进行扩展。 通过继承创建的新类称为 “子类”,被继承的类称为 “父类”、“基类” 或 “超类”。 继承语法是将父类写在子类类名后面的…

相机坐标系的正向投影和反向投影

1 、正向投影: 世界坐标系到像素坐标系 世界3D坐标系(x, y, z) 到图像像素坐标(u,v)的映射过程 (1)世界坐标系到相机坐标系的映射。 两个坐标系的转换比较简单,就是旋转矩阵 平移矩阵,旋转矩阵则是绕X, Y&#xff…

nginx中间件常见漏洞总结

nginx中间件常见漏洞总结1.中间件漏洞的概念1.1 中间件、容器、服务器的基本概念辨析2.Nginx 配置错误导致漏洞2.1 $uri导致的CRLF注入漏洞2.1.1 漏洞成因2.1.2 利用方式2.1.3 修改方案2.2 目录穿越漏洞2.1.1 漏洞成因2.2.2 利用方式2.2.3 修改方案2.3 Http Header被覆盖2.3.1 …

JS学习笔记三

目录 一、this详解 1、this原理 2、使用场景 1、普通函数的调用,this指向的是Window 2、对象的方法,this指的是该对象 一、this详解 1、this原理 this是JavaScript的一个关键字,函数调用时才会出现; 因为函数是在一定的环…

Android核心开发【UI绘制流程解析+原理】

一、UI如何进行具体绘制 UI从数据加载到具体展现的过程: 进程间的启动协作: 二、如何加载到数据 应用从启动到onCreate的过程: Activity生产过程详解: 核心对象 绘制流程源码路径 1、Activity加载ViewRootImpl ActivityThread…

Java并发编程概述

在学习并发编程之前,我们需要稍微回顾以下线程相关知识:线程基本概念程序:静态的代码,存储在硬盘中进程:运行中的程序,被加载在内存中,是操作系统分配内存的基本单位线程:是cpu执行的…

Jenkins部署及持续集成——傻瓜式教程

文章目录jenkins安装jenkins启动jenkins登录jenkins插件Jenkin创建一个项目通过Git进行构建构建策略jenkins安装 jenkins官网 https://www.jenkins.io/ 支持Docker pull下载安装 我用的windows,这里下载war包,这个位置下载的是最新的,需要java11或者更…

论文笔记:Depth-supervised NeRF: Fewer Views and Faster Training for Free

中文标题:深度信息监督的神经辐射场:需要更少的视角并且更快的训练 解决的问题: 在缺少视野的情况下,神经辐射场不能拟合正确的几何结构。 创新点 NeRF的第一步需要对场景图像做SFM(structure from motions),这个过程不光会获…

数据库/SQL教学推荐用什么样SQL工具?必须管理方便,轻松上手的

SQL语言逐渐成为职场人士必备的能力。很多人一直走上职场才了解什么是SQL,而更多人在大学就已经开始学习。 这些人一定对类似《数据库原理与应用》的课程不陌生。还记得你们是怎么熬过这门课的吗? 为什么说“熬”呢?实话说,数据库…

1行Python代码,对话ChatGPT,网友:太方便了

大家好,这里是程序员晚枫。 最近ChatGPT火爆全球,哪怕你不是程序员,应该也听过他的大名了。 今天我们就来一起体验一下~1行Python代码就够了! 上代码 导入poai这个库后,只需要1行代码poai.chatgpt.chat&#xff0c…

ThinkPHP 6 视图:从零开始

框架6.0默认只能支持PHP原生模板,如果需要使用thinkTemplate模板引擎,需要安装think-view扩展(该扩展会自动安装think-template依赖库)。 PHP原生模板 1.配置文件 默认设置为Think,因为没有安装,直接使用会…

lucene-8.5.1总结三:索引文件格式(1)

Lucene的索引里面存了些什么,如何存放的,也即Lucene的索引文件格式,是读懂Lucene源代码的一把钥匙。当我们真正进入到Lucene源代码之中的时候,我们会发现:Lucene的索引过程,就是按照全文检索的基本过程,将倒…

基于 NeRF 的 App 上架苹果商店!照片转 3D 只需一部手机,网友们玩疯了

前言 只用一部手机,现实中的 2D 照片就能渲染出 3D 模型? 没错,无需再手动上传电脑或安装激光雷达,苹果手机自带 App 就能生成 3D 模型。 这个名叫 Luma AI 的“NeRF APP”,正式上架 App Store 后爆火: 小…

一个优质软件测试工程师的简历应该有的样子(答应我一定要收藏起来)

个人简历 基本信息 姓 名:xxx 性 别: 女 年 龄:24 现住 地址: 深圳 测试 经验:3年 学 历:本科 联系 电话:18xxxxxxxx 邮 箱:xxxxl163.com 求职意向 应聘岗位:软件…