本文共 1932 字,大约阅读时间需要 6 分钟。
ES集群中所有节点具有相同的 ,它们共同承担数据和负载的压力。
主节点Master只负责管理集群范围内的所有变更,如增加/删除索引、增加/删除节点等,即集群的元信息,不涉及文档级别的搜索、新增、修改等操作。
请求可以发送到集群中的任何节点上,每个节点都知道任意文档所处的位置,并且能把请求直接转发到存储我们所需文档的节点,它都能负责从包含我们所需文档的节点收集回数据,并将最终结果返回给客户端
集群中第一个节点启动,会充当Master节点,并维护集群中的元信息:
紧接着,启动第二个节点,只要该节点的配置项cluster.name和第一个节点相同,就会自动发现集群并加入,如果是不同机器,需要配置一个可连接到的单播主机列表 Node2连接到Node1后,Node1更新集群元信息,然后将元信息下发给下面的所有节点,让当前集群的所有节点都有一份相同的元信息。同理,其他节点的加入也和Node2加入的流程相同:
ES添加数据所用到的索引实际上指向了一个或者多个物理分片的逻辑命名空间。
一个索引在存储时被分为了好几个主分片,每一个主分片会放在随机一台机器节点上。Elasticsearch在索引中搜索时,它发送查询到每一个属于索引的分片的机器上,然后合并每个分片的结果到一个全局的结果集。
一个副本分片是一个主分片的拷贝,作为保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。
索引建立的时候就确定了主分片数,在后续过程中主分片数不能更改,但是副本分片可以随时修改
分片创建方法:(索引名为test,分配了3个主分片和一个副本分片,每个主分片各有一个副本分片)
PUT /test{ "settings" : { "number_of_shards" : 3, "number_of_replicas" : 1 }}
1、单机环境,只有一个节点
ES健康状态status字段是yellow,因为副本没有被分配到任何节点上2、启动第二个节点,只要cluster.name和第一个节点相同,就会自动发现集群并加入
此时3个副本被分配到NODE2。所有被索引的文档都会保存在主分片上,然后被并行复制到对应副本分片上,保证我们既可以从主分片又可以从副本分片上获取文档3、启动第三个节点,集群会为了分散负载而对分片进行重新分配。(最多可以启用6个节点有效)
副本分片数是可以在运行的集群上动态调整的把副本分片增加到2
PUT /blogs/_settings{ "number_of_replicas" : 2}
此时的集群分片状态如下
关闭Master节点或Master节点发生故障,集群首先会选举一个新的Master节点,新的Master节点再立即把在NODE2和NODE3对应的副本分片提升为主分片,此时集群状态变为yellow
重启之前故障的Node1节点,集群会将副本分片再次分配,如果NODE1依然拥有之前的分片,它将尝试重用他们,同时仅从主分片复制发生了修改的数据文件P0、P1、P2是三个主分片,R1、R2、R3是对应的三个副本分片
索引文档的步骤:
- node2计算文档的路由值得到文档存放的分片(假定路由选定的是分片0)
- 将文档转发给分片0的主分片节点 node1
- node1索引文档,同步给副本节点node3索引文档
- node1向node2反馈结果
- node2作出响应
决定文档存放到哪个分片上就是文档路由。
ES中通过下面的计算得到每个文档的存放分片:
shard = hash(routing) % number_of_primary_shards
- number_of_primary_shards:创建索引时候指定的主分片数参数值
- routing:用来进行hash计算的路由值,默认是使用文档id值。我们可以在索引文档时通过routing参数指定别的路由值
- 在索引、删除、更新、查询中都可以使用routing参数(可多值)指定操作的分片。
关系型数据库中有分区表,通过选定分区,可以降低操作的数据量,提高效率。在ES中,我们可以通过指定路由值,让一个节点分片上存放一个区的数据,如按部门存放数据,则可指定路由值为部门值
- node2解析查询
- node2将查询发给索引s1的分片/副本(R1,R2,R0)节点
- 各节点执行查询,将结果发给Node2
- Node2合并结果,作出响应
转载地址:http://rgsxi.baihongyu.com/