文章目录
- 一、复制是什么?
- [二、 基本命令](#二、 基本命令)
- [三、 配置(分为配置文件和命令配置)](#三、 配置(分为配置文件和命令配置))
-
- [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文件需要配置:
- 开启
daemonize yes
- 注释掉
bind 127.0.0.1
protected-mode no
- 指定redis运行端口
port 6379
- 指定当前工作目录,
dir 工作路径
(有redis.config文件的路径) - pid文件名字,可以默认
pidfile
- log文件名字
logfile
- 连接密码
requirepass
- dump.rdb名字
dbfilename
- 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,需要人工干预。