redis6.x主从复制+读写分离
1.redis主从架构介绍
-
背景
- 单机部署简单,但是可靠性低,且不能很好利用CPU多核处理能力
- 生产环境必须要保证高可用,一般不可能单机部署
- 读写分离是可用性要求不高、性能要求较高、数据规模小的情况
-
目标
- 读写分离,扩展主节点的读能力,分担主节点读压力
- 容灾恢复,一旦主节点宕机,从节点作为主节点的备份可以随时顶上来
-
redis主从架构介绍
2.redis一主二从配置实战
-
创建主配置文件
vim master6379.conf
bind 0.0.0.0 port 6379 daemonize yes requirepass "123456" logfile "/usr/local/redis/temp/master6379.log" dbfilename "master6379.rdb" dir "/usr/local/redis/temp" appendonly yes appendfilename "master6379.aof" masterauth "123456"
-
创建第一个从配置文件
vim slave6380.conf
bind 0.0.0.0 port 6380 daemonize yes requirepass "123456" logfile "/usr/local/redis/temp/slave6380.log" dbfilename "slave6380.rdb" dir "/usr/local/redis/temp" appendonly yes appendfilename "slave6380.aof" masterauth "123456" replicaof 127.0.0.1 6379
-
创建第二个从配置文件
vim slave6381.conf
bind 0.0.0.0 port 6381 daemonize yes requirepass "123456" logfile "/usr/local/redis/temp/slave6381.log" dbfilename "slave6381.rdb" dir "/usr/local/redis/temp" appendonly yes appendfilename "slave6381.aof" masterauth "123456" replicaof 127.0.0.1 6379
-
注意:防火墙记得关闭;需要开放对应的端口;阿里云服务器记得开放网络安全组
-
启动
# 启动主节点 ./bin/redis-server ./temp/master6379.conf # 启动从节点1 ./bin/redis-server ./temp/slave6380.conf # 启动从节点2 ./bin/redis-server ./temp/slave6381.conf
-
info replication查看信息
3.redis主从复制-读写分离原理
- 主从复制分两种(主从刚连接的时候,进行全量同步;全同步结束后,进行增量同步)
- 全量复制
- master服务器会开启一个后台进程用于将redis中的数据生成一个RDB文件
- 主服务器会缓存所有接收到的来自客户端的写命令,当后台保存进程处理完毕后,会将该RDB文件传递给slave服务器
- slave服务器会将RDB文件保存在磁盘并通过读取该文件将数据加载到内存
- 在此之后master服务器会将在此期间缓存的命令通过redis传输协议发送给slave服务器
- 然后slave服务器将这些命令依次作用于自己本地的数据集上最终达到数据的一致性
- 增量复制
- slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程
- 服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令
- 全量复制
- 特点
- 主从复制对于 主/从 redis服务器来说是非阻塞的,所以同步期间都可以正常处理外界请求
- 一个主redis可以含有多个从redis,每个从redis可以接收来自其他从redis服务器的连接
- 从节点不会让key过期,而是主节点的key过期删除后,成为del命令传输到从节点进行删除
- 加速复制
- 完全重新同步需要在磁盘上创建一个RDB文件,然后加载这个文件以便为从服务器发送数据
- 在比较低速的磁盘,这种操作会给主服务器带来较大的压力
- 新版支持无磁盘的复制,子进程直接将RDB通过网络发送给从服务器,不使用磁盘作为中间存储
- 开启指令:repl-diskless-sync yes(默认是no)
- 主从断开重连
- 如果遭遇连接断开,重新连接之后可以从中断处继续进行复制,而不必重新同步
- 2.8版本后,部分重新同步这个新特性内部使用PSYNC命令,旧的实现中使用SYNC命令