系统架构
概念
一个运行中的Elasticsearch
实例称为一个节点,而一个Elasticsearch
集群中包含一个或者多个拥有相同cluster.name
配置的节点组成, 它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。
当一个节点被选举成为主节点时, 它将负责管理:集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。 当主节点宕机后,副节点中的其中一个会成为主节点。
作为用户,我们可以将请求发送到集群中的任何节点 ,包括主节点。 每个节点都知道任意文档所处的位置,并且能够将我们的请求转发到存储我们所需文档的节点。 无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回给客户端。
分片与副本
索引数据存储在集群中时,可以设置分片数和副本数。P0
,P1
,P2
是分片,而R0
,R1
,R2
表示副本。但是分片对应的副本不能在同一个节点上,例如P0
的R0
不会在同一个节点上。每一个分片里面的东西就是一个底层Lucence
的索引,Lucence
是一个全文检索引擎,所以每一个节点都是一个全文检索引擎,那访问任何一个节点都能搜索出数据,如果是查询Lucence
会把满足条件的多个引擎的结果合并在一起。
单节点集群
在一个空节点的集群内创建名为orders
的索引, 为了后续的演示,创建时分配3个主分片和一个副本(每个主分片拥有一个副本分片)。
请求url:http://127.0.0.1:9201/orders
,
请求body:
{
"settings":{
"number_of_shards":3,
"number_of_replicas":1
}
}
响应内容:
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "orders"
}
即创建了一个索引orders
, 一共3
个分片, 每个分片1个副本,那就会构成6
个分片数据。
由于集群是一个拥有一个索引的单节点集群。所以所有3个主分片都会被分配在node-9201
当中。
接下来可以使用elasticsearch head
插件来进行查看,插件是使用可以查看文章https://blog.csdn.net/zenglingmin8/article/details/117488783。
查看node-9201
节点的状态:
可以从单集群看出,健康值为yellow
。因为有三个副本没办法创建出来。3个主分片都存在了node-9201
节点上。
集权健康值:yellow(3 of 6)
:表示当前集群的全部主分片都正常运行,但是副本分片没有全部处在正常状态。
上图表示3个主分片正常。
上图表示3个副本分片都是Unassigned — 它们都没有被分配到任何节点。在同一个节点上既保存原始数据又保存副本是没有意义的。因为一旦失去了那个节点,我们也将失去该节点上所有副本数据。
当前集群是正常运行的,但是在硬件故障时有丢失数据的风险。
故障转移
当集群中只有一个节点在运行时,意味着会有一个单点故障问题----么有冗余。幸运的是,只需要启动一个节点即可防止数据丢失,启动第二个节点时,只要它和第一个节点有同样的cluster.name
配置,它就会自动发现集群并加入到其中。(如果新节点在不同的机器上时需要配置单播主机列表
)。
如果启动了第二个节点,集群会拥有两个节点的集群:所有主分片和副本分片都会被分配。
在我们启动了node-9202
之后再查看elasticsearch head
可以看到9202已经分配到了副本。 集群的状态也变为了 集群健康值: green (6 of 6)
绿色。
水平扩容
怎样为我们正在增长中的应用程序按需扩容,当启动第三个节点, 我们的集群将会拥有三个节点的集群:为了分散负载而对分片进行重新分配。
node-9203
启动之后节点自动将副本、分片进行了重新调整。加粗
的为主分片。
分片原则:
- 主分片和副本不能在同一节点
- 分配尽量的均匀。
如果想扩容多余6个节点怎么办?
朱分片的数据在索引创建时就已经确定下来,实际上,这个数目定义这个索引能够存储的最大数据量。(实际大小取决于你的数据、硬件和使用场景。)但是,读操作— 搜索和返回数据 — 可以同时被主分片或副本分片所处理, 所以当你拥有越多的副本分片时, 也将拥有越高的吞吐量。
在运行中的集群上可以调整副本分片数目, 我们可以按需伸缩集群。让我们把副本数增加,使得最终的分片数(主分片+副本)超过节点数。