Redis主从架构
主从架构概述
从redis向主redis拷贝数据做备份,从redis不能写数据,只能读数据。主redis可读可写,如果主redis服务挂了,从redis不会自动选举出主reids,需要手动指定(修改配置文件)哪个从redis变为主redis,整个服务才能继续可用。
主从架构的搭建
- 在redis主目录下创建conf,data两个文件夹
- 复制一份redis.conf文件到config文件夹
cp redis.conf ./config/redis_6380.conf - 修改相关配置如下
port 6380
pidfile /var/run/redis_6380.pid
logfile "6380.log"
dir /usr/local/redis-5.0.2/data/6380
#配置主从复制 从本机6379的redis实例复制数据
replicaof 192.168.20.135 6379
#从redis只读
replica‐read‐only yes
- 再拷贝一份redis_6381.conf 配置与上面相同,将端口号改为6381.
- 使用redis-server客户端启动三个服务
#开启端口6379的redis
./redis-server ../redis.conf &
#开启端口号为6380的redis
./redis-server ../config/redis_6380.conf &
#开启端口号为6381的redis:
./redis-server ../config/redis_6381.conf &
并使用redis-cli客户端连接三个服务(开三个会话窗口):
窗口1
./redis-cli
角色是master
窗口2:
./redis-cli -p 6380
角色是slave.
窗口3:
./redis-cli -p 6381
角色是slave。
从redis无法设置与修改数据:
主redis设置数据:
从redis获取数据:
主从复制原理
全量复制
- salve与master建立长连接,slave发送psnyc命令,请求同步数据。
- master收到命令后,执行bgsave命令生成最新的rdb快照,发送给slave.
- 为了防止在rdb快照生成过程中有新的数据写入,导致slave拷贝的数据不全,master有一块名叫repl_back_buffer的缓冲区保存最近的更新指令。rdb快照发送完后,也会把缓冲区的数据也发送给slave。
- slave将拿到的rdb快照与buffer数据
合并成完整的rdb快照
,再加载进内存 - master通过socket长连接持续把写命令发送给从slave,保证主从数据一致性
部分复制
从2.8版本开始,slave与master能够在网络连接断开重连后只进行部分数据复制。
- slave与master断开连接后,重新与master建立连接,slave发送psync命令请求同步数据,并附带一个slave当前已有数据的一个偏移量offset.
- master中名为repl_back_buffer的缓冲区会缓存最近一段时间的数据,master接收到offset,能够判断出slave的数据状况,如果offset偏移量存在缓冲区的数据中,则master会将缓冲区中offset偏移量之后的数据一次性同步给slave节点。
- 如果offset偏移量不存在master的缓冲区中,表明slave中的数据与master中数据相差太大,会进行一次全量复制。