【Redis】复制(Replica)

文章目录

  • 一、复制是什么?
  • [二、 基本命令](#二、 基本命令)
  • [三、 配置(分为配置文件和命令配置)](#三、 配置(分为配置文件和命令配置))
    • [3.1 配置文件](#3.1 配置文件)
    • [3.2 命令配置](#3.2 命令配置)
    • [3.3 嵌套连接](#3.3 嵌套连接)
    • [3.4 关闭从属关系](#3.4 关闭从属关系)
  • [四、 复制原理](#四、 复制原理)
  • [五、 缺点](#五、 缺点)

以下是本篇文章正文内容

一、复制是什么?

主从复制

  • master(main redis)以写为主,slave(secondary redis)以读为主,不能写数据
  • 当master数据变化时,自动将新的数据异步同步到其他slave数据库

功能

  • 读写分离:主机只写,从机只读
  • down机恢复:主机down,从机数据可用,但仍是slave,等待主机恢复
  • 数据备份
  • 水平扩容支撑高并发

配slave不配master

权限细节

  • master如果配置了 requirepass 参数,需要密码登录
  • slave 需要配置 masterauth来设置检验密码,否则的话master会拒绝slave的访问请求

二、 基本命令

powershell 复制代码
info replication  // 查看复制节点的主从关系和配置信息
    
replicaof/slaveof  主库IP 主库端口   
// replicaof/slaveof这两个一样,一般写入进redis.conf配置文件内,但是政治原因redis 5版本后一般用replicaof
// 在运行期间修改slave节点的信息,如果该数据库已经是某个数据库的从数据库,那么会停止和原主数据库的同步关系转而和新的主数据库同步

replicaof/slaveof  no one     // 使当前数据库停止与其他数据库的同步,升级为主数据库

三、 配置(分为配置文件和命令配置)

3.1 配置文件

master 主机中的conf文件需要配置:

  1. 开启daemonize yes
  2. 注释掉bind 127.0.0.1
  3. protected-mode no
  4. 指定redis运行端口 port 6379
  5. 指定当前工作目录,dir 工作路径(有redis.config文件的路径)
  6. pid文件名字,可以默认 pidfile
  7. log文件名字 logfile
  8. 连接密码 requirepass
  9. dump.rdb名字 dbfilename
  10. AOF设置,可选不开启,appendonly yes ; appendfilename

slave 从机redis.conf中需要配置 从机配置上主机的ip、端口 replicaof、密码 masterauth

注意防火墙配置,无法连接时可能需要关闭防火墙

powershell 复制代码
启动: systemctl start firewalld
关闭: systemctl stop firewalld
查看状态: systemctl status firewalld 
开机禁用  : systemctl disable firewalld
开机启用  : systemctl enable firewalld
    
添加 :firewall-cmd --zone=public --add-port=80/tcp --permanent    (--permanent永久生效,没有此参数重启后失效)
重新载入: firewall-cmd --reload
查看: firewall-cmd --zone= public --query-port=80/tcp
删除: firewall-cmd --zone= public --remove-port=80/tcp --permanent

查看日志信息是否连接成功

master主机日志:

通过日志可以查看连接状态,日志保存目录在配置文件中logfile 查看。

3.2 命令配置

命令配置是一次性,当重启后就不再生效。

在需要配置为从机的redis中运行:

powershell 复制代码
replicaof  主库IP 主库端口   # 如果用redis 5.0之前版本,使用:  slaveof 主库IP 主库端口 
masterauth xxxx           # 如果主节点需要密码认证,则需要加上这行。主节点密码为:xxxx。

配置VS命令的区别

  • 配置,持久稳定
  • 命令,当次生效

3.3 嵌套连接

上一个slave可以是下一个slave的master,slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master。

  • 可以有效减轻主master的写压力
  • 中途变更主从关系时:会清除之前的数据,重新建立拷贝最新的
  • 中间的master不具备写能力
powershell 复制代码
replicaof 新主库IP 新主库端口

3.4 关闭从属关系

powershell 复制代码
replicaof no one # 使当前数据库停止与其他数据库的同步,转成主数据库

关闭后,数据还在从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发出PING包的周期,默认是10秒

进入平稳,增量复制

  • master 继续将新的所有收集到的修改命令自动一次传给slave,完成同步

从机下线,重连续传

  • master 会检查backlog里面的offset,master和slave都会保存一个复制的offset,里面有一个masterId
  • offset 是保存在backlog 中的。master只会把已经复制的offset后面的数据赋值给slave,类似断点续传

五、 缺点

复制延时,信号衰减

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

master主机down后,会一直搁置等待主机恢复,默认情况下不会在slave节点自动重选一个master,需要人工干预。

相关推荐
IT项目管理39 分钟前
达梦数据库DMHS介绍及安装部署
linux·数据库
你都会上树?1 小时前
MySQL MVCC 详解
数据库·mysql
大春儿的试验田1 小时前
高并发收藏功能设计:Redis异步同步与定时补偿机制详解
java·数据库·redis·学习·缓存
likeGhee1 小时前
python缓存装饰器实现方案
开发语言·python·缓存
hqxstudying1 小时前
Redis为什么是单线程
java·redis
C182981825751 小时前
OOM电商系统订单缓存泄漏,这是泄漏还是溢出
java·spring·缓存
Ein hübscher Kerl.1 小时前
虚拟机上安装 MariaDB 及依赖包
数据库·mariadb
醇醛酸醚酮酯2 小时前
Qt项目锻炼——TODO清单(二)
开发语言·数据库·qt
GreatSQL社区3 小时前
用systemd管理GreatSQL服务详解
数据库·mysql·greatsql
掘根3 小时前
【MySQL进阶】错误日志,二进制日志,mysql系统库
数据库·mysql