redis学习5--redis主从复制,读写分离

  1 一个主节点可以有多个从节点,一个从节点只能有一个主节点,数据只能从主节点流向从节点,是单向的。默认下从节点是只读模式的,但也通过配置修改从节点写操作(一般不会这样,容易造成主从数据不一致)。以下是三种复制实现方式

  1:在配置文件中加入slaveof  {masterHost}  {masterPort}

  2:   启动redis服务器的时候 加参数 redis-server --slaveof  {masterHost}  {masterPort}

  3    直接在客户端执行slaveof  {masterHost}  {masterPort}

  可以使用info replication 查看复制相关状态

  可以使用slaveof no one来断开复制,断开复制后从节点原来的数据不会删除, 当原来从节点切换主节点(做一个新的主节点的从节点)的时候 会清空原来的数据

  一主一从复制结构,主节点不开启持久化 ,从节点开启持久化,这样即保证了主节点的性能 又避免了持久化对主节点性能的影响,但是 当主节点脱机 自动重启时,需要注意的是因为主节点未开启持久化 重启后主节点数据为空,这时从节点也会跟着清空数据,所以主节点脱机前 因该先将从节点断开,避免数据丢失。

  一主多从复制结构,主节点用于写场景,从节点用于读场景,对于一些阻塞性的命令 可以放在从节点上进行。

  树状主从: 这个太复杂 太强了 以后再说吧。

  2 复制原理

  redis学习5--redis主从复制,读写分离

  数据同步:第一次复制一般使用全量复制,后面的复制使用部分复制,从节点每秒上报自己的复制偏移量给主节点,通过对比主从节点的复制偏移量,可以判断主从节点数据是否一致 。     

  每次redis主节点重启后 都会被分配一个40位的16进制的run-id,这个id 被当作识别唯一redis节点,比如从节点保存主节点的run-id 可以识别自己正在复制的是哪个主节点。那么当主节点重启了 变更了整体数据文件(rdb/aof) 此时再去复制是不安全的。所以当 主节点的run-id变化后 从节点需要重新一次全量复制。需要注意的是 每次重启 run-id都会改变, 当然也可以通过配置文件达到重启后 run-id 不变,这样就避免了不必要的全量复制。

  心跳:主从关系建立后,他们之间的关系维护通过心跳命令来维持, 主节点每隔10秒向从节点发送ping命令,从节点每隔1秒发送replconf ack {offset} 上报自己的偏移量。