“这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战”
一、ElasticSearch 准实时索引实现
ElasticSearch在存储数据时,并不会直接刷盘到磁盘里(分片Shard),而是经过一些过程来保证查询及时性。
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个大脑,就是脑裂问题。
2. 脑裂会发生什么问题?
因为master是集群中非常重要的角色,主宰了集群状态的维护,以及shard的分配,如果存在2个master,可能会导致数据异常。
3. 如何避免脑裂发生?
过半机制就可以避免脑裂问题的产生。
ElasticSearch通过discovery.zen.minimum_master_nodes
参数配置可以解决脑裂问题。
ElasticSearch解决脑裂问题跟Zookeeper原理一样,都是过半机制。只要集群中超过半数节点投票就可以选出master。
配置文件: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)互相学习、互相交流。