一.单机
优势:配置简单容易维护;
劣势:容易发生单点故障(数据存在一台服务器上,如果这台服务器硬盘发生故障,会发生数据丢失情况),没有容灾措施;单个服务器存储容量有限;
二.主从复制
原理:
通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失数据,为了避免单点故障,通常的做法是将数据复制多个副本以部署在不同的服务器上。为此Redis提供了复制的功能,可以实现一台Redis服务器数据更新后,自动更新新数据到其他Redis服务器上。
在主从模式中,Redis实例分为两种:
主数据库(master):可以进行读写操作,当写操作导致数据库变化时,主动同步数据到从库。
从数据库(slave):一般是只读的,并接受主库同步过来的数据。
优势:可以实现读写分离,缓解master的压力,提升系统性能。
劣势:master只有一台,一旦发生单点故障,可能会引起数据不一致问题(同步过程中故障了)
三.哨兵
原理:
故名思义,哨兵的作用就是监控Redis系统的运行状态;
它有两个功能:
- 监控主库和从库是否运行正常。
- 主库发生故障时,自动将从库转换成新的主库。
为了保证系统的高可用甚至可以部署多个哨兵,哨兵之间也可以互相监控。
优势:哨兵在主从的基础之上,提升了系统的可用性。
劣势:还是只有一个写服务器,在高写入的场景会有性能瓶颈;每个库都存了相同的内容,浪费内存。
四.集群
1.数据的分片存储
Redis集群引入了哈希槽的概念,一个Redis集群有16383个槽。
上图中有3个master服务器分别负责一个槽的子集。
模拟一个增加key的过程:
- 客户端请求redis
- 根据公式HASH_SLOT=CRC16(key) mod 16384计算出key属于哪个槽。
- 根据计算出的结果,指定一个master服务器进行读写操作
同理读的过程也是一样
2.集群的高可用性
每个集群中的节点都必须打开两个TCP通道。
- 一个用于服务与客户端之间的通信,如6379
- 一个用于集群总线,即使用二进制协议的节点到节点通信通道,一般以客户端通信端口加10000,如16379。
节点将群集总线用于故障检测,配置更新,故障转移授权等。
上图中,每个master节点都配置了一个slave节点,一旦其中某一台master离线了,集群将自动提升slave为master。如果主从都fail了,就GG了,所以可以多配置几台slave,提升可用性。
3.扩展性
如果要添加新节点master4,则需要将一些哈希槽从节点master1,master2,master3移至master4。类似地,如果要从群集中删除节点master1,则可以仅移动master1提供的哈希槽到master2和master3。当节点master1为空时,我可以将其从群集中完全删除。
因为将哈希槽从一个节点移动到另一个节点不需要停止操作,所以添加和删除节点或更改节点持有的哈希槽的百分比不需要任何停机时间。