是什么:
主从复制,master以写为主,Slave以读为主。当master数据变化时,自动将新的数据异步同步到其他slave数据库。
能什么:
- 读写分离
- 容灾恢复
- 数据备份
- 水平扩容支撑高并发
配置时必须要求配置密码。如果master配置里密码,那么slave就要配置masterauth来设置校验密码,否则的话master就会拒绝slave的访问请求。
基本操作命令:
info replication:可以查看复制节点的主从关系和配置信息
replicaof 主库IP 主库端口:一般写进redis.conf配置文件中
slaveof 主库IP 主库端口(命令操作):每次与master断开之后都需要重新连接,除非你配置进
redis.conf文件。在运行期间修改slave节点的信息,如果该数据库已经是某个数据库的从数据库,那么会停止和元数据的同步关系,转而和新的数据库同步,重新签订主从关系。
可以这样理解:最开始S1 S2 是 M1的小弟,在S2上执行了这条命令,S2就会和之前的M1撇清关系,把M2当做大哥。
slaveof no one:是当前数据库停止与其他数据库的同步,转成主数据库(Master)。
一主二从(修改配置文件):
搭建主从复制环境:
环境要求:一个Master俩个Slave(3台虚拟机,都安装redis)
最好把3台主机的redis.conf 文件名称加上端口号(例:redis6379.conf)
确保3台主机都能ping通。
copy一份最新的配置文件去修改: cp redis.conf /myredis/redis6379.conf
注意在copy master到slave的配置文件之后,记得在slave中修改和端口相关的配置。
启动: 先启动Master,然后启动2台Slave。(有问题查log,上面配置了log的名字和路径)
以上启动完成!!!
场景:
master启动,写到k3
slave1跟着master同时启动,跟着写到k3
slave2写到k3之后才启动(master写完k3)
slave2启动之后也会有 k3 之前写入的数据。slave首次启动全部复制master数据,之后master写,slave跟。
主机(master)shutdown后,从机(slave)会自动变为master吗? 不会, 只是master_link_status:down,但是数据可以正常读取。
主机(master)shutdown后,重启后主从关系还在吗?从机还能否顺利复制?关系还在。可以顺利复制。
一主二从(手动(命令)操作):
为了方便测试,把slave 中的配置文件 中的 # replicaof 192.168.217.135 6379 注释掉。即 3台机器都是Master,只是connected_slaves为0。
使用命令 实现主从关系,从机重启后,主从关系不存在,都是master。
薪火相传:
上一个slave可以是下一个slave的master,slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中的一个master,可以有效减轻主master的写压力。
为了效果明显,2台slave的配置文件恢复到之前一主二从的配置。
操作:在6381这台机器上执行 slaveof 192.168.217.134 6380(表示6380是6381的主人)
反客为主(自己成为Master,脱离之前的主从架构):
复制的原理和工作流程:
- slave启动,同步初请:slave 启动成功连接到master后会发送一个sync的命令。slave首次全新连接master,一次完全同步(全量复制)将自动执行,slave自身原有数据会被master数据覆盖清除。
- 全量复制:master节点收到sync命令后会开始在后台保存快照(即RDB持久化,主从复制时会触发RDB),同时收集所有接收到的用于修改数据集命令缓存起来,master节点执行RDB持久化完成后,master将rdb快照文件和所有缓存的命令发送到所有slaves,以完成一次完全同步。而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中,从而完成复制初始化
- 心跳,保持通信: 心跳包(默认10s),repi-ping-replica-period 10
- 进去平稳,增量复制:master持续将新的所有收集到的修改命令自动依次传给slave,完成同步
- 从机下线,重连续传:master 会检查backlog里面的offset,master和slave都会保存一个复制的offset还有一个masterId,offset是保存在backlog中的,master只会把已经复制的offset后面的数据复制给slave,类似锻炼续传。
主从复制的缺点:
- 复制延迟,信号衰减。由于所有的写操作都是现在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重。如果在高并发的情况下,一主二从是不都用的,Slave机器数量的增加也会使这个问题更加严重
- Master挂了之后:默认情况下,当master挂了之后,不会在slave节点中自动重选一个master。这时只能读取不能插入。
我们希望能在master挂了之后,能自动选取一个新的master。---Redis 哨兵 (sentinel)