简介
http://redis.io/docs/management/replication (opens in a new tab)
主从复制,master 以写为主,slave 以读为主,当 master 数据变化时,自动将新的数据异步同步到其他 slave 数据库。
作用
- 读写分离
- 容灾恢复
- 数据备份
- 水平扩容支持高位并发
操作步骤
-
配从(库)不配主(库)
-
权限细节
-
master 如果配置了 requirepass 参数,需要密码登录;
-
那么 slave 就要配置 master auth 来设置校验密码,否则的话 master 会拒接 slave 的访问请求。
masterauth <master-password>
-
-
基本操作命令
-
info replication
可以查看复制节点的主从关系和配置信息
-
replicaof <master-ip> <master-port>
一般写入进 redis.conf 配置文件内
-
slaveof <new master-ip> <new master-port>
- 每次与 master 断开之后,都需要重新连接,除非你配置进 redis.conf 文件
- 在运行期间修改 slave 节点的信息,如果该数据库已经是某个主从数据库的从数据库,那么会停止和原主数据库的同步关系转而和新的主数据库同步。
-
slaveof no one
使当前数据库停止与其他数据库的同步,转成主数据库。
-
示例
架构说明
一个 master 和两个 slave,拷贝多个 redis.conf 文件(redis6379.conf,redis6380.conf,redis6381.conf)
口诀
- 机器间网络相互 ping 通且注意防火墙配置
- 命令
- 主从复制(配从库不配主库):
replicaof <master-ip> <master-port>
- 修改主库:
slaveof <new master-ip> <new master-port>
- 由从库改为主库:
slaveof no one
- 主从复制(配从库不配主库):
修改配置文件细节操作(以 redis6379.conf 为例)
# 开启 daemonize yes
daemonize yes
# 注释掉 bind 127.0.0.1
# bind 127.0.0.1 -::1
# protected-mode no
protected-mode no
# 指定端口
port 6379
# 指定当前工作目录,dir
dir /myredis
# pid 文件名字,pidfile
pidfile /var/run/redis_6379.pid
# log 文件名字,logfile
logfile "/myredis/6379.log"
# requirepass
requirepass <password>
# dump.rdb 名字
dbfilename dump6379.rdb
# aof 文件,appendfilename,可选非必须
appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
# 从机访问主机的通行密码 masterauth(从机必须配置,主机不需要配置)
replicaof <master-ip> <master-port>
masterauth <master-password>
常用技巧
一主二从
配置文件固定写死
-
配置文件执行
replicaof <master-ip> <master-port>
-
配从库不配主库
replicaof <master-ip> <master-port> masterauth <master-password>
-
先启动 master 机器再启动 slave 机器
-
主从关系查看
-
日志
-
主机日志
... Synchronization with replica <slave0-ip>:<slave0-port> succeeded ... Synchronization with replica <slave1-ip>:<slave1-port> succeeded ...
-
备机日志
... Connecting to MASTER <master ip>:<master port> ... Successful partial resynchronization with master. ...
-
-
命令
info replication
-
命令操作手动执行
- 在从机上执行命令
slaveof <master-ip> <master-port>
- 当从机重启,主从关系不存在。
主从问题演示
-
从机可以执行写命令吗?
从机只可以读取不可以写。
(error) READONLY You can't write against a read only replica.
-
从机切入点问题
slave 是从头开始复制还是从切入点开始复制?
master 启动,写到 k3
slave1 跟着 master 同时启动,跟着写到 k3
slave2 写到 k3 后才启动,那之前的是否也可以复制?Y,首次全量复制,后续跟随,master 写,slave 跟。
-
主机 shutdown 后,从机会上位吗?
从机不动,原地待命,从机数据可以正常使用;等待主机重启。
-
主机 shutdown 后,重启后主从关系还在吗?从机还能否顺利复制吗?
主从关系不变,从机可以顺利复制。
-
某台从机 shutdown 后,master 继续,从机重启后能跟上大部队吗?
可以。
配置和命令的区别
配置持久稳定;命令当次生效。
链式主从
-
上一个 slave 可以是下一个 slave 的 master ,slave 同样可以接收其他 slaves 的连接和同步请求,那么该 slave 作为了链条中下一个的 master,可以有效减轻主 master 的写压力;
-
中途变更转向:会清楚之前的数据,重新拷贝最新的,命令
slaveof <new-master-ip> <new-master-port>
。
从机转主
slaveod no one
,使当前数据库停止与其他数据库的同步,转成主数据库。
复制原理和工作流程
-
slave 启动,同步初请
- slave 启动成功连接到 master 后会发送一个 sync 命令;
- slave 首次全新连接 master,一次完全同步(全量复制)将被自动执行,slave 自身原有数据会被 master 数据覆盖清除。
-
首次连接,全量复制
- master 节点收到 sync 命令后会开始在后台保存快照(即 RDB 持久化,主从复制时会触发 RDB),同时收集所有接收到的用于修改数据集命令缓存起来,master 节点执行 RDB 持久化完后,master 将 RDB 快照文件和所有缓存的命令发送到所有 slave,已完成一次同步完成;
- slave 服务在收到数据库文件数据后,将其存盘并加载到内存中,从而完成复制初始化。
-
心跳持续,保持通信
master 发出 PING 包的周期,默认是 10 秒,
repl-ping-replica-period 10
-
进入平稳,增量复制
master 继续将新的所有收集到的修改命令自动一次传给 slave,完成同步。
-
从机下线,重连续传
master 会检查 backlog 里面的 offset,master 和 slave 都会保存一个复制的 offset 还有一个masterId, offset 是保存在 backlog 中的。master 只会把已经复制的 offset 后面的数据复制给 slave,类似断点续传。
复制的缺点
-
复制延迟,信号衰减
由于所有的写操作都是先在 master 上操作,然后同步更新到 slave 上,所以从 master 同步到 slave 机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,slave 机器数量的增加也会使这个问题更加严重。
-
master 宕机如何办?
默认情况下,不会在 slave 节点中自动重选一个 master;每次都要人工干预,重启 Redis Server。无人值守安装变成刚需。