elasticsearch入门(二)之集群的搭建_wait_for_active_shards-程序员宅基地

技术标签: elasticsearch  

1.写在前面

前面的博客,我已经简单的介绍了elasticsearch的安装,以及一些的工具的安装,只是简简单单入了一个门,但是elasticsearch一般都离不来集群,我们知道它是一个分布式,高性能、高可用、可伸缩的搜索和分析系统,所以今天的博客打算介绍一下它的集群的方式,但是由于我的电脑的配置有限,所以这儿就简简单单在一台机器上启动三个elasticsearch,然后搭建集群,当然多台机器搭建集群的方式比较简单,我在这儿就不介绍了。

2.搭建集群的方式

我们这儿主要是介绍两种方式,一种是通过多配置的文件的方式启动多台elasticsearch,一种是通过单配置的文件的方式来启动多台elasticsearch。

2.1.单配置文件的方式启动多台elasticsearch

在介绍这种的情况,我们先来了解下对应的配置文件中的配置的项的意思,具体的如下:

#集群的名称
cluster.name: king
#节点的名称
node.name: node‐1
#是否是主节点
node.master: true
node.data: true
#地址
network.host: 0.0.0.0
#端口
http.port: 9200
#参数设置一系列符合主节点条件的节点的主机名或 IP 地址来引导启动集群。
cluster.initial_master_nodes: ["node‐1"]
# 设置新节点被启动时能够发现的主节点列表(主要用于不同网段机器连接)
discovery.zen.ping.unicast.hosts: ["192.168.181.6","192.168.181.7","192.168.181.8"]
# 该参数就是为了防止”脑裂”的产生。定义的是为了形成一个集群,有主节点资格并互相连接的节点的最小数目。类似过半机制
discovery.zen.minimum_master_nodes: 2
# 解决跨域问题配置
http.cors.enabled: true
http.cors.allow‐origin: "*"

既然我们已经了解上面的配置的项,那么我们就让我们来搭起集群的环境吧!先来修改对应的配置文件,具体的如下:

在这里插入图片描述

在这里插入图片描述

设置好对应的项,然后保存,由于elasticsearch的启动的时候的会有log文件还有data数据,所以这个时候,我们需要创建这个文件夹,用来存储这些的文件,创建/ES/node1/data``/ES/node1/logs``/ES/node2/data``/ES/node2/logs``/ES/node3/data``/ES/node3/logs这几个文件夹,具体的如下:

在这里插入图片描述

这个时候就让我们来启动对应的三台elasticsearch吧,启动的命令如下:

./elasticsearch  -d -E node.name=node-1 -E http.port=9200 -E transport.port=9300 -E path.data=/ES/node1/data -E path.logs=/ES/node1/logs

./elasticsearch  -d  -E node.name=node-2 -E http.port=9201 -E transport.port=9301 -E path.data=/ES/node2/data -E path.logs=/ES/node2/logs

./elasticsearch  -d  -E node.name=node-3 -E http.port=9202 -E transport.port=9302 -E path.data=/ES/node3/data -E path.logs=/ES/node3/logs

运行上面的命令,然后我们通过对应的ps命令,查询的结果如下:

在这里插入图片描述

我这儿说说我的碰到的错误吧!之前的启动的时候一直说我的http.cors.allow‐origin: "*"这个参数项解析不来,应该是编码的问题,于是我重新打了一次,然后用utf-8格式保存解决了,然后在启动的时候,直接报错,就是上一次运行的没有报的错:**max number of threads [2048] for user [tongtech] is too low, increase to at least [4096]用户的最大线程数[2048]过低,增加到至少[4096]**大家可以参考这篇的文章解决linux修改limits.conf不生效,最后在谷歌浏览器中看看我们启动的情况。具体的如下:

在这里插入图片描述

这个第一种方式讲完了,然后我们看第二种的方式

2.2多配置文件的方式启动多台elasticsearch

这种方式比较简单,我们只需要将原来的elasticsearch的目录复制三份,然后分别修改对应的配置文件,具体的如下:

elasticsearch-7.3.2_node1

cluster.name: king
node.name: node‐1
node.master: true
node.data: true
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
cluster.initial_master_nodes: ["node‐1"]
discovery.seed_hosts: ["92.168.181.6:9300", "92.168.181.6:9301","92.168.181.6:9302"]
discovery.zen.minimum_master_nodes: 2
http.cors.enabled: true
http.cors.allow‐origin: "*"

elasticsearch-7.3.2_node2

cluster.name: king
node.name: node‐2
node.master: true
node.data: true
network.host: 0.0.0.0
http.port: 9201
transport.port: 9301
cluster.initial_master_nodes: ["node‐1"]
discovery.seed_hosts: ["192.168.181.6:9300", "92.168.181.6:9301","92.168.181.6:9302"]
discovery.zen.minimum_master_nodes: 2
http.cors.enabled: true
http.cors.allow‐origin: "*"

elasticsearch-7.3.2_node3

cluster.name: king
node.name: node‐3
node.master: true
node.data: true
network.host: 0.0.0.0
http.port: 9202
transport.port: 9302
cluster.initial_master_nodes: ["node‐1"]
discovery.seed_hosts: ["192.168.181.6:9300", "92.168.181.6:9301","92.168.181.6:9302"]
discovery.zen.minimum_master_nodes: 2
http.cors.enabled: true
http.cors.allow‐origin: "*"

分别启动:

./elasticsearch ‐p /tmp/elasticsearch_9200_pid ‐d
./elasticsearch ‐p /tmp/elasticsearch_9201_pid ‐d
./elasticsearch ‐p /tmp/elasticsearch_9202_pid ‐d

这种方式我这儿就不演示,因为这种方式比较简单,只要对应的配置的文件配置好就行了。

3.写的机制

在这里插入图片描述

步骤:

  1. 客户端向 NODE I 发送写请求。
  2. 检查Active的Shard数。
  3. NODEI 使用文档 ID 来确定文档属于分片 0,通过集群状态中的内容路由表信息获知分片 0 的主分片位于NODE3 ,因此请求被转发到 NODE3 上。
  4. NODE3 上的主分片执行写操作 。 如果写入成功,则它将请求并行转发到 NODE I 和 NODE2 的副分片上,等待返回结果 。当所有的副分片都报告成功, NODE3 将向协调节点报告 成功,协调节点再向客户端报告成功 。 在客户端收到成功响应时 ,意味着写操作已经在主分片和所有副分片都执行完成。

注意:

  1. 为什么要检查Active的Shard数?

    ES中有一个参数,叫做waitforactiveshards,这个参数是Index的一个setting,也可以在请求中带上这个参数。这个参数的含义是,在每次写入前,该shard至少具有的active副本数。假设我们有一个Index,其每个Shard有3个Replica,加上Primary则总共有4个副本。如果配置waitforactiveshards为3,那么允许最多有一个Replica挂掉,如果有两个Replica挂掉,则Active的副本数不足3,此时不允许写入。

    这个参数默认是1,即只要Primary在就可以写入,起不到什么作用。如果配置大于1,可以起到一种保护的作用,保证写入的数据具有更高的可靠性。但是这个参数只在写入前检查,并不保证数据一定在至少这些个副本上写入成功,所以并不是严格保证了最少写入了多少个副本。

  2. 在以前的版本中,是写一致性机制,现被替换为waitforactiveshards

    one:要求我们这个写操作,只要有一个primary shard是active活跃可用的,就可以执行

    all:要求我们这个写操作,必须所有的primary shard和replica shard都是活跃的,才可以执行这个写操作

    quorum:要求所有的shard中,必须是大部分的shard都是活跃的,可用的,才可以执行这个写操作

    写一致性的默认策略是 quorum,即多数的分片(其中分片副本可以是主分片或副分片)在 写入操作时处于可用状态。

    put /index/type/id?consistency=quorum
    quroum = int( (primary + number_of_replicas) / 2 ) + 1
    
    参数 简介
    version 设置文档版本号。主要用于实现乐观锁
    version_type 详见版本类型
    op_type 可设置为 create 。 代表仅在文档不存在时才写入 。 如果文档己存在,则写请求
    将失败
    routing ES 默认使用文档 ID 进行路由,指定 routing 可使用 routing 值进行路由
    wait_for_active_shards 用于控制写一致性,当指定数量的分片副本可用时才执行写入,否则重试直至超
    时 。默认为 l , 主分片可用 即执行写入
    refresh 写入完毕后执行 refresh ,使其对搜索可见
    timeout 请求超时时间 , 默认为 l 分钟
    pipeline 指定事先创建好的 pipeline 名称
  3. 写入Primary完成后,为何要等待所有Replica响应(或连接失败)后返回

    在更早的ES版本,Primary和Replica之间是允许异步复制的,即写入Primary成功即可返回。但是这种模式下,如果Primary挂掉,就有丢数据的风险,而且从Replica读数据也很难保证能读到最新的数据。所以后来ES就取消异步模式了,改成Primary等Replica返回后再返回给客户端。

    因为Primary要等所有Replica返回才能返回给客户端,那么延迟就会受到最慢的Replica的影响,这确实是目前ES架构的一个弊端。之前曾误认为这里是等waitforactive_shards个副本写入成功即可返回,但是后来读源码发现是等所有Replica返回的。

    如果Replica写入失败,ES会执行一些重试逻辑等,但最终并不强求一定要在多少个节点写入成功。在返回的结果中,会包含数据在多少个shard中写入成功了,多少个失败了

    如果Replica写入失败,ES会执行一些重试逻辑等,如果重试失败了,会通过广播的方式来通知其他的分片和副本,可以将这个副本剔除了。

4.新的节点加入或者有节点宕机的情况

在演示这种情况的时候,我们先创建3个分片,两个副本,先启动我们的kibana,然后用我们的kibana来操作创建,至于kibana如何启动,可以参考我的上一篇博客。

打开我们的kibana的界面如下:

在这里插入图片描述

我们在控制台输入以下的命令:

PUT /king
{
    
  "settings": {
    
    "number_of_shards": "4", //分片数
    "number_of_replicas": "2" //副本数
  }
}

运行结果如下:

在这里插入图片描述

在这里插入图片描述

加深的的就是分片,浅色的就是副本,这个时候我们再添加一个节点,还是原来的方式,我们先创建/ES/node4/data``/ES/node4/logs两个文件,然后执行如下的命令:

./elasticsearch  -d -E node.name=node-4 -E http.port=9203 -E transport.port=9303 -E path.data=/ES/node4/data -E path.logs=/ES/node4/logs

在这里插入图片描述

可以发现我们的node4已经启动起来了,这个时候我们来看下节点的信息,具体的如下:

在这里插入图片描述

从上面的信息可以发现:一个节点可以有多个主分片,一个节点只能有一个同样副本 不可能出现两个一样的副本都在一个节点,当加入新节点时 副本会被重新分配主分片也变

这个时候我们来演示宕机的情况,我们将node-4给kill掉,具体的如下:

在这里插入图片描述

然后我们再来看节点的情况,节点的情况如下:

在这里插入图片描述

从上面的信息可以发现:只有副本的分片宕机后集群自动重新分配副本 集群依然为绿色当有主分片的机器宕机后 副本会成为主分片

总结: 一个节点可以有多个主分片,一个节点只能有一个同样副本 不可能出现两个一样的副本都在一个节点,当加入新节点时 副本会被重新分配,主分片也变,只有副本的分片,宕机后集群自动重新分配副本,集群依然为绿色,当有主分片的机器宕机后 副本会成为主分片

5.写在最后

这篇的博客主要讲了下elasticsearch的集群的搭建,elasticsearch的写的机制,以及新的节点的加入和节点宕机对分片和副本的影响。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36434742/article/details/118530552

智能推荐

Qt开发 — QtQuick无法加载_qt静态库无法读取qrc-程序员宅基地

简述在做Qt QML QML 程序开发的时候,当切换啦电脑,重新安装啦QT Create。但是在调试程序的时候,会莫名奇妙的报错QtQuick 未被安装等。如下错误:QQmlApplicationEngine failed to load componentqrc:/main.qml:1 module "QtQuick.Controls" is not installedqrc:/main..._qt静态库无法读取qrc

android 2d 字体描边,关于ios下字体描边的一个细节-程序员宅基地

Orchard 刨析:导航篇之前承诺过针对Orchard Framework写一个系列.本应该在昨天写下这篇导航篇,不过昨天比较累偷懒的去玩了两盘单机游戏哈哈.下面进入正题. 写在前面 面向读者 之前和本文一再以Orchard ...【BZOJ】3196: Tyvj 1730 二逼平衡树(区间第k小+树套树)http://www.lydsy.com/Judg..._字体 描边 ios android

新手如何使用PHP创建RSS阅读器-程序员宅基地

Jacques Noah在Devshed上发表了一篇关于在PHP4与任意版本的Mysql搭建的平台下创建一个基于PHP的RSS阅读器的文章,RSS文档中有三个主要的标签:Title,link和description,分别包含着像它们名称提示一样的信息。   Jacques列举了来自一个RSS文档的两段代码,包含开始部分和结尾部分,并说明创建PHP的RSS阅读器之前所需要的几个步骤。 [中国站长

xml解析(demo4j+xpath)-程序员宅基地

xml解析切入主题之前我来回答一下为什么要解析xml?1.可以在不同应用程序之间的通信。2.可以在不同平台之间的通信。3.可以在不同平台之间的数据共享。xml的作用是什么?“XML是被设计用来存储数据、携带数据和交换数据的,通过XML,可以在不兼容的系统之间交换数据,利用XML, 纯文本文件可以用来存储数据。在不使用XML时,HTML用于显示数据,数据必须存储在HTML文件之内。XML..._demo4j

随便推点

python Unicode转ascii码的一种方法-程序员宅基地

缘起看到这样的数据:Marek Čech、Beniardá怎样变成相对应的ascii码呢解决import unicodedatas = u"Marek Čech" #(u表示是unicode而非 ascii码,不加报错!)line = unicodedata.normalize('NFKD',s).encode('ascii','ign...

data.getData()返回的Uri-程序员宅基地

有三种形式:content://,file://,/document/ content://可以intent.setAction(Intent.ACTION_VIEW),intent.setData(uri)启动,uri.getPath()得到的是真实的路径; file://可以intent.setAction(Intent.ACTION_VIEW),intent.setDataAndType(_data.getdata

MBSE建模学习之八:需求和需求图_mbse需求关系-程序员宅基地

MBSE建模工作中的需求建模概念。_mbse需求关系

机器学习实战第二章——KNN算法(源码解析)-程序员宅基地

#coding=utf-8 ''''' Created on 2015年12月29日 @author: admin ''' from numpy import array from numpy import tile from numpy import zeros import operator from os import listdir # 创建数据集,并返回数据集

2019ccpc与icpc网络赛总结_ccpc和icpc哪个难拿奖-程序员宅基地

网络赛总结ccpc一场网络赛,icpc的六场网络赛,接近一个月的时间,收获了不少东西。 这几场网络赛,我们队伍主要采取的策略是两个人做一道题,这样我们把低级错误降到了最低,这几次网络赛基本上wa的都是思路的错误。但我们队伍明显的是出题速度慢,中等思维题还好,但时快时慢,但高等思维题很容易被卡,甚至到做到最后也没出,比如徐州那场的M题我们与出线队伍就差一道这个M题。队伍..._ccpc和icpc哪个难拿奖

oracle存储过程编码转换,利用Oracle存储过程生成树编码_多特姚的博客-程序员宅基地

需求 字段 描述 备注 ID 主键,32位UUID TYPE_CODE 编码 如:1-01-003 PARENT_ID 父节点ID,32需求字段描述备注ID主键,32位UUIDTYPE_CODE编码如:1-01-003PARENT_ID父节点ID,,32位UUIDSORT_NUM排序编号正整数假设顶级节点的TYPE_CODE为字符1,写存储过程把表中所有的节点TYPE_CODE生成好;二级节点前面..._存储过程 转码

推荐文章

热门文章

相关标签