一、Redis介绍
Redis 支持单机、主从、哨兵、集群多种架构模式
1.1、单机模式
单机模式顾名思义就是安装一个 Redis,启动起来,业务调用即可。例如一些简单的应用,并非必须保证高可用的情况下可以使用该模式。
优点
部署简单;
成本低,无备用节点;
高性能,单机不需要同步数据,数据天然一致性。
缺点
可靠性保证不是很好,单节点有宕机的风险。
单机高性能受限于 CPU 的处理能力,Redis 是单线程的。
单机 Redis 能够承载的 QPS(每秒查询速率)大概在几万左右。取决于业务操作的复杂性,Lua 脚本复杂性就极高。假如是简单的 key value 查询那性能就会很高。
假设上千万、上亿用户同时访问 Redis,QPS 达到 10 万+。这些请求过来,单机 Redis 直接就挂了。系统的瓶颈就出现在 Redis 单机问题上,此时我们可以通过主从复制解决该问题,实现系统的高并发。
1.2、主从复制
Redis 的复制(Replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(Master),而通过复制创建出来的复制品则为从服务器(Slave)。 只要主从服务器之间的网络连接正常,主服务器就会将写入自己的数据同步更新给从服务器,从而保证主从服务器的数据相同。
数据的复制是单向的,只能由主节点到从节点,简单理解就是从节点只支持读操作,不允许写操作。主要是读高并发的场景下用主从架构。主从模式需要考虑的问题是:当 Master 节点宕机,需要选举产生一个新的 Master 节点,从而保证服务的高可用性。
优点
- Master/Slave 角色方便水平扩展,QPS 增加,增加 Slave 即可;
- 降低 Master 读压力,转交给 Slave 节点;
- 主节点宕机,从节点作为主节点的备份可以随时顶上继续提供服务;
缺点
- 可靠性保证不是很好,主节点故障便无法提供写入服务;
- 没有解决主节点写的压力;
- 数据冗余(为了高并发、高可用和高性能,一般是允许有冗余存在的);
- 一旦主节点宕机,从节点晋升成主节点,需要修改应用方的主节点地址,还需要命令所有从节点去复制新的主节点,整个过程需要人工干预;
- 主节点的写能力受到单机的限制;
- 主节点的存储能力受到单机的限制。
1.3、哨兵模式
优点 哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都有; 主从可以自动切换,系统更健壮,可用性更高; Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
缺点 主从切换需要时间,会丢失数据; 还是没有解决主节点写的压力; 主节点的写能力,存储能力受到单机的限制; 动态扩容困难复杂,对于集群,容量达到上限时在线扩容会变得很复杂。
1.4、集群模式
单机、主从、哨兵的模式数据都是存储在一个节点上,其他节点进行数据的复制。而单个节点存储是存在上限的,集群模式就是把数据进行分片存储,当一个分片数据达到上限的时候,还可以分成多个分片。
优点
无中心架构;
可扩展性,数据按照 Slot 存储分布在多个节点,节点间数据共享,节点可动态添加或删除,可动态调整数据分布; 高可用性,部分节点不可用时,集群仍可用。通过增加 Slave 做备份数据副本。 实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成 Slave 到 Master 的角色提升。
缺点
数据通过异步复制,无法保证数据强一致性; 集群环境搭建复杂,不过基于 Docker 的搭建方案会相对简单。