Redis 主从复制

Redis 主从复制

我在这里只记录点基本内容,不会写太深入的内容

概念

主机数据更新后根据配置和策略,自动同步到备机的 master/slaver 机制,master 以写为主,slave 以读为主

一主多从,只能有一台主服务器,可以有多台从服务器。防止多个主服务器对同一个数据进行写操作

作用

  • 读写分离,性能扩展
  • 容灾快速恢复,一台从服务器宕机,可以切换到其它从服务器

集群:每个集群都是一主多从,这样即使主服务器宕机也可以切换集群提供服务

配置一主多从的服务器

这里配置一主两从的服务器,这里我就用同一台虚拟机的不同端口模拟多台服务器,实际应用多个服务器时只需要修改 ip 即可

步骤

  1. 在 redis/bin 目录创建一个文件夹,例如 master_slave
  2. 复制 redis.conf 配置文件到 master_slave 文件夹,将 appendonly yes 改成appendonly no,或者改名字,还有darmonize yes,这个要用 yes 就行
  3. 创建三个配置文件
    • redis_6379.conf
    • redis_6380.conf
    • redis_6381.conf
  4. 在三个配置文件中写入内容
    • inclued /master_slave/redis.conf
    • pidfile /var/run/redis_端口号.pid
    • port 端口号
    • dbfilename dump_端口号.rdb
    • logfile 这里为了操作方便就不写了
  5. 打开终端,到 redis/bin 目录,启动三台 redis 服务器(你也可以给这个命令配置一个环境变量)
    • ./redis-server master_slave/redis_6379.conf
    • ./redis-server master_slave/redis_6380.conf
    • ./redis-server master_slave/redis_6381.conf

需要注意一下,启动服务时最好使用 root 权限,不然可能会有 RDB 写入问题

在 redis-cli 中连接对应端口的redis 服务器,再使用info replication 就可以查看主机信息,role为 master 表示这是主服务器

配置主从复制之前,这三台 redis 服务器应该都是 master

6379

6380

6381

配置主从

比如我把 6379 当主服务器,6380 和 6381 当成从服务器
步骤:

  1. 在 6380 和 6381 上的 redis-cli 执行slaveof 127.0.0.1 6379,就是 slaveof ip地址 端口号
  2. 如果主服务器有密码,需要在从服务器的配置文件中添加masterauth 密码,再重启从服务器
  3. 再使用 info replication查看从机信息,role就变成 slave

6379

6380

6381

效果

先在主服务器中随便写一个数据,用主服务器可以读取到数据
6379

在从服务器也可以读取到数据
6380

6381

但是如果在从服务器写数据,那么就会报错
6380

6381

一主二从

如果从服务器宕机,重新启动从服务器,需要执行slaveof ip地址 端口号命令,并且会自动从头开始从主服务器复制数据

如果主服务器宕机,从服务可以直到主服务器离线,但是仍然是从服务器,还是保留了主服务器的ip地址和端口号,还可以提供读取数据的服务

如果主服务器宕机并且重启,会回到主服务器的位置,仍然是主服务器

复制原理

  1. 当从服务器连接上主服务器之后,从服务器会向主服务器发送“进行数据同步的消息”
  2. 全量复制:主服务器接收到从服务器发送过来的同步消息,把主服务器数据进行持久化,也就是 RDB 文件,把 RDB 文件发送给从服务器,从服务器拿到 RDB 文件进行读取(从服务器进行存盘并加载到内存中)
  3. 增量复制:每次主服务器进行写操作之后,会和从服务器进行数据同步

从服务器只有第一次会主动同步数据,之后都是主服务器主动同步数据

薪火相传

从服务器执行slaveof 从服务器ip地址 端口号命令,这样,这台从服务器同步的数据就是另外一台从服务器了,但是主服务器底下的从服务器依然是从服务器,不会变成主服务器

就是说,一个主服务器有多个从服务器,从服务器底下还有从服务器,从服务器去同步主服务器,从服务器底下的从服务器再去同步这个从服务器

缺点:如果主服务器底下的从服务器宕机,从服务器底下的从服务器都不能同步了

反客为主

比如,主服务器宕机,后边的从服务器可以成为主服务器

从服务器去执行 slaveof no one 命令,将从服务器变成主服务器,代替之前宕机的主服务器,但其它从服务器的主服务器ip地址和端口不会变成这个从服务器,即,其它从服务器无操作

先关闭 6379 的 redis server

再看两个从服务器
6380

6381

将 6380 升级为主服务器,但是从服务器数量是 0 ,所以 6381 并没有任何操作

哨兵模式

哨兵模式就是反客为主的自动版,能够后台监控主机是否故障,如果故障了,根据投票数自动将从服务器变成主服务器

步骤:

  1. 在 master_slave 目录下新建 sentinel.conf 文件
  2. 在这个配置文件中只有一句话sentinel monitor mymaster 主服务器ip地址 主服务器端口号 1
    1. sentinel:哨兵
    2. monitor:监控
    3. mymaster:哨兵为主服务器的名称
    4. 1:表示至少有多少个“哨兵同意迁移”的数量
  3. 启动哨兵:在 redis/bin 目录使用./redis-sentinel master_slave/sentinel.conf(你也可以为这个命令写一个环境变量)

哪个从服务器会变成主机?
从服务器的选择是有规则的
选择条件依次为:

  • 选择优先级靠前的
    • 优先级在 redis.conf 中默认 slave-priority 100,值越小,优先级越高
  • 选择偏移量最大的
    • 偏移量是指获得原主服务器数据最全的,即,与主服务器同步率最高的
  • 选择 runid 最小的从服务器
    • 每个 redis 实例启动后都会随机生成一个 40 位的 runid

关闭 6379 主服务器

再看从服务器
6380 ,变成了主服务器,6381 也变成了 6380 的从服务器

原主服务器重启后会变成从服务器

复制延时

由于所有的写操作都是先在主服务器上,然后同步更新到从服务器上,所以从主服务器同步到从服务器有一定的延时,当系统很繁忙的时候,延时问题会更加严重,从服务器数量的增加也会使这个问题更加严

Redis 主从复制 结束

posted @ 2021-08-16 16:47  .NET好耶  阅读(67)  评论(0编辑  收藏  举报