文章目录
1. 简介
一句话就是master以写为主,Slave以读为主,当master数据变化时,自动将新的数据异步同步到其它slave数据库
它主要实现了下面这些特性:
- 读写分类:写在master写,读在slave读
- 容灾恢复
- 数据备份
- 水平扩容,支持高并发
master如果配置了requirepas
参数,需要密码登陆,那么slave就要配置masterauth
来设置校验密码,否则的话master会拒绝slave的请求
关于主从复制的重要命令如下:
命令 | 作用 |
---|---|
info replication | 可以参考复制节点的主从关系和配置信息 |
replicaof 主库ip 主裤端口 | 一般写入进redis.conf配置文件内(配置从数据库从属某个主数据库,长久的) |
salvoes 主库ip 主库端口 | 每次于master断开连接之后,都需要重新连接,除非你写入配置文件,在运行期间修改slave节点的信息,如果该数据库已经是某个主数据库的从数据库,那么会停止与原主数据库的同步关系转而和新的主数据库同步,重新认大哥(配置从数据库从属某个主数据库,临时性的) |
slave of no one | 使当前数据库停止与其他数据库同步,转成主数据库,自立为王 |
2. 环境搭建
采用的环境使用一个master两个slave。
准备三个centos 7 实例,这里可以在原有的机器上复制,我这里将三个虚拟机分别取名为master,slave1和slave2。基本信息如下:
名称 | ip地址 | 端口 |
---|---|---|
master | 192.168.31.250 | 6379 |
slave1 | 192.168.31.251 | 6380 |
slave2 | 192.168.31.252 | 6381 |
修改从库的配置文件(改从库不改主库的原则)
vim /usr/local/redis_new/redis.conf
- 开启daemonize yes(服务端后台运行)
- 注释调绑定ip bind 127.0.0.1
- 关闭保护模式
- 指定端口
- 指定当前工作目录
- pid文件名字,pidfile
- log文件名称,logfile
- 设置密码
- dump.rdb名字
- 配置从机从属于主机的信息
- 配置从机访问主机的密码
3. 环境测试
首先启动master后两台slave启动(注意从机启动一定要指定端口)
- 查看连接接状态
我们也可以从从机日志中分析
我们使用命令也可以查看连接状态
info replication
至此主从关系已经配置完毕了,下面测试一下主机写数据的情况。
首先我在主机上删除原来库中的所有数据,会发现两个从机的数据也被删除了。
在主机上写入一个值,观察从机的变化
可以发现两个从机都可以拿到这个数据。
关键问题:
前面介绍的slave1和slave2都是master的直接相连的从机,但如果与master直接连接的重机过大,mater的负担会变得很大,这样就衍生出了另一个模式,如下图。
上一个slave可以是下一个slave的master,slave同样也可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个master,可以有效减轻master的写压力。此时中途更换转向的那个机器会清除之前的数据,重新建立连接拷贝最新的数据。
可以发现slave2的主机已经变为了salve1
但注意此时slave 2还是不能写数据,因为此时slave1还是master的从,它只是充当一个中间桥梁的作用。
slaveof no one
然后当前redis服务独立出来成为自己的master。
4. 总结
- Slave启动成功连接到master后会发送一个Sync命令,slave首次全新连接master,一次完全同步(全量复制)将被自动执行,slave自身原有的数据会被master数据覆盖消除。
- master节点收到sync命令后会开始在后台保存快照(即RDB持久化,主从复制时会触发RDB),同时收集所有接收到的用于修改数据集命令缓存起来,master节点执行RDB持久化完成后,master将rdb快照文件和素有缓存的命令发送到所有的slave,以完成一次完全同步,而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中,从而完成复制初始化。
- master每10s钟向slave发送一个心跳包,来检测slave是否存活
- Master继续将新的所有收集到的修改命令自动依此传给slave,完成同步
- master会检查backlog里面的offset,master和slave都会保存一个复制的offset还有一个masterID,offset是保存在backlog中的。master只会把已经复制的offset后面的数据复制给slave,类似断点续传。
缺点:
- 由于所有写操作都是在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使得这个问题更加严重
- 默认情况下,如果主节点宕机了,不会从从节点中选一个节点作为新的节点,而是一直等待主节点恢复运行。