一、Redis replication复制模式是什么?
在软件的架构中,主从模式(Master-Slave)是使用较多的一种架构。主(Master)和从(Slave)分别部署在不同的服务器上,当主节点服务器写入数据时,同时也会将数据同步至从节点服务器,通常情况下,主节点负责写入数据,而从节点负责读取数据。主从复制,master以写为主,Slave以读为主,当master数据变化的时候,自动将新的数据异步同步到其它slave数据库。
参考地址:https://redis.io/docs/management/replication/
二、Redis replication复制能做什么?
redis复制能够实现的有:
- 读写分离
- 容灾恢复
- 数据备份
- 水平扩容支撑高并发
主从模式的结构图如下:
如上图所示,Redis 主机会一直将自己的数据复制给 Redis 从机,从而实现主从同步。在这个过程中,只有 master 主机可执行写命令,其他 salve 从机只能只能执行读命令,这种读写分离的模式可以大大减轻 Redis 主机的数据读取压力,从而提高了Redis 的效率,并同时提供了多个数据备份。主从模式是搭建 Redis Cluster 集群最简单的一种方式。
三、Redis replication复制如何使用呢?
Redis replication复制模式在配置的时候遵循,配置从库Slave,而不去配置Master主库,但是需要注意的时候,如果master主机如果配置了requirepass参数,需要密码登陆,那么slave就要配置masterauth参数来设置校验密码,否则的话master会拒绝slave的访问请求。
基本操作命令如下:
命令 | 含义 |
info replication | 可以查看复制节点的主从关系和配置信息 |
replicaof 主库IP 主库端口 | 一般写入进redis.conf配置文件内 |
slaveof 主库IP 主库端口 | 每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件; 在运行期间修改slave节点的信息,如果该数据库已经是某个主数据库的从数据库, |
slaveof no one | 使当前数据库停止与其他数据库的同步,转成主数据库 |
四、案例演示
4.1.案例架构说明
准备一个Master主机两个Slave从机,3台虚机,每台都安装redis数据库,设备要求:
类型 | IP地址和端口 | 启动是配置文件名称 |
Master | 192.168.42.132:6379 | redis6379.conf |
Slave1 | 192.168.42.134:6380 | redis6380.conf |
Slave2 | 192.168.42.135:6381 | redis6381.conf |
注意:
- 由于Master使用的是之前案例演示的时候所用redis,建议将配置文件删除掉,重新拷贝一份干净的配置文件,避免干扰。
- 同时三个虚拟机之间网络需要相互ping通且注意防火墙配置
4.2.修改配置文件细节操作
以redis6379.conf为例,步骤为:
- 修改配置文件daemonize yes,开启redis后台运行
- 因为需要远程连接,则要注释掉bind 127.0.0.1
- 修改protected-mode为no,设置禁用保护模式
- 指定redis端口
- 指定当前工作目录 dir
- 修改pid文件名字 pidfile
- 修改log文件名字 logfile
- 设置requirepass密码
- 修改dump.rdb文件的名字
- 修改aof文件路径appendfilename
- 从机访问主机的通行密码masterauth,必须设置,主机则是不需要设置!!!
4.3.常见案例一:主从演示
4.3.1.方案1:配置文件永久配置(上述操作)
4.3.1.1.配置主从连接
通过( replicaof 主库IP 主库端口 ) 可以零时指定连接的master主机(这里之前已经在配置文件设置过永久修改,可以不做),配置从库连接主库,主库不需要配置(之前已经设置),如下图:
4.3.1.2.先启动master后,在分别启动两台slave
需要注意
- 由于master主机的需要让两台slave从机连接,所以需要设置master主机的端口允许访问,切记!!!
- 其次从机由于改过端口,所以在连接的时候需要指定端口
[root@localhost myredis]# redis-server /myredis/redis6380.conf
# 修改过端口,访问的时候,必须指定端口
[root@localhost myredis]# redis-cli -a 123456 -p 6380
4.3.1.3.主从关系查看
日志查看
查看主机日志:
备机日志
命令查看:info replication命令查看
查看主机日志:
查看从机
4.3.1.4.主从关系常见文件解析
1.从机可以执行写命令吗?
这个是不可以的,从机只能读取主机的数据,演示如下:在6381端口的slave机器上写入数据,
2.从机切入点问题:slave是从头开始复制还是从切入点开始复制?
案例演示:
- 先让master启动,从k20写到k22
- slave1跟着master同时启动,跟着写到k22
- slave2等写到k22后才启动,那之前的是否也可以复制?
演示的结论是slave首次启动一次性读取所有的数据,后续跟随master写入,slave跟着读取
3.主机master被shutdown后,从机slave会变成主机吗?
从机不动,原地待命,从机数据可以正常使用;等待主机重启动归来
4.主机shutdown后,重启后主从关系还在吗?从机还能否顺利复制?
主机shutdown后,重启后主从关系还是存在的,从机依然可以能顺利读取主机中的数据。
5.某台从机down后,master继续,从机重启后它能的数据是否可以恢复到和主机保持一致?
从机重启后,数据是依然可以恢复,保持跟主机一致的。重启后一次性读取主机的所有信息,后续跟随主机
4.3.2.方案2:命令操作手动指定(零时,重启后会失效)
为了进行演示,两台salve从机停机在配置文件中去掉连接主机的配置项,让3台机器目前都是主机状态,各不从属。
使用 info replication 命令查看3台机器,应该都是主机状态,这里建议两台从机修改配置后重启一下虚拟机,在查看
通过命令将6380、6381两台机器设置为从机slave,在两个redis中分别执行如下命令:
SLAVEOF master主机ip 端口
如下图给slave 6380设置主机是master主机为192.168.42.132端口是6379:
分别查看6380、6381设置后的状态,查看后如下图:
用命令实现主从复制,2台slave从机重启后,主从关系不存在
重启两台从机,然后使用命令:info replication 查看,如下图:
4.4.常见案例二:上一个slave可以是下一个slave的master
上一个slave可以是下一个slave的master,slave同样可以接收其他slave的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻主master的写压力,架构如下图:
先回复到一个主机两个从机的持久化配置,然后再中途变更转向,让6381去连接到6380,将6380当做自己的master,这时候会清除之前的数据,重新建立拷贝最新的,命令如下:
# 修改6381的主机为6380
SLAVEOF 192.168.42.134 6380
查看6381
查看6380
这时候6380虽然既属于master又属于slave,但是注意它是没有写功能的,仅仅只是链路上的一个
查看7379
4.5.常见案例三:让某个slave变成一个独立的master主机
模式图如下,使当前数据库停止与其他数据库的同步,转成主数据库,让6381成为一个独立的master主机:
在6381上执行如下命令即可:
SLAVEOF no one
查看如下图:
五、redis复制的原理以及工作流程
redis复制工作流程如下:
1.slave启动,初次会同步请求
- slave启动成功连接到master后会发送一个sync命令
- slave首次全新连接master,一次完全同步(全量复制)将被自动执行,slave自身原有数据会被master数据覆盖清除
2.首次连接进行全量复制
- master节点收到sync命令后会开始在后台保存快照(即RDB持久化,主从复制时会触发RDB),同时收集所有接收到的用于修改数据集命令缓存起来,master节点执行RDB持久化完后,master将rdb快照文件和所有缓存的命令发送到所有slave,以完成一次完全同步。
- 而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中,从而完成复制初始化
3.通过心跳机制保持通信
通过 repl-ping-replica-period 10 参数设置报错连接的心跳,master发出PING包的周期,默认是10秒,表示每隔10s钟检查一个连接状态,称之为心跳,配置文件中如下图:
4.进入平稳期会增量复制
Master继续将新的所有收集到的修改命令自动依次传给slave,然后完成同步。
5.当slave从机下线,然后再次上线,重连续传
- master会检查backlog里面的offset,master和slave都会保存一个复制的offset还有一个masterId,
- offset是保存在backlog中的。Master只会把已经复制的offset后面的数据复制给Slave,类似断点续传
六、redis复制机制的缺点
存在复制延时,信号衰减的情况
- 由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。
master如果出现了宕机就很麻烦
- 默认情况下,不会在slave节点中自动重选一个作为master,那么master宕机了,就需要每次都要人工干预去重启master,但是这样肯定不行,长期使用就需要有一套无人值守的机制来解决这个问题。