Redis主从复制
主从复制就是,master(主库)以写为主,Slave(从库)以读为主,当master的数据发生变化时,自动将新的数据异步同步到其他slave数据库
主从复制的作用:读写分离、容灾恢复、数据备份、水平扩容支撑高并发
配置时只配从库不配主库。
如果一个数据库想要成为另一个数据库的从库,就要在从库中配置 masterauth 来设置校验密码,否则master会拒绝slave的访问请求,校验密码就是master的登录密码
基本命令:
-
info replication 可以查看复制节点的主从复制关系和配置信息
-
replicaof 主库ip 主库端口 在从库的redis.conf文件中配置主库的信息
-
slaveof 主库ip 主库端口 该命令是配置主从库连接的,是以命令的方式,临时建立主从库关系,如果该库已经是某个库的从库,那么会立刻停止和原来主库的同步关系,转而和新的主库同步
-
slaveof no one 使当前数据库停止与其他数据库同步,转成主数据库
在从库的配置文件中配置好 replicaof 后,在主库的日志中,可以看到从库连接主库成功
连接时一定要把主机和从机的防火墙关闭
主从问题:
-
从机可以执行写命令吗?
不可以,从机只能进行读命令,主机可以读和写
-
从机切入点,当从机shutdown,但主机依然运行,那么在此期间的数据从机重启后能同步吗?
可以同步
-
主机shutdown 后,从机之间的关系
主机shutdown后,主机和从机依然是之前的主从关系,只是他们的连接状态是down,主机重启后同步关系继续
上面配置到文件中,持久稳定,每次启动主从关系都会存在
如果使用 slaveof 主机ip 主机端口
只有当前启动才生效,一旦关机就是去了主从关系
上一个slave可以是下一个slave的master,slave同样可以接收其他slave的连接和同步请求,那么该slave作为链条中下一个master,可以有效减轻主 master的写压力
但是 作为slave的master,也是不能进行写操作的
中途变更转向会清楚之前的数据,重新建立拷贝最新的
slaveof no one 该命令使从库脱离主从关系,不在是其他库的 从库,直接变主库
主从复制的工作流程:
slave启动成功连接到master后会发送一个sync命令。
slave首次全新连接master,一次完全同步(全量复制)将被自动执行,slave自身原有数据将被master数据覆盖
首次连接,全量复制
master节点收到sync 命令后会开始在后台保存快照(RDB持久化),同时收集所有接收到的用于修改数据集命令缓存起来,master节点执行RDB持久化后,master将rdb快照文件和所有缓存的命令发送到slave,完成同步
slave服务在接收到数据库文件后,将其存盘并加载到内存,从而完成复制初始化
连接关系
在配置文件中有 repl-ping-replica-period 10 每隔10秒就ping一次,从而保持主从关系
连接后,主从复制
master继续将新的收集到的修改命令自动依次传给slave,完成同步
从机下线后,重新连接,继续传递
master会检查backlog里面的offset,master和slave都会保存一个复制的offset还有一个masterId,master只会把已经复制的offset后面的数据复制给slave,类似断点续传
主从复制的缺点:
-
由于所有写操作都是在master上操作,然后同步更新到slave上,所以 从master同步到slave机器有一定的延迟,当系统很繁忙时,延迟问题就会更加严重,slave机器的数量的增加也会使这个问题更加严重
-
当master宕机后,只能手动重启,来恢复主从关系