Skip to content

Redis主从复制

概念

持久化侧重解决的是Redis数据的单机备份问题(从内存到硬盘的备份);而主从复制则侧重解决数据的多机热备。此外,主从复制还可以实现负载均衡和故障恢复。

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是,只能由主节点到从节点。 默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

作用

数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。

负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

使用

  1. 由于需要启动多个Redis实例,我们先把多个实例使用的配置文件做好修改。
  2. 需要修改的配置信息有:
    • 先拷贝多份配置文件,用不同的名字命名
    • 守护进程启动 daemonize yes
    • Pid 文件名字
    • 指定一个端口
    • Log日志文件名
    • Dump.rdb文件名
    • 等等
  3. 通过刚改好的多个配置文件启动多个redis服务程序
    • Redis-server /path/to/***.conf

配置步骤

  • 在/etc/redis路径下,将6379.conf文件拷贝两份,分别叫做6380.conf与6381.conf
  • 修改6380.conf与6381.conf文件的以下内容
bash
port    6380                            6381
pidfile "/var/run/redis_6380.pid"       "/var/run/redis_6381.pid"
logfile "/var/log/redis_6380.log"       "/var/log/redis_6381.log"
dbfilename "dump6380.rdb"               "dump6381.rdb"
appendfilename "appendonly6380.aof"     "appendonly6381.aof"
  • 分别启动三个配置文件(启动三台服务器)
bash
sudo redis-server /etc/redis/6379.conf
sudo redis-server /etc/redis/6380.conf
sudo redis-server /etc/redis/6381.conf

image-20240803102554094

  • 分别进入到对应的客户端
bash
redis-cli -p 6379
redis-cli -p 6380
redis-cli -p 6381
  • 查看每台机器的状态信息
bash
在对应的客户端下执行info replication,会看到每台机器上来的时候,都是以主机的身份展示的
  • 配置主从复制信息
bash
在从机中执行salveof 127.0.0.1 6379

当从机挂掉之后,主机不会记录从机的信息,如果后面从机又上来了,那么会以一个独立主机的身份上线;如果是主机挂掉了,从机会记录主机的身份信息,包括:ip、port、状态;然后从机会一直等着主机上线,如果主机一直不上线,那么此时有新的写操作就不会得到执行,所以传统主从复制是有缺陷的;但是如果主机上线了,那么主从复制信息会恢复。

注意

  • 从机对主机数据的同步,是全量的还是增量的?
    • 配置了主从复制之后,主机上已有的数据会更新到从机上(全量)
    • 主机新增的数据也会更新到从机上(增量)
  • 作为主机的程序结束,从机的角色不会变化(角色还是slave)。
  • 主机重新启动,从机可以继续与主机保持连接(从机原地待命)。
  • 从机的程序重启后,角色变成了master,从机每次与master断开连接后,都需要重新连接,除非把slaveof 配置到配置文件里。
  • 只要重新连接master,一次完全同步(全量复制)将被自动执行。

常用模式

一主多从(常见)

中央集权,所有的从服务器都要从主服务器哪里更新数据,对主服务器压力较大

击鼓传花

只依赖前面的节点

反客为主

命令:

bash
Slaveof no one

自己变主机