Elasticsearch 架构设计及说明

2022-12-02  本文已影响0人  光剑书架上的书

Elasticsearch 架构设计及说明

Elasticsearch 架构层:

Elasticsearch 五层架构设计图:

说明:

一、节点自动发现机制

Elasticsearch内嵌自动发现机制

单播模式和多播模式配置参数

如:

discovery.zen.ping.multicast.enabled:true
discovery.zen.fd.ping_timeout:100s
discovery.zen.ping.timeou:100s
discovery.zen.minimum_master_nodes:2
discovery.zen.ping.unicast.hosts:['192.168.x1.y1:9300','192.168.x2.y2:9300']
action_create_index:false

1、单播模式

* Elasticsearch支持同一台主机启动多个节点,所以只有在同一台机器上运行的节点才会自动组成集群。
* 单播模式下,需要配置Elasticsearch,填写集群中的IP地址列表。如下:
discovery.zen.ping.unicast.hosts:['192.168.x1.y1:9300','192.168.x2.y2:9300']

单播模式下的配置信息

discovery.zen.ping.multicast.enabled:false
discovery.zen.fd.ping_timeout:100s
discovery.zen.ping.timeou:100s
discovery.zen.minimum_master_nodes:2
discovery.zen.ping.unicast.hosts:['192.168.x1.y1:9300','192.168.x2.y2:9300']

集群构建及主节点选举过程:

  1. 节点启动后执行ping命令(RPC命令),如果discovery.zen.ping.unicast.hosts中有设置,则ping设置hosts中,否则尝试ping localhost的几个端口。最后返回包含节点的基本信息以及该节点认为的主节点。
  2. 从各个节点认为的master中,按照ID的字典排序选取第一个为主节点。如果各个节点没有认为的master,则从各个节点中按照ID字典排序选取第一个作为主节点。

注:

2、多播模式

discovery.zen.ping.multicast.enabled: false 

二、节点类型

节点角色在配置文件(/config)elasticsearch.yml文件中设置即可,如下:

# 是否为候选主节点
node.master:true
# 是否为数据节点
node.data:true
image

三、分片和路由

由于Elasticsearch中,在一个多分片的索引中写入数据时,需要通过路由来确定具体陷入哪一个分片中,所以在创建索引时需要指定分片数量,
配置副本,并且分片的数量一旦确定就不能修改。

1、分片

通过配置创建索引时的Setting来配置分片和副本数量,如下:

index.number_of_shards:5
index.number_of_replicas:1

补充说明:

2、路由

为了避免查询时部分分片查询失败影响结果的准确性,Elasticsearch引入了路由功能。
当数据写入时,通过路由将数据写入指定分片;
当查询数据时,通过相同的路由指明在哪个分片将数据查出来

索引数据分片算法:

shard_num = hash(_routing) % num_primary_shards  #_routing默认为id字段或者parent字段

补充说明:

四、Elasticsearch 数据写入过程

数据存储路径配置:(/config)elasticsearch.yml文件中

path.data:/path/to/data # 索引数据
path.logs:/path/to/logs # 日志数据

【注】不建议使用默认值,防止升级Elasticsearch而导致数据部分甚至全部丢失

1、分段存储

我们可以思考一下,为什么Elasticsearch中数据的存储要引入段?

当段被写入磁盘后会生成一个提交点,并生成一个用来记录所有段信息的文件,则对于该文件段只有读的权限,永远失去写的权限。同时该部分数据可以被 Elasticsearch 用户检索到。而当段还在内存中时,此时分段只拥有写的权限,数据还能不断写入,但不具备读数据的权限,且无法被 Elasticsearch 用户检索到。

如果段一旦提交不能再写,那么我们如何进行 ’‘ (新增、更新和删除)的操作呢?

在面对段的不可修改特性,Elasticsearch采用不将文档从旧段中移除,而是新增一个.del文件,记录被 '改' 文档的段信息。
当用户检索时,文档依然可以被查询到,但他会在最终结果被返回前通过.del文件将其从结果集中移除。
如当更新数据时,会先创建一个段,然后将更新好的数据写入新段中,生成提交点,再在.del文件中标记旧段,从而达到更新的效果。

段的优缺点:

2、延迟写策略

Elasticsearch中,索引写入磁盘是异步写入的。为了提升写的性能,延迟写策略采用了 '延迟写策略' 来解决新增一条数据就添加一个段到磁盘上的问题。

延迟写策略执行过程:

补充说明

延迟写策略优缺点:

为了解决延迟写策略引入的数据丢失风险,Elasticsearch又引入了 事务日志(Translog)机制,用于记录所有还没有持久化到磁盘的数据。

添加事务日志机制后的数据写入索引流程:

  1. 新文档被索引之后,先被写入内存中。为了防止数据丢失,Elasticsearch会追加一份数据到事务日志中。
  2. 新的文档持续在被写入内存时,同时也会记录到事务日志中。此时,新数据不能被检索和查询
  3. 当达到默认的刷新时间或内存中的数据达到一定量后,触发一次Refresh刷新将内存中的数据以一个新段格式刷新到文件缓存系统中,并清空内存。(形成段,可提供检索和查询,且不可修改)
  4. 随着新文档索引不断写入,当日志数据大小超过某个值(512MB),或者超过一定时间(30min)时,触发一次Flush,此时文件缓存系统中的数据通过Fsync刷新到磁盘中,生成提交点。同时删除日志文件,并创建一个空的新日志文件。

3、段合并

为了解决段增多的问题,Elasticsearch引入了段合并机制,定期将较小的段合并到较大的段中,而较大的段合并到更大的段中;

说明:

上一篇 下一篇

猜你喜欢

热点阅读