众所周知,redis是目前非常流行的缓存中间件之一。在redis官网有这么一段话: redis有着丰富的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。
本文基于官方文档,对主从模式、哨兵模式、Cluster集群三种模式进行简单介绍,让大家对三种模式有一个基础的认知,想要获取各个模式更加深入的理解,可以查看文档后面对应的官网链接。
1 主从模式(replication)
我们使用Redis单机时,由于数据是存储在一台服务器上的,所以当这台服务器出现问题时或者这个Redis单机服务出现故障时,就会导致存储的数据丢失,以及Redis服务的不可用。为了避免单点故障,Redis 提供了复制(replication)功能,可以将主 Redis 服务器(下文称 master)的数据精准地复制到多个从 Redis 服务器(下文称 slave)上,并且每次当 slave 和 master 之间的连接断开时, slave 会自动重连到 master 上,并且无论这期间 master 发生了什么, slave 都将尝试让自身成为 master 的精确副本。我们将这种基于复制功能的模式称为主从模式。
在主从模式下,master可以进行读写操作,当写操作导致数据变化时会自动将数据同步给slave。而slave默认只能读不能写,但是可以接受master同步过来的数据。一个master可以拥有多个slave,而一个slave只能拥有一个master,从slave也可以拥有自己的slave。
优点:增强了Redis单机的高可用性
缺点:当主节点宕机后,需要手动将从节点变更为主节点,否则系统不可用。
推荐版本:Redis 4.0及以后
详细介绍:
中文-http://www.redis.cn/topics/replication.html
英文-https://redis.io/topics/replication
2 哨兵模式(Sentinel)
哨兵模式是基于主从模式的,我们知道主从模式最大的缺点就是当主节点宕机后,从节点无法自动上升为主节点对外提供服务。Redis 2.8及以后版本提供了哨兵工具来实现自动化的系统监控和故障恢复功能。
哨兵的作用就是监控master、slave是否正常运行,master出现故障后自动将slave转换为master。
Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 哨兵主要起以下作用:
a、通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
b、当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
需要强调的是,哨兵模式中将主服务器判断为失效至少需要 2 个 Sentinel 同意,所以我们至少要部署两个及以上的Sentinel 。
优点:
a、哨兵集群模式是基于主从模式的,所有主从的优点,哨兵模式同样具有;
b、主从可以切换,故障可以转移,系统可用性更好;
c、哨兵模式是主从模式的升级,系统更健壮,可用性更高。
缺点:
不能支持高并发,哨兵模式能提供写入功能的也就只有主节点。
推荐版本:Redis 4.0及以后
详细介绍:
中文-http://www.redis.cn/topics/sentinel.html
英文-https://redis.io/topics/sentinel
3 集群模式(Cluster)
Redis集群结构是:N个平权主节点(master),每个主节点对应M个从节点(slave)。
Redis集群通过哈希槽((hash slot)来分配数据,哈希槽的编号为0-16383。集群把这个16384分配给这N个主节点,当存取的key值到达时,通过CRC16(key) % 16384 取余找到对应插槽,并跳转到对应节点上进行存取操作。
Redis集群投票机制:服务器之间通过互相的ping-pong判断是否节点可以连接上。如果有一半以上的节点去ping一个节点的时候没有回应,集群就认为这个节点宕机了。此时该主节点对应的从节点上升为主节点。当没有从节点可替补时,集群宕机。
因为投票机制,N须为奇数。
必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。
优点:
a、主节点宕机后,基于投票机制从节点可自动上升为主节点;
b、数据分区存储在不同的主节点上,可以大幅度提升Redis服务的性能支撑。
缺点:由于数据分区存储,所以当一个主节点及其对应的从节点全部宕机后,整个Redis集群即不能使用。
推荐版本:Redis 5.0及以后
详细介绍:
中文-①http://www.redis.cn/topics/cluster-tutorial.html ②http://www.redis.cn/topics/cluster-spec.html
英文-①https://redis.io/topics/cluster-tutorial ②https://redis.io/topics/cluster-spec
最后总结一下,哨兵模式和集群模式对于期望Redis服务能够达到高可用的用户,都是能够满足需求的,如果需要高性能的用户,则推荐使用Redis集群。
对于Redis的主从模式,高可用和并发均不能有效支持,不推荐使用。
参考文献: Redis中文官方文档:http://www.redis.cn/documentation.html Redis英文官方文档:https://redis.io/documentation Redis详解6.主从模式-https://www.jianshu.com/p/b46cb093a083 关于redis的主从、哨兵、集群-https://blog.csdn.net/c295477887/article/details/52487621 浅析redis主从、哨兵和Cluster-https://cloud.tencent.com/developer/article/1499541 Redis哨兵(Sentinel)模式-https://www.jianshu.com/p/06ab9daf921d |