1、shard和replica知识归纳梳理
(1)一个index包含多个shard
(2)每个shard都是一个最小工作单元,承载部分数据,可以说就是一个lucene实例,拥有完整的建立索引和处理请求的能力
(3)每当ES集群增加节点时,shard会自动在nodes中实现负载均衡
(4)对于primary shard和replica shard,每个document肯定只存在于某一个primary shard以及其对应的replica shard中,不可能存在于多个primary shard中
(5)replica shard时primary shard的副本,主要负责容错,以及承担读请求的负载
(6)primary shard的数量在创建索引的时候就已经固定了,但是replica shard的数量可以随时修改
(7)primary shard的默认数量是5个,replica默认是1,也就是在默认的情况下,有5个primary shard和5个replica shard
(8)primary shard不能和自己的replica shard放在同一个节点上(否则节点宕机,primary shard和副本都丢失,也就起不到容错的作用了),但是可以和其它primary shard的replica shard放在同一个节点上
2、对于单节点ES集群存在的问题
假设我们创建一个索引test_index
PUT /test_index
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
}
}
(1)单node环境下,创建一个index叫test_index,有5个primary shard,5个replica shard
(2)集群的status是yellow
GET /_cat/health?v
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1555495650 10:07:30 elasticsearch yellow 1 1 8 8 0 0 6 0 - 57.1%
(3)这个时候,只会将5个primary shard分配到仅有的一个node上去,另外5个replica shard是无法分配的
(4)此时集群是可以正常工作的,但是一旦出现节点宕机,数据就会全部丢失,此时节点也不可用,无法承担任何请求
结构如下:
3、对于两个节点ES集群
上面test_index索引的shard分配的结构就会变成:
此时即使存放primary shard的节点挂掉了,ES的shard allocation 会被触发,此时对应的primary shard的一个副本会变成primary shard
在什么场景下会触发Shard的Allocation:
创建/删除一个Index;
加入/离开一个Node;
手动执行了Reroute命令;
修改了Replica设置;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。