ElasticSearch架构原理进阶篇

1,509 阅读3分钟

“这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战

上一篇ElasticSearch架构原理入门篇

一、ElasticSearch 准实时索引实现

ElasticSearch在存储数据时,并不会直接刷盘到磁盘里(分片Shard),而是经过一些过程来保证查询及时性。

image.png

1. 溢写到文件系统缓存

当数据写入到ElasticSearch分片时,会首先写入到内存中,然后通过内存的buffer生成一个segment,并刷到文件系统缓存中,数据可以被检索,ES中默认1秒,refresh一次。

2. translog保障容错

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

3. flush到磁盘

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

4. segment合并

segment太多时,ElasticSearch会定期将多个segment合并成大的segment,较少索引查询IO开销。

二、ElasticSearch 如何避免脑裂问题?

1. 什么是脑裂?

同一集群中的不同节点,由于网络问题或其他原因导致节点之间的通讯中断,对集群中的状态有了不一样的理解。

比如集群中存在2个master,2个大脑,就是脑裂问题。

image.png

2. 脑裂会发生什么问题?

因为master是集群中非常重要的角色,主宰了集群状态的维护,以及shard的分配,如果存在2个master,可能会导致数据异常。

3. 如何避免脑裂发生?

过半机制就可以避免脑裂问题的产生。

ElasticSearch通过discovery.zen.minimum_master_nodes参数配置可以解决脑裂问题。

ElasticSearch解决脑裂问题跟Zookeeper原理一样,都是过半机制。只要集群中超过半数节点投票就可以选出master。

image.png

image.png

配置文件:elasticsearch.yml

三、ElasticSearch 节点类型介绍

1. MasteNode

主节点在ES中非常重要的,默认情况下任何一个集群中的节点都有可能被选为主节点,索引数据和搜索查询等操作会占用大量的cpu,内存,io资源,为了确保一个集群的稳定,分离主节点和数据节点是一个比较好的选择

主节点和数据节点通过配置指定。

主节点:node.master:true

配置文件:elasticsearch.yml

2. DataNode

数据节点主要是存储索引数据的节点,主要对文档进行增删改查操作,聚合操作等。数据节点对cpu,内存,io要求较高, 在优化的时候需要监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点。

数据节点: node.data: true

配置文件:elasticsearch.yml

3. ClientNode

客户端节点在一个比较大的集群中是非常有用的,他协调主节点和数据节点,客户端节点加入集群可以得到集群的状态,根据集群的状态可以直接路由请求。

负责处理用户请求,实现请求转发,负载均衡等功能。

客户端节点:node.master:false node.data: false

配置文件:elasticsearch.yml

四、总结

ElasticSearch中通过 过半机制 避免脑裂问题。在生产环境下,主节点、数据节点、客户端节点的设置也非常重要。

欢迎大家关注微信公众号(MarkZoe)互相学习、互相交流。