ElasticSearch系列五:ElasticSearch架构原理

  1.集群节点类型

        在Elasticsearch主要分成两类节点,一类是Master,一类是DataNode。

        1.1. Master节点

           在Elasticsearch启动时,会选举出来一个Master节点。当某个节点启动后,然后使用Zen Discovery机制找到集群中的其他节点,并建立连接。

        discovery.seed_hosts: ["192.168.21.130", "192.168.21.131", "192.168.21.132"]

并从候选主节点中选举出一个主节点。cluster.initial_master_nodes: ["node1", "node2","node3"]

Master节点主要负责:

        1)管理索引(创建索引、删除索引)、分配分片

        2)维护元数据

        3)管理集群节点状态

        4)不负责数据写入和查询,比较轻量级

        一个Elasticsearch集群中,只有一个Master节点。在生产环境中,内存可以相对小一点,但机器要稳定。

        1.2. DataNode节点

        在Elasticsearch集群中,会有N个DataNode节点。DataNode节点主要负责:

        数据写入、数据检索,大部分Elasticsearch的压力都在DataNode节点上,在生产环境中,内存最好配置大一些。

        1.3. 客户端节点

  当主节点和数据节点配置都设置为false的时候,该节点只能处理路由请求,处理搜索,分发索引操作等,从本质上来说该客户节点表现为智能负载平衡器。独立的客户端节点在一个比较大的集群中是非常有用的,他协调主节点和数据节点,客户端节点加入集群可以得到集群的状态,根据集群的状态可以直接路由请求。

        1.4. 集群状态

          1)如何快速了解集群的健康状况?green、yellow、red?

        green:每个索引的primary shard和replica shard都是active状态的

        yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态

        red:不是所有索引的primary shard都是active状态的,部分索引有数据丢失了

          2)集群什么情况会处于一个yellow状态?

        假设现在就一台linux服务器,就启动了一个es进程,相当于就只有一个node。现在es中有一个index,就是kibana自己内置建立的index。由于默认的配置是给每个index分配1个primary shard和1个replica shard,而且primary shard和replica shard不能在同一台机器上(为了容错)。现在kibana自己建立的index是1个primary shard和1个replica shard。当前就一个node,所以只有1个primary shard被分配了和启动了,但是一个replica shard没有第二台机器去启动。

        测试:启动第二个es进程,就会在es集群中有2个node,然后那1个replica shard就会自动分配过去,然后cluster status就会变成green状态。

   2.分片和副本机制

        2.1  分片(Shard)

         Elasticsearch是一个分布式的搜索引擎,索引的数据也是分成若干部分,分布在不同的服务器节点中。分布在不同服务器节点中的索引数据,就是分片(Shard)。Elasticsearch会自动管理分片,如果发现分片分布不均衡,就会自动迁移

        一个索引(index)由多个shard(分片)组成,而分片是分布在不同的服务器上的。

        2.2  副本

        为了对Elasticsearch的分片进行容错,假设某个节点不可用,会导致整个索引库都将不可用。所以,需要对分片进行副本容错。每一个分片都会有对应的副本。在Elasticsearch中,默认创建的索引为1个分片、每个分片有1个主分片和1个副本分片。

        每个分片都会有一个Primary Shard(主分片),也会有若干个Replica Shard(副本分片)

Primary Shard和Replica Shard不在同一个节点上。

        2.3  指定分片、副本数量

// 创建指定分片数量、副本数量的索引(settings指定的内容)

PUT /job_idx_shard_temp
{
  "mappings": {
    "properties": {
      "id": {
        "type": "long",
        "store": true
      },
      "area": {
        "type": "keyword",
        "store": true
      },
      "exp": {
        "type": "keyword",
        "store": true
      }
    }
  },
  
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  }
}

// 查看分片、主分片、副本分片

GET _cat/indices/job_idx_shard_temp?v

   3.Elasticsearch重要工作流程

        3.1  Elasticsearch文档写入原理

                3.1.1. 选择任意一个DataNode发送请求,例如:node2。此时,node2就成为一个coordinating node(协调节点)

                3.1.2. 计算得到文档要写入的分片

                         `shard = hash(routing) % number_of_primary_shards`

                         routing 是一个可变值,默认是文档的 _id

                3.1.3. coordinating node会进行路由,将请求转发给对应的primary shard所在的DataNode(假设primary shard在node1、replica shard在node2)

                3.1.4. node1节点上的Primary Shard处理请求,写入数据到索引库中,并将数据同步到Replica shard

                3.1.5. Primary Shard和Replica Shard都保存好了文档,返回client

        3.2  Elasticsearch检索原理

                1. client发起查询请求,某个DataNode接收到请求,该DataNode就会成为协调节点(Coordinating Node)

                2. 协调节点(Coordinating Node)将查询请求广播到每一个数据节点,这些数据节点的分片会处理该查询请求

                3. 每个分片进行数据查询,将符合条件的数据放在一个优先队列中,并将这些数据的文档ID、节点信息、分片信息返回给协调节点

                4. 协调节点将所有的结果进行汇总,并进行全局排序

                5. 协调节点向包含这些文档ID的分片发送get请求,对应的分片将文档数据返回给协调节点,最后协调节点将数据返回给客户端

     4. Elasticsearch准实时索引实现   

         4.1  溢写到文件系统缓存

        当数据写入到ES分片时,会首先写入到内存中,然后通过内存的buffer生成一个segment,并刷到文件系统缓存中,数据可以被检索(注意不是直接刷到磁盘)

        ES中默认1秒,refresh一次

        4.2  写translog保障容错

         在写入到内存中的同时,也会记录translog日志,在refresh期间出现异常,会根据translog来进行数据恢复,等到文件系统缓存中的segment数据都刷到磁盘中,清空translog文件

        4.3  flush到磁盘

         ES默认每隔30分钟会将文件系统缓存的数据刷入到磁盘

        4.4  segment合并

         Segment太多时,ES定期会将多个segment合并成为大的segment,减少索引查询时IO开销,此阶段ES会真正的物理删除(之前执行过的delete的数据)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值