redis高可用方案
1. 主从模式
数据从一个主节点复制到一个或多个从节点。主节点处理数据的写入和查询操作,而从节点则复制主节点的数据,并可以处理读查询操作,以此来分担主节点的读负载。
2. 哨兵模式
sentinel
,哨兵是
redis
集群中非常重要的一个组件,主要有以下功能:
- 集群监控:负责监控 redis master 和 slave 进程是否正常工作。
- 消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。
- 故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。
- 配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址。
哨兵用于实现
redis
集群的高可用,本身也是分布式的,作为一个哨兵集群去运行,互相协同工作。
- 故障转移时,判断一个 master node 是否宕机了,需要大部分的哨兵都同意才行,涉及到了分布式选举,即主观下线的判断。
- 即使部分哨兵节点挂掉了,哨兵集群还是能正常工作的。
- 哨兵通常需要 3 个实例,来保证自己的健壮性。
- 哨兵 + redis 主从的部署架构,是不保证数据零丢失的,只能保证 redis 集群的高可用性。
- 对于哨兵 + redis 主从这种复杂的部署架构,尽量在测试环境和生产环境,都进行充足的测试和演练。
3. Redis Cluster
Redis Cluster
是一种服务端
Sharding
技术,
3.0
版本开始正式提供。
采用slot(槽)的概念,一共分成16384
个槽。将请求发送到任意节点,接收到请求的节点会将查询请求发送到正确的节点上执行。
特点
- 数据分片:Redis Cluster将数据自动分片到多个节点上,每个节点负责一部分数据,从而实现了数据的分布式存储。
- 高可用性:Redis Cluster采用主从复制模式,每个分片都有一个主节点和多个从节点。当主节点故障时,Redis Cluster会自动从从节点中提升一个新的主节点,确保服务的高可用性。
- 负载均衡:客户端可以通过任意节点访问Redis Cluster,Redis Cluster会自动将请求转发到正确的节点上,实现了负载均衡。
- 自动故障转移:Redis Cluster能够自动检测节点的故障,并进行故障转移,减少了运维的负担。
方案说明
- 根据数据的key进行哈希运算,并将哈希结果对16383取余,以确定数据应该存储在哪个槽中,默认分配了16384 个槽位。
- 每份数据分片会存储在多个互为主从的多节点上。
- 数据写入先写主节点,再同步到从节点(支持配置为阻塞同步)
- 同一分片多个节点间的数据不保持强一致性。
- 读取数据时,当客户端操作的key没有分配在该节点上时,redis会返回转向指令,指向正确的节点。
- 扩容时需要需要把旧节点的数据迁移一部分到新节点。
在
redis cluster
架构下,每个
redis
要放开两个端口号,比如一个是
6379
,另外一个就是 加
1w 的端 口号,比如
16379
。
16379
端口号是用来进行节点间通信的,也就是
cluster bus 的通信,用来进行故障检测、配置更新、 故障转移授权。
cluster bus
用了另外一种二进制的协议,
gossip 协议,用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间。
优点
- 无中心架构,支持动态扩容,对业务透明
- 具备Sentinel的监控和自动Failover(故障转移)能力
- 客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
- 高性能,客户端直连redis服务,免去了proxy代理的损耗
缺点
- 运维也很复杂,数据迁移需要人工干预
- 只能使用0号数据库
- 不支持批量操作(pipeline管道操作)
- 分布式逻辑和存储模块耦合等
4. Redis Sharding
Redis Sharding是Redis Cluster出来之前,业界普遍使用的多Redis实例集群方法。
其主要思想是采用哈希算法将Redis数据的key进行散列,通过hash函数,特定的key会映射到特定的Redis节点上。
Java redis客户端驱动jedis,支持Redis Sharding功能,即ShardedJedis以及结合缓存池的 ShardedJedisPool。
优点
优势在于非常简单,服务端的Redis
实例彼此独立,相互无关联,每个
Redis实例像单服务器一样运行,非常容易线性扩展,系统的灵活性很强。
缺点
由于
sharding
处理放到客户端,规模进一步扩大时给运维带来挑战。
客户端
sharding
不支持动态增删节点。服务端
Redis实例群拓扑结构有变化时,每个客户端都需要更新调整。连接不能共享,当应用规模增大时,资源浪费制约优化。