ES集群的基本概念
Cluster
代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的
Shards主分片
代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改,这里和索引分片的算法有关,因为是通过取模算法去判断分到哪,如果改变了 就无法正常查询之前的索引。
replicas分片副本
代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
Recovery
代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。
ES为什么要实现集群
ES集群中索引可能由多个分片构成,并且每个分片可以拥有多个副本。通过将一个单独的索引分为多个分片,我们可以处理不能在一个单一的服务器上面运行的大型索引,简单的说就是索引的大小过大,导致效率问题。不能运行的原因可能是内存也可能是存储。由于每个分片可以有多个副本,通过将副本分配到多个服务器,可以提高查询的负载能力。同时提高容错性和高可用性
ES集群核心原理分析
分片存储规则
1、每个索引会被分成多个分片shards进行存储,默认创建索引是分配5个分片进行存储(需要注意的是es7.0默认索引分片数调整为1了
)。每个分片都会分布式部署在多个不同的节点上进行部署,该分片成为primary shards.
注意:索引的主分片primary shards定义好后,后面不能做修改。
2、为了实现高可用数据的高可用,主分片可以有对应的备分片replics shards,replic shards分片承载了负责容错、以及请求的负载均衡.
注意: 每一个主分片为了实现高可用,都会有自己对应的备分片,他们之间的关系可以是一对多,主分片对应的备分片不能存放同一台服务器上(单台ES没有备用分片的)。主分片primary shards可以和其他replics shards存放在同一个node节点上。
在往主分片服务器存放数据时候,会对应实时同步到备用分片服务器,但是查询时候,所有(主、备)都进行查询:
Node1 :P1+P2+R3组成了完整的数据
实例演示:
下面是一个已经搭建好的集群.版本为ES7.6.0
创建一个索引
PUT /testindex
查询该索引
GET /testindex
7以下的版本这里会是5和1 这里是7.6.0版本所以是1 1
number_of_shards 相当于主分片数量 代表将索引分成几个分片 5就代表索引会分成5个分片
number_of_replicas 这里相当于是副分片的总数,和上面不同的是这里的1代表所有的副分片组成一份副本的意思.比如有5个主分片,
这里就是5个副分片组成1分总副分片,如果这里是2 代表会有10个副分片组成2份总的副分片.
修改分片数
分片数一般通过修改elasticsearch.yml文件中配置默认值
这里我们修改副分片数量为2
PUT testindex/_settings
{"index" : {"number_of_replicas" : 2}
}
然后查询索引分片信息
GET /testindex/_search_shards
可以看到上图 testindex索引主分片有1个 副分片变为2个 (这里只是针对testindex来说,如果建立其他的索引分片初始还是会变成默认值)
我们接下来尝试修改主分片数量
PUT testindex/_settings
{"index" : {"number_of_shards" : 3}
}
报错,证明索引创建后无法修改分片数
创建索引时指定分片数量
要修改分片数只能在索引创建的时候进行修改
PUT test
{"settings" : {"index" : {"number_of_shards" : 3,"number_of_replicas" : 2}}
}
GET /test/_settings 创建并修改成功
执行 GET /test/_search_shards
可以发现 shards信息中一共有3个主索引 6个副索引
这里我简化了shards节点数据 画图表示
抽象成下图
每个节点上都有一份完整的数据 即使其他两个节点宕机也不会影响查询
数据路由
当客户端发起创建document的时候,es需要确定这个document放在该index哪个shard上。这个过程就是数据路由。
路由算法:shard = hash(routing) % number_of_primary_shards
这里的routing指的就是document的id
如果number_of_primary_shards在查询的时候取余发生的变化,无法获取到该数据
已知主分片数量为3,
路由算法: shard = hash(routing) % 主分片数量3
分片位置 p1 = 1% 3 , p2 =2%3 , p0=3%3
使用
GET test/_search_shards?routing=1
可以查看具体数据路由到哪个分片上面
如上 id为1的文档会路由到2号分片上