Redis复制的原理与优化
标签:Redis

Redis复制的原理与优化

主从复制:就是主节点这边操作什么可以同步到从节点那边去,可以解决单机遇到机器故障,容量瓶颈,QPS瓶颈等问题

一个主节点可以有多台从节点,也可以只有一台,但一个从节点只能有一个主节点,数据流向必须是单向的,必须是从master流向slave的。

作用:

  1. 给一个数据提供了多个副本。
  2. 扩展了redis读的性能

1. 配置

1.1 通过slaveof命令

在client上执行 slaveof 命令,它就会成为指定主机的slave,开始复制,并返回OK。

执行 slaveof no one 后就会断开与主节点之间的连接,但是并不会删除之前从主节点同步过来的数据。

1.2 通过配置

通过配置

slaveof ip port
slave-read-only yes #只读的

对比:

方式 命令 配置
优点 无需重启 统一配置
缺点 不便于管理 需要重启

2. 测试主从复制

Step 1: 拷贝redis.conf文件

cp redis.conf redis-6379.conf

Step 2: 修改redis-6379.conf文件

daemonize yes #以守护进程启动
pidfile /var/run/redis_6379.pid #修改进程的pid
logfile "6379.log" #修改日志文件名字
#save 900 1
#save 300 10
#save 60 10000 #关闭上面这三个
dbfilename dump-6379.rdb
dir /usr/local/redis/data

Step 3: 拷贝redis-6379.conf到redis-6380.conf

cp redis-6379.conf redis-6380.conf

Step 4: 修改redis-6380.conf配置:

port 6380
pidfile /var/run/redis_6380.pid
logfile "6380.log" #修改日志文件名字
dbfilename dump-6380.rdb
slaveof 127.0.0.1 6379

Step 5: 创建data文件夹(!!!注意一定手动创建,否者启动不起来)

mkdir data

Step 6:启动redis,在redis目录下

./bin/redis-server ./redis-6379.conf
./bin/redis-server ./redis-6380.conf
ps -ef|grep redis-server

Step 7: 检查

info replication

Step 8: 测试

Step 8:查看日志

4. 全量复制

查看run id,如果run id发生了较大变动,则从节点要将主节点的内容复制过来。

./bin/redis-cli -p 6379 info server | grep run

过程:

对一个已经存了很多数据的master节点,新的slave节点连接后,把master先前的数据同步过来,同时同步期间写的数据也要同步过来

  1. psync ? -1 :psync有两个参数,一个是run id,一个是偏移量,最开始连接的时候,不知道runid,用的?,偏移量用的-1。
  2. master接收到后,感觉到要做全量复制,返回runId和offset
  3. slave保存master相关信息
  4. master执行bgsave,持久化生成DB,里面存在repl _back_buffer,会记录新的命令
  5. master将rdb传输给slave
  6. master将buffer数据传给slave
  7. slave清除原来的旧数据
  8. 加载rdb数据和buffer数据

4.1 全量复制开销

  1. bgsave时间
  2. rdb文件网络传输时间
  3. 从节点清空数据时间
  4. 从节点加载rdb的时间
  5. 可能的AOF重写时间

5. 部分复制

过程:

加入全量复制过程中的文件丢失,则需要部分复制

  1. 连接断开

  2. master会写一份缓存区

  3. slave再次连接master,网络抖动结束

  4. psync 将现在偏移量和runid传输给master

  5. 检查是否在buffer范围内

  6. 发送部分数据

6. 故障处理

Slave宕机

Master宕机

7. 其他问题

7.1 读写分离

将读流量分摊到从节点上。

可能遇到的问题:

  1. 复制数据延迟
  2. 读到过期数据
  3. 从节点故障

7.2 配置不一致

  1. 例如maxmemory不一致:丢失数据,master和slave的的最大内存不一致,可以主从复制,但是可能会丢失数据
  2. 例如数据结构优化参数(hash-max-ziplist-entries):内存不一致

7.3 规避全量复制

  1. 第一次全量复制

    1. 第一次没办法避免
    2. 可以设置小主节点,低峰
  2. 节点运行ID不匹配

    1. 主节点重启(运行ID变化)
    2. 故障转移,例如哨兵或集群
  3. 复制积压缓冲区不足

    1. 网络中断,部分复制无法满足,不在队列的范围内
    2. 增大复制缓存区配置 rel_backing_size,网络增强。

7.4 规避复制风暴

单主节点复制风暴

大机器复制风暴

  • 6 min read

CONTRIBUTORS


  • 6 min read