分布式搜索引擎

463 阅读3分钟
es 分布式架构原理
  • 写的情况:

    1)把索引可以拆分成多个 shard(分区),每个 shard 存储部分数据。

    2)这个 shard 的数据实际是有多个备份,就是说每个 shard 都有一个 primary shard(主分区),负责写入数据,但还有几个 replica shard(副本)。primary shard写入数据之后,会将数据同步到其他几个 replica shard 上去。

    3)通过 replica 方案,每个 shard 的数据都有多个备份,如果某个机器宕机了,还有别的数据副本在别的机器上。这样实现高可用。

    4)如果 master 节点宕机了,那么会重新选举一个节点为 master 节点。

    5)如果某台 primary shard 宕机,那么会由 master 节点,让那个宕机节点上的 primary shard 的身份转移到其他机器上的 replica shard。

    6)当你修复了宕机的机器,master 节点会控制将缺失的 replica shard 分配过去,同步后续修改的数据,让集群恢复正常。

  • 读的情况:可以从 replica / primary shard 去读

img
elastic Search 工作原理
  • 写入数据:
  1. 首先客户端根据配置的连接节点,通过轮询方式链接到一个 coordinate 节点(协调节点),该节点仅用于处理客户端的请求,集群中所有的节点都可以是 coordinate 节点。
  2. coordinate 节点通过 hash 算法计算出数据应该归属的 shard(图例是 shard 1)shard = hash(document_id) % (num_of_primary_shards),然后根据节点上维护的 shard 信息,将请求发送到 node 1 上。
  3. node 1 对索引数据进行校验,然后写入到 shard 中。 数据流图
  4. 主节点数据写入成功后,将数据并行发送副本节点 Node2,Node3(shard 1-R1,shard 1-R2 分片);
    1. 数据写入到内存 Buffer。
    2. 同时写入到 Translog Buffer。
    3. 每隔 1s 数据从 buffer 中 refresh 到 FileSystemCache 中,生产 segment 文件,之后数据就可以通过索引查询到了。
    4. refresh 结束,清空 Memory Buffer。
    5. 每隔 5s translog 从 buffer flush 到磁盘中。
    6. 定期/定量从 FileSystemCache 中,结合 translog 内容 flush index到磁盘中,做增量 flush。
  5. Node 2,Node 3 写入数据成功后,发送 ack 信号给 shard 1 主节点 Node 1;
  6. Node 1 发送 ack 给 coordinate node。
  7. coordinate node 发送 ack 给客户端。
buffer 和 cache 的区别
  1. Buffer 是系统两端处理速度平衡时使用的。它的引入是为了减少短期内突发的 I/O 影响,起到流量整形的作用。
  2. Cache 则是系统两端处理速度不匹配时的一种折衷策略。因为 CPU 和 Memory 之间的速度差异越来越大,所以人们充分利用数据的局部性原理,通过使用存储系统分级的策略来减小这种差异带来的影响。

写入到 Buffer 的数据还是原始数据,还没有索引。

Cache 中的数据是可以搜索的。

引用

分布式搜索引擎-Elasticsearch

深入分析Elastic Search的写入过程。