小言_互联网的博客

ElasticSearch 架构原理

269人阅读  评论(0)

1 Elasticsearch的节点类型

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

1.1 Master节点

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

discovery.seed_hosts: ["192.168.38.50:9300","192.168.38.51:9300","192.168.38.52:9300"]

并从候选主节点中选举出一个主节点。

cluster.initial_master_nodes: ["192.168.38.50:9300", "192.168.38.51:9300","192.168.38.52:9300"]

Master节点主要负责:

1)管理索引(创建索引、删除索引)、分配分片。
(2)维护元数据。
(3)管理集群节点状态。
(4)不负责数据写入和查询,比较轻量级。

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

1.2 DataNode节点

在Elasticsearch集群中,会有N个DataNode节点。DataNode节点主要负责,数据写入、数据检索,大部分Elasticsearch的压力都在DataNode节点上在生产环境中,内存最好配置大一些。

2 分片和副本

2.1 分片

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

2.2 副本

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

2.3 demo

描述: 创建工作索引库,该索引由3个分片,2个副本组成。

PUT /job_index
{
   
  "mappings": {
   
    "properties": {
   
      "id": {
   
        "type": "long",
        "store": true
      },
      "area": {
   
        "type": "keyword",
        "store": true
      },
      "exp": {
   
        "type": "keyword",
        "store": true
      },
      "edu": {
   
        "type": "keyword",
        "store": true
      },
      "salary": {
   
        "type": "keyword",
        "store": true
      },
      "job_type": {
   
        "type": "keyword",
        "store": true
      },
      "cmp": {
   
        "type": "keyword",
        "store": true
      },
      "pv": {
   
        "type": "keyword",
        "store": true
      },
      "title": {
   
        "type": "text",
        "store": true
      },
      "jd": {
   
        "type": "text"
      }
    }
  },
  "settings": {
   
    "number_of_shards": 3,
    "number_of_replicas": 2
  }
}

3 重要工作流程

3.1 Elasticsearch文档写入原理

(1) 选择任意一个DataNode发送请求,例如:node2。此时,node2就成为一个coordinating node(协调节点).
(2) 计算得到文档要写入的分片`shard = hash(routing) % number_of_primary_shards`routing 是一个可变值,默认是文档的 _id
(3) coordinating node会进行路由,将请求转发给对应的primary shard所在的DataNode(假设primary shard在node1、replica shard在node2)
(4) node1节点上的Primary Shard处理请求,写入数据到索引库中,并将数据同步到Replica shard
(5) Primary Shard和Replica Shard都保存好了文档,返回client

3.2 Elasticsearch检索原理


client发起查询请求,某个DataNode接收到请求,该DataNode就会成为协调节点(Coordinating Node)协调节点(Coordinating Node)将查询请求广播到每一个数据节点,这些数据节点的分片会处理该查询请求每个分片进行数据查询,将符合条件的数据放在一个优先队列中,并将这些数据的文档ID、节点信息、分片信息返回给协调节点协调节点将所有的结果进行汇总,并进行全局排序协调节点向包含这些文档ID的分片发送get请求,对应的分片将文档数据返回给协调节点,最后协调节点将数据返回给客户端。

4 Elasticsearch准实时索引实现

elasticsearch 被称为准实时搜索,原因是对 Elasticsearch 的写入操作成功后,写入的数据需要1秒钟后才能被搜索到,因此 Elasticsearch 搜索是准实时或者又称为近实时(near real time)。
elasticsearch底层使用的 Lucene,而 Lucene 的写入是实时的。但 Lucene 的实时写入意味着每一次写入请求都直接将数据写入硬盘,因此频繁的I/O操作会导致很大的性能问题。

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的数据)。

5 ES集群搭建过程

描述: docker+3台节点+kibana连接ES集群
ElasticSearch7 集群搭建


转载:https://blog.csdn.net/qq_34125999/article/details/116277664
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场