分片和副本
为了将数据添加到Elasticsearch,我们需要索引(index)——一个存储关联数据的地方。实际上,索引只是一个用来 指向一个或多个分片(shards)的“逻辑命名空间(logical namespace)”.
- 一个分片(shard)是一个最小级别“工作单元(worker unit)”,它只是保存了索引中所有数据的一部分。
- 我们需要知道是分片就是一个Lucene实例,并且它本身就是一个完整的搜索引擎。应用程序不会和它直接通信。
- 分片可以是主分片(primary shard)或者是复制分片(replica shard)。
- 索引中的每个文档属于一个单独的主分片,所以主分片的数量决定了索引最多能存储多少数据。
- 复制分片只是主分片的一个副本,它可以防止硬件故障导致的数据丢失,同时可以提供读请求,比如搜索或者从别的shard取回文档。
- 当索引创建完成的时候,主分片的数量就固定了,但是复制分片的数量可以随时调整。
故障转移
集群搭建参考:【ElasticSearch】 ElasticSearch集群(八)
示例:假设集群一搭建好了,且里面有一个索引test-index,通过elasticksearch-head插件查询,集群状态如下:
故障一:数据节点宕机
1、将data节点node-2停止
elasticksearch-head插件查询,效果图如下:
过程:node-2数据节点停止 -> 集群状态立刻变为黄色 -> 过一段时间,集群状态恢复到绿色
说明:
-
- 当前集群状态为黄色,表示主节点可用,副本节点不完全可用
- 过一段时间观察,发现节点列表中看不到node02,副本节点分配到了node01和node03,集群状态恢复到绿色
2、将data节点node-2恢复
效果如下:
可以看到,node02恢复后,重新加入了集群,并且重新分配了节点信息。
故障二:Master主节点宕机
情况1:当有多个节点能成为master节点的集群
集群三个节点配置,如下,都能成为master节点
1 # 表示该节点会不会作为主节点,true表示会;false表示不会 2 node.master: true 3 # 当前节点是否用于存储数据,是:true、否:false 4 node.data: true
集群初始状态,如下:
1、将master节点node-1停止,通过node-3数据节点获取集群状态
可以看到node-2成为了master节点
过一段时间后,集成状态变为绿色,如下:
2、将node-1启动,效果如下:
注意:在集群搭建中,最好保持3个或3个以上的节点能成为master节点,否则可能无法选举出master节点
情况2:只有1个节点能成为master节点的集群
将node-2、node-3节点设置不能成为master节点,配置如下:
1 # 表示该节点会不会作为主节点,true表示会;false表示不会 2 node.master: false 3 # 当前节点是否用于存储数据,是:true、否:false 4 node.data: true
集群初始状态,如下:
1、将master节点node-1停止,通过node-3数据节点获取集群状态
可以看到包异常:master_not_discovered_exception,且整个ES集群处于写入操作被拒绝状态。
集群中没有活动的Master服务器时,ES拒绝哪些操作?
all:
拒绝节点上的所有操作(包括读和写操作)。这也适用于API集群状态读取或写入操作,例如获取索引设置,放置映射和集群状态API。write
(默认):写入操作被拒绝。基于最后一个已知的群集配置,读取操作成功。这种情况可能导致部分读取过时的数据,因为此节点可能与群集的其余部分隔离开来。
可以通过cluster.no_master_block来
指定当集群中没有活动的Master服务器时拒绝哪些操作
2、将master节点node-1恢复
集群自动恢复,且写入正常