redis 主从复制

  • master 负责写入,slave 负责读,读写分离来提高并发

  • 一主多从,从服务器数量不限制,但是主服务器只能一台(如果 master 为多台,多个 master 都修改了同一个 key,不晓得以哪个为准)

  • salve 挂了会被自动剔除,master 挂了需要手动把 salve 升级为新的 master

环境搭建

在同一台 linux 服务器上部署三个 redis 服务,一主两从

  1. 创建一个文件夹,比如 /myredis,复制一个默认的配置文件(redis.conf)到这个文件夹中,redis.conf 将作为公共配置文件

  2. 在文件夹中,创建三个配置文件,比如 redis6379.conf、redis6380.conf、redis6381.conf(内容和 redis.conf 相同,可以直接复制 redis.conf 文件)

  3. 在三个配置配置文件中写入如下内容

    # 三个配置文件中这句相同,表示都用这个公共配置文件
    include /myredis/redis.conf
    # 三个配置文件中这句各不相同,指定 pid
    pidfile /var/run/redis_6379.pid
    # 三个配置文件中这句各不相同,指定端口
    port 6379
    # 三个配置文件中这句各不相同,指定持久化文件
    dbfilename dump6379.rdb
    
  4. 用这三个配置文件 redis6379.conf、redis6380.conf、redis6381.conf 启动三个服务

    • 此时三台服务能启动成功,但并没有主从关系,三台服务器都是独立的 master

    • 可以分别登录三台 redis 使用 info replication 命令查看主从关系

      127.0.0.1:6379> info replication
      # Replication
      role:master # 角色是 master(三台都是 master)
      connected_slaves:0
      master_failover_state:no-failover
      master_replid:f89899f38875ae46a3cae207a50be4197aceb5d3
      master_replid2:0000000000000000000000000000000000000000
      master_repl_offset:0
      second_repl_offset:-1
      repl_backlog_active:0
      repl_backlog_size:1048576
      repl_backlog_first_byte_offset:0
      repl_backlog_histlen:0
      
  5. 配置主从关系

    • 连接 6380 redis 服务, redis-cli -p port 6380,执行命令 slaveof 127.0.0.1 6379
    • 连接 6381 redis 服务, redis-cli -p port 6381,执行命令 slaveof 127.0.0.1 6379
  6. 此时执行命令 info replication 就会发现主从关系已经配置好了

    • 这时在主机中写入一条命令,到从机中是能查到数据的
    • 在从机中写入命令会报错,主从模式,主才能写,从是只读的

从机挂了后重新启动,需要手动配置从机角色

当从机挂了(可以手动模拟,shutdown 或者 kill -9),再次启动从机,使用 info replication 查看会发现,当前服务并不是从机,角色是 master,所以需要再次执行命令 slave ip port 命令把当前机器加入到 redis 主从关系中

从机宕机的过程中,主机写入了数据,再次重新启动从机,这时从机会同步到宕机时主机写入的数据吗?答案是会,因为每次加入主从关系时,从机都会同步主机全量的数据到从机中

主机挂了后重新启动,自动恢复主机角色

当主机宕机,从机还是从机,不会篡位,大哥还是大哥,哪怕死了还是大哥,这时是没有主机的

主机宕机后重启,自动恢复主从关系中的主机角色,这和从机不一样,从机挂了再恢复需要重新配置,主机挂了再恢复不用配置

主机挂了,把从机升级为主机

在一台从机上执行 slaveof no one 命令即可,这台从机变成主机了

主从复制原理

全量同步(当一台新的从机加入主从关系时)

  1. 从机连上主机之后会发送一个消息到主机,准备进行数据同步
  2. 主机收到同步消息之后,主机立马进行持久化,生成 rdb 文件,然后把 rdb 文件发送给从机
  3. 从机接收到 rdb 文件,根据文件内容完成全量数据同步

增量同步(已经建立好了主从关系)

  1. 主机收到写入命令,先自己写入,然后把命令发送给从机
  2. 从机执行收到的命令完成单个数据同步

给从机再配置从机

当一主多从的时候,从机数量过大,同步时主机压力会很大,可以在从机下面配置从机

比如 6329 是主机,6300-6399 是从机,一主机100个从机。可以这样配置:6300-6349 作为 6350 的从机;6351-6398 作为 6399 的从机。6329 只需要同步 6350 和 6399 两台从机就行了,6350 和 6399 再去同步他们的从机。具体配置是到 6300-6349 上再次执行 slaveof 127.0.0.1 6350,6339 同理

posted @ 2023-07-10 15:51  CyrusHuang  阅读(4)  评论(0编辑  收藏  举报