09_Redis复制
本笔记来源于:尚硅谷Redis零基础到进阶,最强redis7教程,阳哥亲自带练(附redis面试题)
b站视频
文章来自:
https://github.com/loneasing/mynote
Redis复制
官网地址:
https://redis.io/docs/management/replication/
一句话:就是主从复制,master以写为主,slave以读为主,当master数据变化的时候,自动将新的数据异步同步到其他的slave数据库。
用处
- 读写分离
- 容灾恢复
- 数据备份
- 水平扩容支撑高并发
- $\textcolor{red}{配从(库)不配主(库)}$
- 权限细节,重要
master如果配置了requirepass参数,需要密码登录 ,那么slave就要配置masterauth来设置校验密码,否则的话master会拒绝slave的访问请求
- 基本操作命令
info replication :可以查看复制结点的主从关系和配置信息
replicaof 主库IP 主库端口 :一般写入进Redis.conf配置文件内,重启后依然生效
slaveof 主库IP 主库端口 :
slaveof no one :使当前数据库停止与其他数据库的同步,$\textcolor{red}{转成主数据库,自立为王}$每次与master断开之后,都需要重新连接,除非你配置进了redis.conf文件;在运行期间修改slave节点的信息,如果该数据库已经是某个主数据库的从数据库,那么会停止和原主数据库的同步关系 $\textcolor{red}{转而和新的主数据库同步,重新拜码头}$
Redis 复制(Replication)是 Redis 的一项核心功能,用于将一个 Redis 数据库的所有数据复制到另一个 Redis 实例上。Redis 复制可以提高系统的可用性、可靠性和扩展性,使得在发生故障时可以快速地恢复数据。
Redis 复制支持主从复制和从从复制两种方式,可以根据实际情况选择不同的方式来部署和管理 Redis 实例。
主从复制
从从复制
修改配置文件细节操作
redis6379.conf为例,步骤如下:
- 开启daemonize yes
注释掉bind 127.0.0.1
protected-mode no
- 指定端口
- 指定当前工作目录,dir
- pid文件名字,pidfile
- log文件名字,logfile
如果日志文件和启动文件同级,这里可以配置为./6379.log,否则这里一定要写绝对路径,是个巨坑!!!
- requiredpass
- dump.rdb名字
- aof文件,appendfilename
本步骤可选,非必须
$\textcolor{red}{从机访问主机的通行密码masterauth,必须配置}$
从机需要配置,主机不用
1. 环境配置
(1)克隆两个虚拟机,一主二仆,Redis设主节点,Redis1和Redis2设从节点。
(2)配置网络IP:
(3)关闭防火墙:
(4)修改redis.conf
配置文件
基础配置
开启后台运行:
注释bind 127.0.0.1:
关闭保护模式:
指定端口号:
持久化文件保存目录:
修改持久化文件名:
设置日志文件名:
配置密码:
一主二仆
方案1:配置文件固定写死主从关系
主要配置
”配从不配主“:
在从节点的redis.conf文件配置主节点的ip和端口号:replicaof 主节点IP 主节点Redis服务端口号
在从节点的redis.conf文件配置连接主节点Redis服务的密码:masterauth 密码
配置从节点访问的主节点:
配置从节点访问的主节点的密码:
先master后两台slave依次启动
主从关系查看
主机日志
从机日志
命令:info replication命令查看
方案2:命令操作手动主从关系指令
- 从机停机去掉配置文件中的配置项,3台目前都是主机状态,各不从属
- 3台master
- 预设的从机上执行命令
salveof 主库IP 主库端口
- Q:用命令使用的话,2台从机重启后,关系还在吗?
A:不会存在了
配置 VS 命令的区别,配置,持久稳定永久生效;命令,当成生效
薪火相传
- 上一个slave可以是下一个slave的master,slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻主master的写压力
- 中途变更转向:会清除之前的数据,重新建立主从关系并拷贝最新的
- slaveof 新主库IP 新主库端口
反客为主
slaveof no one
使当前数据库停止与其他数据库的同步关系
2. 基本命令
从节点配置了需要连接的主节点后,打开Redis客户端即可自动连接到主节点。并且开始同步主节点的数据。
**INFO REPLICATION
**:查看主从关系和配置信息
- 查看主节点信息
- 查看从节点信息
**replicaof 主节点IP 主节点端口
**:配置需要连接的主节点IP和端口。一般写入进redis.conf文件中
**slaveof 主节点IP 主节点端口
**:临时更换需要连接的主节点IP和端口。
这是一个临时的主从关系,每次与主节点断开后都需要重新配置。
在运行期间修改slave节点的信息,如果该数据库已经是某个主数据库的从数据库,那么会停止和原数据库的同步关系,开始和新配置的主数据库同步,并且清除原有的数据。
将从节点redis2的追随的主节点更改为redis1后,查看redis1的信息:是redis的从节点,也是redis2的主节点。
**slaveof no one
**:停止当前从节点与主节点的的数据同步。
3. 常见问题
slave可以执行写命令吗?
slave不可以执行写命令。master负责写命令,slave负责读命令,当然master也可以读命令。
即使slave是另一台slave的master,也不能执行写命令。
slave是从头开始复制还是从切入点开始复制?
在 Redis 复制中,从节点(Slave)可以选择从头开始复制或者从切入点开始复制。
当从节点第一次连接主节点时,如果主节点没有持久化数据,从节点将从头开始复制。即主节点会将自己的全部数据发送给从节点,从节点将接收并保存全部数据。
当从节点与主节点已经建立了连接,并且已经有了初始数据同步,如果从节点断开与主节点的连接后重新连接,从节点可以选择从上次同步的位置(复制偏移量)继续同步数据,这样可以避免从头开始复制所带来的性能影响和数据冗余。
(master会检查backlog里面的offset,master和slave都会保存一个复制的offset和一个masterId)
需要注意的是,如果从节点断开与主节点的连接时间过长,主节点可能已经自动执行了 BGSAVE 命令,生成了新的 RDB 文件,此时从节点需要从头开始复制。此外,如果从节点的内存不足,也可能需要从头开始复制,以避免内存溢出。
比如master写到k3,slave启动后会同步k3及之前的数据,然后跟随master同步数据。
主节点SHUTDOWN后,从节点会上位吗?
主节点关闭后,从节点不会变成主节点,它们会等待主节点重新启动,但是从节点的数据可以正常读取。
主节点重启后,主从关系依旧存在。
4. Redis复制原理
slave启动,同步初请
- slave启动成功链接到master后会发送一个sync命令
- slave首次全新连接master,一次完全同步(全量复制)将被自动执行,slave自身原有数据会被master数据覆盖清除
首次连接,全量复制
- master节点收到sync命令后会开始在后台保存快照(即RDB持久化,主从复制时会触发RDB),同时收集所有接收到的用于修改数据集的命令并缓存起来,master节点执行RDB持久化完后,master将RDB快照文件和所有缓存的命令发送到所有slave,以完成一次完全同步
- 而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中,从而完成复制初始化
心跳持续,保持通信
- repl-ping-replica-period 10
进入平稳,增量复制
- master继续将新的所有收集到的修改命令自动依次传送给slave,完成同步
从机下线,重连续传
- master会检查backlog里面的offset,master和slave都会保存一个复制的offset还有一个masterId,offset是保存在backlog中的。$\textcolor{red}{master只会把已经缓存的offset后面的数据复制给slave,类似断点续传}$
5. Redis复制流程
(1)从节点向主节点发送 SYNC 命令,请求全量复制。
(2)主节点接收到 SYNC 命令后,开始执行 BGSAVE 命令生成 RDB 文件,并在生成过程中记录所有执行的写命令。
(3)主节点在 BGSAVE 命令执行完毕后,将生成的 RDB 文件发送给从节点,同时将在执行 BGSAVE 命令期间记录的写命令发送给从节点,让从节点进行执行。
(4)从节点接收到主节点发送的 RDB 文件和写命令,并执行相应的操作来保持与主节点的数据一致。
(5)从节点持续监听主节点发来的新命令,并将其执行,以保持与主节点的数据同步。
(6)为了保持主节点和从节点之间的通信,master会发出PING包的周期默认是10秒:repl-ping-replica-period 10
(在661行)
(6)当主节点发生故障时,从节点会尝试与其他主节点建立连接,并选举出一个新的主节点,从而成为新的从节点,保证系统的可用性和可靠性。
需要注意的是,Redis 复制是异步的,因此从节点可能存在数据不一致的情况。为了避免数据不一致,可以设置 Redis 的复制偏移量(replication offset),当从节点与主节点连接断开后,从节点可以通过该偏移量快速地同步数据。
6. Redis复制的缺点
(1)数据同步延迟:由于 Redis 复制是异步的,从节点的数据可能会与主节点存在一定的延迟,因此从节点可能无法实时获取到最新的数据。
(2)单点故障:当主节点发生故障时,需要手动进行故障转移或者使用集群来保证系统的可用性。
(3)网络通信问题:当网络出现故障或者通信延迟过高时,复制的效率会受到影响,从节点可能无法及时接收到主节点发送的数据。
(4)内存消耗问题:当从节点处理不过来主节点发送过来的写命令时,从节点会自动触发执行全量复制,这会导致从节点内存消耗变大
(5)数据安全问题:当主节点的数据被误删或者篡改时,从节点也会受到影响,因此需要采取一定的措施来保证数据的安全性。
需要注意的是,这些缺点并不是 Redis 复制本身的问题,而是分布式系统中常见的问题,需要根据实际情况进行综合考虑和处理。