前言
关于ElasticSearch集群概念这里就不多废话了,详细可见ElasticSearch基本介绍、ElasticSearch集群系统架构
单节点集群
我们可以创建一个索引,为这个索引创建三个分片并创建副本,如下
{
"settings":{
"number_of_shards":3,
"number_of_replicas":1
}
}
上面的黄色代表集群健康值,黄色是说当前集群的全部主分区都正常运行,但是副本没有处于正常状态
绿色的0,1,2代表当前这个cat索引的分片数量,
灰色的0,1,2代表副本数量,Unassigned代表他们都没有分配到任何节点,在同一个节点上既可以保存原始数据又保存副本是没有意义的,因为一旦失去了这个节点,那么也就意味着失去了所有副本数据
注意:粗框框的是分片,稍微细一点的是副本
故障转移
当集群中只有一介节点在运行时,意味着会有一个单点故障问题-没有冗余。幸运的是,我们只需再启动一个节点即可防止数据丢失。当你在同一台机器上启动了第二个节点时,只要它和第一个节点有同样的chster.name配置,它就会自动发现集群并加入到其中。但是在不同机器上启动节点的时候,为了加入到同一集群,你需要配置一个可连接到的单播主机列表。之所以配置为使用单播发现,以防止节点无意中加入集群。只有在同一台机器上运行的节点才会自动组成集群。如果启动了第二个节点,我们的集群将会拥有两个节点的集群:所有主分片和副本分片都以被分配
上面我们演示了单节点情况下会存在数据不安全的问题,那么我么将集群的其他节点启动起来,那么这些副本就会自动分配在其他的节点上
水平扩容
Nolie 1和Node2上各有一个分片被迁移到了新的Node3节点,现在每个节点上都拥有2个分片,而不是之前的3个。这表示每个节点的硬件资源(CPU, RAM, I/O)将被更少的分片所共享,每个分片的性能将会得到提升。分片是一个功能完整的搜索引擎,它拥有使用一个节点上的所有资源的能力。我们这个拥有6个分片(3个主分片和3个副本分片)的索引可以最大扩容到6个节点,每个节点上存在一个分片,并且每个节点拥有的全部资源
如果扩容超过6个分片(3个分片3个副本)怎么办
主分片的数目在索引创建时就已经确定了下来。实际上,这个数目定义了这个索引能够存储的最大数据量。(实际大小取决于你的数据、硬件和使用场景。)但是,读操作搜索和返回数据-可以同时被主分片或副本分片所处理,所以当你拥有越多的副本分片时,也将拥有越高的吞吐量。在运行中的集群上是可以动态调整副本分片数目的,我们可以按需伸缩集群。让我们把副本数从默认的1增加到2
{
"number_of_replicas":2
}
节点故障
我们模拟下Master节点宕机情况,体制master节点。
master宕机后那么剩余节点会通过ElasticSearch内部的选举机制选出新的Master节点,这里宕机了一个节点后,不是说整个集群不可用了,只是宕机后的那台机器上的分片和副本无法工作罢了,只是整体集群的性能会下降罢了,我们重新启动一下宕机的那个节点,那么他又会自动加入集群
路由计算&分片控制
路由计算-添加数据
我们现在有条数据,这个时候我们的ElasticSearch集群这么多节点这么多分片这么多副本的怎么知道放在哪呢,首先肯定不是先放在副本中的,是先存放在分片中的,只有分片中有的数据副本中才会有,这里数据存放在那个分片不是随机的分配的,而是使用一套规则,那么这个数据刷到那个分片的过程就是路由计算,路由计算是使用hash路由来的具体公式为hash(id)%主分片数量那么通过这个公式我们就能得到三个节点的位置
分片控制-查询数据
在我们上面的数据保存成功后,p2分片中就有了数据,那么对应的R2也会有数据,那么这个时候我们查询数据的话任意访问节点即可,因为任意节点上都有P2分片或者R2的副本,任意访问的那个节点称为协调节点,这个协调节点可以让我们的请求到数据真正的分片查询(在访问的当前节点压力较大时,也已请求调度到其他节点上),通常情况下分片控制是采用轮询策略实现的