主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:
- 海量数据存储问题
- 高并发写的问题
使用分片集群可以解决这个问题;
分片集群是一种将数据分散存储在多个节点上的数据库架构。它通过将数据分割成多个片(shard),并将每个片存储在不同的节点上,从而提供更好的性能和可扩展性。
在分片集群中,每个节点都负责存储和处理一部分数据。当进行数据查询或写入操作时,系统会根据数据的分片规则将请求路由到相应的节点上。这种方式能够提高系统的并发处理能力,因为每个节点只需处理部分数据,减轻了单个节点的负载压力。
同时,分片集群还可以提供高可用性。当一个节点发生故障或维护时,系统可以自动将请求路由到其他可用的节点上,确保服务的连续性。
然而,分片集群也带来了一些挑战。首先,数据的分片需要设计合理的算法和策略,以确保数据在各个节点上均匀分布,避免出现热点数据。其次,跨片查询和事务处理需要额外的复杂性和开销。最后,数据的扩容和迁移也需要仔细规划和执行,以保证系统的稳定性和一致性。
总的来说,分片集群是一种适用于大规模数据存储和高并发访问的数据库架构,它可以提供更好的性能和可扩展性,但也需要综合考虑各种因素来实现和管理。
分片集群特征:
- 集群中有多个master,每个master保存不同数据
- 每个master都可以有多个slave节点
- master之间通过ping监测彼此健康状态
- 客户端请求可以访问集群任意节点,最终都会被转发到正确节点
分片集群存储数据是使用散列插槽原理来存储海量数据的.
插槽原理:
Redis会把每一个master节点映射到0~16383共16384个插槽(hash slot)上,查看集群信息时就能看到:
数据key不是与节点绑定,而是与插槽绑定。redis会根据key的有效部分计算插槽值,分两种情况:
- key中包含"{}",且“{}”中至少包含1个字符,“{}”中的部分是有效部分
- key中不包含“{}”,整个key都是有效部分
例如:key是num,那么就根据num计算,如果是{itcast}num,则根据itcast计算。计算方式是利用CRC16算法得到一个hash值,然后对16384取余,得到的结果就是slot值。
如图,在7001这个节点执行set a 1时,对a做hash运算,对16384取余,得到的结果是15495,因此要存储到7003节点。
到了7003后,执行`get num`时,对num做hash运算,对16384取余,得到的结果是2765,因此需要切换到7001节点。