Redis主从复制及原理

  • Redis主从复制概述
  • Redis同步方式
  • Redis配置主从复制
  • Redis主从复制启用方式(版本5.0之后)


Redis主从复制概述

  1. 什么是主从复制
  2. redis ha和主从 redis 主从从_redis

  3. 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。
    默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
  4. 为什么要使用主从复制
  • 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  • 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
  • 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
  • 读写分离:可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量;
  • 高可用基础:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

Redis同步方式

  1. 全量同步
    Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
  • 从服务器连接主服务器,发送SYNC命令;
  • 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
  • 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
  • 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
  • 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
  • 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
  1. 增量同步
  • Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。
  1. Redis主从同步策略
  • 主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
  1. Redis大概主从同步是怎么实现的?
全量同步:
master服务器会开启一个后台进程用于将redis中的数据生成一个rdb文件,与此同时,服务器会缓存所有接收到的来自客户端的写命令(包含增、删、改),当后台保存进程
处理完毕后,会将该rdb文件传递给slave服务器,而slave服务器会将rdb文件保存在磁盘并通过读取该文件将数据加载到内存,在此之后master服务器会将在此期间缓存的
命令通过redis传输协议发送给slave服务器,然后slave服务器将这些命令依次作用于自己本地的数据集上最终达到数据的一致性。
 
部分同步:
从redis 2.8版本以前,并不支持部分同步,当主从服务器之间的连接断掉之后,master服务器和slave服务器之间都是进行全量数据同步,但是从redis 2.8开
始,即使主从连接中途断掉,也不需要进行全量同步,因为从这个版本开始融入了部分同步的概念。部分同步的实现依赖于在master服务器内存中给每个slave服务器维护了
一份同步日志和同步标识,每个slave服务器在跟master服务器进行同步时都会携带自己的同步标识和上次同步的最后位置。当主从连接断掉之后,slave服务器隔断时间
(默认1s)主动尝试和master服务器进行连接,如果从服务器携带的偏移量标识还在master服务器上的同步备份日志中,那么就从slave发送的偏移量开始继续上次的同步
操作,如果slave发送的偏移量已经不再master的同步备份日志中(可能由于主从之间断掉的时间比较长或者在断掉的短暂时间内master服务器接收到大量的写操作),则
必须进行一次全量更新。在部分同步过程中,master会将本地记录的同步备份日志中记录的指令依次发送给slave服务器从而达到数据一致。

Redis配置主从复制

  1. 接下来实现一主两从,「前提安装好redis」
  2. 将redis.conf配置文件复制在桌面三份
cp /usr/local/redis5.0.8/redis.conf ./myredis/redis6379.conf
	cp /usr/local/redis5.0.8/redis.conf ./myredis/redis6380.conf
	cp /usr/local/redis5.0.8/redis.conf ./myredis/redis6381.conf

redis ha和主从 redis 主从从_redis_02

  1. 修改对应配置文件 redis6379.conf
- port 6379 修改端口
- daemonize yes 设置为后台启动
- pidfile /var/run/6379.pid 指定pid文件
- logfile 6379.log 日志文件
- dbfilename dump6379.rdb
- requirepass 123456 设置密码 可选
- bind 127.0.0.1 绑定的ip

PS:下图是启动后的相关文件截图

redis ha和主从 redis 主从从_服务器_03


修改redis6379.conf如上步骤,我们将6379设置为master服务器

  1. 按照上面步骤修改另外两个配置文件,然后增加下面配置
# redis 5.0之后使用replicaof代替slaveof
- replicaof 127.0.0.1 6379 指定master的ip+port
- masterauth 123456 配置master服务器密码
- replica-read-only yes 配置从服务器可读
  1. 启动redis
  2. 查看主从信息
    redis-cli -p 端口号 进入命令窗口通过 info replication 命令可以看到复制的一些信息,下面是主服务器:

    可以看到role角色是master,connected_slaves=2 说明有两个从服务器,再下面就是两个从服务器的信息,如ip、port及状态等

Redis主从复制启用方式(版本5.0之后)

  1. 从节点开启主从复制,有3种方式:
  • 配置文件: 在从服务器的配置文件中加入:replicaof masterip masterport(上述方法)
  • 启动命令: redis-server启动命令后加入 --replicaof masterip masterport
  • 客户端命令: Redis服务器启动后,直接通过客户端执行命令:replicaof masterip
    masterport,则该Redis实例成为从节点。

我们使用kill去停掉redis:6380服务:

redis ha和主从 redis 主从从_数据库_04


使用kill命令将6080端口的redis给停止掉,然后使用启动命令去指定master

redis ha和主从 redis 主从从_服务器_05


使用redis-cli进如从服务器的命令窗口,可以看到对应角色以及master的相关信息:

redis ha和主从 redis 主从从_redis ha和主从_06


使用命令replicaof no one可以取消复制:

redis ha和主从 redis 主从从_Redis_07


可以看出取消复制之后,自己就是master。待续…