【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,需要人工干预。

相关推荐
NY623 分钟前
mysql运维篇笔记——日志,主从复制,分库分表,读写分离
数据库·sql
潜洋36 分钟前
Spring Boot 教程之三十六:实现身份验证
java·数据库·spring boot
科马1 小时前
【Redis】缓存
数据库·redis·spring·缓存
LuiChun1 小时前
Django 模板分割及多语言支持案例【需求文档】-->【实现方案】
数据库·django·sqlite
凡人的AI工具箱1 小时前
每天40分玩转Django:Django管理界面
开发语言·数据库·后端·python·django
中科院提名者1 小时前
Django连接mysql数据库报错ModuleNotFoundError: No module named ‘MySQLdb‘
数据库·mysql·django
m0_748248231 小时前
前端项目打包部署后,如何避免让用户强制去清除浏览器缓存
前端·缓存
Gauss松鼠会1 小时前
GaussDB数据库中SQL诊断解析之配置SQL限流
数据库·人工智能·sql·mysql·gaussdb
猿经验1 小时前
如何使用PSQL Tool还原pg数据库(sql格式)
数据库·sql
编程修仙2 小时前
MySQL外连接
数据库·mysql