分片架构解决的问题
通过堆机器,提升读写性能,与存储性能
分片架构设计要点
分片规则
选择Cardinality大的作为分片键,尽可能保证数据分布均匀
常见分片键: 基于主键(业务型数据),基于时间(流水型数据)
常见分片策略:
分片策略 |
实现举例 |
数据分布 |
以后扩展 |
基于Hash |
hash(分片键)%分片数 一致性hash算法 |
数据分布均匀 |
不易扩容,扩容需要数据迁移 |
范围分片 |
例如按年分,按月,按日 |
数据分表可能不均匀 |
易扩展,扩展不需要数据迁移 |
路由规则
客户端如何找到数据所在分片
- 静态路由: 配置文件。特点: 简单,不能扩展再平衡,例如:Mysql分表
- 动态路由:实现复制,支持动态扩展,再平衡
动态路由方式 |
基本流程 |
特点 |
举例 |
配置中心 |
配置中心记录分片信息,客户端先访问配置中心, 获取分片信息之后进行读写操作 |
支持大规模集群,配置中心需要独立部署,需要高可用 |
MongoDB的Sharding模式 |
路由转发 |
所有分片都保存路由信息,客户端请求任意分片, 获取分片信息之后进行读写操作 |
架构简单,一般利用gossip协议,不支持大规模集群 |
Redis Cluster (官方推荐1000,实际建议100) |
高可用
备份方式 |
特点 |
举例 |
独立备份 |
架构简单,硬件成本高,分片级别的复制 |
Mysql ,Redis等 |
相互备份 |
架构复杂,硬件成本低,数据块级别的复制 |
ElasticSearch 等 |
redis cluster 分析
特点
理论支持1000台,实际建议100台以内。 高性能,线性可扩展,无代理,异步复制。
架构图- 来自阿里云溪社区
分片规则
分片键
redis的key
分片方式
类似一致性Hash, 通过CRC16算法计算出来的哈希值,对16384(2^14)取模,取模之后得到的值就是对应的槽位,然后每个Redis节点都会负责处理一部分的槽位。
扩展1 一般hash算法缺点
hash(键值)%分片数量,如果有分片挂掉,分片数量会下降,整个集群会失效。
扩展2 一致性hash算法
CRC16算法计算出来的哈希值,对2^32取模
实例也分布在圆环(0-2^32)上,我们在圆环上按照顺时针的顺序找到第一个实例
实例可能分布不均匀,采用虚拟节点机制解决
路由规则
路由转发模式,一般利用gossip协议,所有分片都保存路由信息,客户端请求任意分片
集群为了分布均匀,再平衡,或,添加,删除master实例,存在重定向的情况。
重定向
场景 |
命令 |
说明 |
全部迁移完成的情况下 |
MOVED命令 |
1.MOVED把客户端所请求数据的最新实例地址返返回客户端 2.更新客户端缓存的哈希槽分配信息 |
哈希槽数据还在迁移中 |
ASK |
1.ASK 命令把客户端所请求数据的最新实例地址返回给客户端 2.客户端需要给目标实例 发送 ASKING 命令,然后再发送操作命令 3.不更新客户端缓存的哈希槽分配信息 |
备份方式
独立备份
故障转移:
某一个节点认为A宕机了,那么此时是主观宕机
集群内超过半数的节点认为A挂了, 那么此时A就会被标记为客观宕机文章来源:https://www.toymoban.com/news/detail-465593.html
从A节点的slave节点中选举出一个,将其切换成新的master对外提供服务文章来源地址https://www.toymoban.com/news/detail-465593.html
到了这里,关于分片架构,Redis Cluster 分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!