学习思路:
- 分片算法
- 分布式CRUD原理
一、分片算法
主分片数量是在索引创建的时候确定(7.0版本前默认5个)并且后期不可修改 ,复制分片可以随时更改,为什么主分片数量确定后就不可修改,这要从它的分片算法说起:分片算法跟数据库分片算法的概念一样,首先需要一个分片字段(默认_id)然后按照一定的算法将数据分配得到指定的分片,分片算法如下
分片=hash(分片字段value)%主分片数量
是根据主分片数量进行取模得到对应的分片,如果主分片数量改变,那么之前的数据再按照这个算法就不成立,必须重新清洗数据,重新分配
二、分布式CRUD原理
我们先创建索引指定2个主分片,每个主分片2个复制分片,启动3个节点,如图
暂定node1为master节点,node2,node3为数据节点,都可以存储数据,每个节点都能接收请求、知道数据对应的节点、转发请求到对应的节点;简单说:我们访问过程中能随意访问任意一个node;集群对客户端无差异(比如我们选择轮循的负载均衡算法)
1、数据的新增、删除
这三种操作都是写操作,必须由主分片发起,然后同步到其它复制分片
解释:
- 发起写请求到node1,经过分片算法将数据分配到P0分片,而P0分片在node3
- 请求路由到node3,node3-P0(主分片)处理完毕后
- 数据同步到其它两个复制分片(node1/node2(R0))
- 同步完成后返回node1成功,node1返回客户端成功
在第三步主分片同步复制分片时:默认是同步的,如果设置如果设置为异步,可能出现同步失败,但返回客户端成功的情况
2、查询
查询操作可以从任何节点、任何分片发起,然后根据一定的负载均衡算法(如轮循算法)选择真正哪个节点、哪个分片处理
解释:
- 假如客户端发起请求到node1节点,经过算法发现数据存在0分片,而0分片在三个节点都有
- 经过算法将请求路由到node2:R0检索数据(每次路由到的节点可能都不一样)
- R0检索到数据后返回node1节点,node1返回客户端
3、修改
修改操作是先读后写
解释:
- 客户端请求node1进行修改数据操作,先根据算法发现数据所在的主分片(P0):后面要写操作,所以这里找的是主分片
- 将请求路由到node3:P0
- 查询出数据,然后在主分片进行修改,修改完毕后重新索引(如果出现并发修改,默认重试3次:retry_on_conflict=3)
- 主分片修改成功后同步修改复制分片
- 都修改成功后返回node1,node1返回客户端
总结:
- 增删改,这类写操作必须先找到对应的主分片,主分片操作完后再同步复制分片
- 查(读操作)是可以在任何分片进行
- 批量操作就是将批量查分成单个进行上述操作,然后将结果归并,返回客户端
公众号主要记录各种源码、面试题、微服务技术栈,帮忙关注一波,非常感谢