1.集群
一个运行的Elasticsearch实例被称为一个节点,而集群是有一个或多个拥有相同claster.name配置的节点组成,他们共同承担数据和负载压力,当有节点加入或从集群中移除的时候,集群或自动平局分布所有数据。
当一个节点被选举成为主节点时,他哈不负责额管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。而主节点不涉及文档级别的变更和搜索操作,所以集群只有一个主节点,即使流量增加,他也不会成为瓶颈。任何节点都可以成为主节点。
3.添加索引
PUT /blogs
{
"settings":{
"number_of_shards":3,
"number_of_replicas":1
}
}
设置三个主分片,1个复制分片。
4.水平扩展
PUT /blogs/_settings
{
"number_of_replicas":2
}
复制分片从一个增加到两个。不能修改主分片个数。
5.路由一个文档到分片
当索引一个文档时,文档会被存储到主分片中。存到哪个主分片由下面这个公式决定:
shard = hash(routing) % number_of_primary_shards.
routing是一个可变值,默认是文档_id,也可以设置一个自定义的值。
number_of_primary_shards主分片数。
这里解释了为什么不能改变主分片数量:因为如果数量变化了,那么所有的之前路由的值都会无效,文档也找不到了。
6.新建、索引和删除单个文档
1).客户端向集群中的一个节点(协调节点)发送请求。
2).节点使用文档的_id确定文档所属的分片,转发请求到分片所属的节点(master).
3).主分片执行请求。若执行成功,将请求并行转发到复制节点。一旦所有复制节点报告执行成功。master节点向协调节点报告成功,协调节点向客户端报告成功。
7.检索单个文档
1).客户端向集群中的一个节点(node1)发出请求。
2).node1节点使用_id确定文档所属分片,将请求转发大其中个一个分片所属节点(node2)。
3).node2将文档返回给node1,然后将文档返回给客户端。
协调节点每次请求的时候选择不同的副本分片达到负载均衡。
8.局部更新
1).客户端向node1发送更新请求。
2).转发请求到主分片所在的node2。
3).node2从主分片检索文档,修改_source字段中的JSON,并尝试重新索引主分片文档。如果文档已经被另一个进程修改了,他将重试步骤3,超过retry_on_conflict次后放弃。
4).如果node2成功更新索引,它将新版本的文档转发到所有副本分片所在的节点,重新建立索引