Redis 是一个内存数据库,我们知道,一旦进程挂掉,内存中的数据就丢失了。虽然在新的Redis版本中提供了AOF持久化功能,但单台节点,对于数据安全性,性能上还是存在较大的问题。因此在生产环境中,一般都会使用三台以上节点,用以部署Redis-Sentinel对Redis进程进行监控与故障转移,并部署Redis主从提供数据的冗余来提高数据安全性并进行读写分离来提高吞吐量。
Redis主从是读写分离的关键,既可以首先数据的冗余,也可以提高整个Redis集群的性能。Redis的主从依赖与Redis给我们提供的复制功能。通过复制,可以轻松的实现相同数据的多个副本。复制功能是实现高可用Redis的基础,哨兵和集群都是在复制的基础上实现的。
搭建主从结构
Redis的主从结构搭建非常简单,因为Redis本身对主从做了非常好的支持。我们只需要准备好至少两台节点,并先安装好Redis之后,一条命令就可以了。
搭建主从的关键在于复制,复制的配置非常简单。在默认情况下,任何一个redis节点都是作为主节点存在。配置从节点只需要在规划的从节点中指向主节点的IP和端口即可。
配置主从有三种方式,可以在配置文件中配置,可以使用命令行参数也可以直接使用命令来配置。
- 配置文件中配置
slaveof host port
修改配置之后要重启服务
- 从节点启动时命令行参数
redis-server --slaveof host port
- 客户端命令
slaveof host port
注意:
对于这三种方式,一般使用最多的就是在配置文件中配置的方式。对于第二种和第三种方式,只是临时生效,当服务重启后,都需要再进行重新配置。
- 查看复制状态
info replication
- 断开连接
slaveof no one
从节点从主节点中断开以后,从节点的数据依然是存在的。
当从节点连接到主节点的时候,从节点会先清空原数据,再进行全量复制主节点的数据
主从建立的流程
- 保存主节点信息
- 主从建立socket连接
- 发送ping命令
- 权限验证
- 同步数据集
- 命令持续复制
全量复制和增量复制
- 全量复制
全量复制是Redis最早支持的复制方式,也是主从第一次建立复制时必须经历的阶段。如果数据量较大,那么全量复制对性能和网络的资源消耗是非常严重的。复制过程如下:
- 增量复制
增量复制主要Redis针对全量复制的过高开销做出的一种优化措施,使用 psync runid offset
命令实现。增量复制的过程如下:
使用场景
- 读写分离
- 数据延时
- 过期数据
- 从节点故障
- 故障转移
- 实时备份
主从存在的问题
- 主节点的故障,需要手动将从节点晋升为主节点
- 主节点的写操作会遇到瓶颈
- 主节点的存储能力会遇到瓶颈