Linux中部署Redis主从复制,主从复制原理

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Linux中部署Redis主从复制,主从复制原理

在上一篇文章中谈了单机的 Redis 部署,你觉得单机部署的架构有什么问题吗?主从复制能够解决全部问题吗?

前文:Linux 安装 Redis 单机,详细图解

后文:Linux安装Redis(三)哨兵模式,分析流程和原理,详细图解

但我们还是回到本文的内容吧

本文谈到的内容主要是以下几点:

  1. 如何部署Redis主从复制(一主二从)
  2. 一些关于主从的问题模拟和思考
  3. 主从复制原理和工作流程

前文

所谓主从复制,就是以其中一台机器作为 master,并且以写为主,其他从服务器(Slave)则是以读为主,达到读写分离的效果,以来提高系统性能。从服务器的数据全部从主服务中复制同步而来。

当 master 数据变化的时候,自动将新的数据异步同步到其他Slave数据库

redis 官方文档:redis.io

主从复制它解决了什么问题

其实这很好说吗,读写分离、容灾备份、数据备份、水平扩容支撑高并发等等,其实也蛮多的,但是也有一些不足之处,后面就知道啦

一、相关命令

其实主从分离是真的很简单,就改几个配置项就完事啦,和单机的没啥区别

也就这一句话,配置从库,不配置主库,从库变更一下配置文件,或者是输入几行命令就可以,主库则不需要动,和单机一样。

关于权限:

  1. 如果主库设置了密码,则从机需要验证密码
  2. master 如果配置了 requirepass 参数,需要密码登陆
  3. 那么slave就要配置masterauth 来设置校验密码,否则的话,master会拒绝slave的访问请求

基本操作命令

  1. info replication : 可以查看复制节点的主从关系和配置信息
  2. replicaof 主库IP 主库端口 :一般写入redis.conf配置文件内
  3. slaveof 主库IP 主库端口:每次与 master 断开之后,都需要重新连接,除非你配置进redis.conf 文件。
  4. 在运行期间修改slave节点的信息,如果该数据库已经是某个主数据库的从数据库,那么会停止和原主数据的同步关系转而和新的主数据库库同步,重新建立联系。
  5. slaveof no one:使当前数据库停止与其他数据库的同步,转为主数据库.

二、部署架构

我有三台虚拟机,分别是

192.168.208.128

192.168.208.129

192.168.208.130

准备部署的架构图为:

image.png

三、开始部署

1、前期准备:

三台虚拟机上都已经安装完Redis服务,这点不会可以去考古-->

三台虚拟机能够相互ping通,且开放相关的 redis 服务使用的端口或者是关闭防火墙。

关闭防火墙:

systemctl stop firewalld #三台都要关 或者开发相关的端口

配置主从复制,我们只需要修改从库的配置,不需要修改主机的配置。

replicaof 主库IP 主库端口 :一般写入redis.conf配置文件内
slaveof 主库IP 主库端口:每次与 master 断开之后,都需要重新连接,除非你配置进redis.conf 文件。
在运行期间修改slave节点的信息,如果该数据库已经是某个主数据库的从数据库,那么会停止和原主数据的同步关系转而和新的主数据库库同步,重新建立联系。
slaveof no one:使当前数据库停止与其他数据库的同步,转为主数据库,自立为王。

2、修改配置文件:

我们重新cp 一份未动过的配置文件,一步一步来看,到底那些要进行配置

补充:从机就比主机多了第十步的一个操作,其余均相同,其他更详细的配置还是需要大家在生产环境中配置,例如aof的开启和关闭,同步时间是多长等等

image.png

大致步骤:

image.png

1、修改 daemonize 为yes

image.png

2、注释掉 bind 127.0.0.1

image.png

3、修改 protected-mode 为 no

image.png

4、指定 port 端口

image.png

其实很多时候在线的 redis 服务并不会开放默认的端口,而是会换成其他不常用的端口,来求得一定的安全性

5、指定工作目录

image.png

6、指定 pidfile 文件的名称

image.png

可改可不改,知道存在,万一要看了,知道在哪里可以看到

7、指定 logfile 文件名称

image.png

我这里指定的是我的地址哈~

8、指定 dump.rdb 文件名称(dbfilename)

image.png

9、requirepass 设置密码

image.png

主机配到这里就可以啦,下面的这个是从机才需要配置的。

10、配置访问主机的密码 masterauth 、 masterip、masterport

image.png

修改完后就是如下:

image.png

第二台从机也是一样的配置。

四、启动测试

先启动master,再陆续启动两台slave.

image.png

确定主机和从机都起来之后。

我们在主机上set 一个值,我们看有没有复制过去

image.png



另外也可以看一下从机的log日志,这边的主机我忘记配了,就没啦~ 感兴趣的话,自己去看一下主机的日志

image.png

查看服务器状态:

image.png

五、思考问题

你觉得上述这样的架构还存有一些什么问题吗?

1、当主机宕机之后,从机会自动变成主机吗?

  • 答案是不会,这里木有人来操作啊~

2、从机宕机之后,再启动是从机还是主机?

  • 如果是写入配置的方式,从机宕机后重启还是从机,如果是使用命令的方式,来建立主从服务的话,重启后则是主机。

3、主机宕机之后,从机可不可以成为另一台机器的从机?

  • 可以,但需要人工干预,来输入相关命令,让该从机成为其他机器的从机。

4、主机宕机之后,我们可以让剩下的其中一台成为主机吗?

  • 可以,但需要人工干预,在客户端执行slave no one命令

六、薪火相传

如下图部署方式:

image.png

是什么意思呢?

就是当主机宕机的时候,192.168.208.129这台从机,在人工干预的情况下可以立马升级为主机,它下面跟随着两台从机,也可以继续提供读服务,而无需重新改向新的主机。

如果是按照之前的方式部署,如果主机宕机了,那么两台从机都只能提供读服务,需要人工干预将其中一台从机升级为主机,再手动将另外一台的从机改从向新的主机进行复制。(注意:如果要改变跟随的主机,是需要将slave的数据全部清除掉,然后再从新跟随的主机,重新开始复制,数据量比较大的情况,需要一定的时间)

配置是一样的,就是一台跟着一台,只是把跟随的主机变更了。

七、反客为主

我们之前就谈到了,如果主机宕机了,我们是可以手动让从机变更为主服务的,发送slave no one即可。

八、主从复制原理和工作流程

借鉴的一张图:image.png来源 Redis主从复制原理

  1. slave 第一次启动成功连接到 master 后会发送一个 sync 命令,首次全新连接 master,会自动进行一次完全同步(全量复制),slave自身原有数据会被 master 数据覆盖清除。
  2. master 节点收到 sync 命令后会开始在后台保存快照(即RDB持久化,主从复制时会触发RDB)同时收集所有接收到的用于修改数据集命令缓存起来,master 节点执行RDB持久化完后,master将rdb快照文件和所有缓存的命令发送到所有slave,以完成一次完全同步。
  3. 而slave服务在接收到数据库文件数据之后,将其存盘并加载到内存中,从而完成复制初始化。
  4. 在正常运行的过程中,主从双方要保持通信,主机会向从机发送心跳检测,心跳检测的默认时间为10秒,repl-ping-replica-period 10
  5. 增量复制,除去第一次连接是全量复制以外,之后 master 继续将新的所有收集到的修改命令自动依次传给slave,完成同步。
  6. 从机下线,重连续传;
    master会检查backlog里面的offset,master和slave都会保存一个复制的offset还有一个masterId,
    offset是保存在backlog中的。master只会把已经复制的offset后面的数据复制给slave,类似断点续传。

缺点

1、复制具有延时性,并且因为所有的写操作都是现在Master 上操作,然后同步更新到 Slave 上,所以从 Master 同步到 Slave 机器上有一定的延迟,当系统很繁忙的时候,延迟问题会更严重,另外就是当 Slave 机器数量变多,复制次数变多也会使这个问题更加严重。

2、当 master 挂了的时候,并不会在 slave 节点中自动选举一个节点成为Master节点,从而导致redis服务只能读而不能写。

同时也意味着出现事故的时候,必须要有人工干预。

后文

如果仔细想想,主从复制的架构其实还是有很多问题的,比如不能够自动的进行故障转移,必须要人工干预,又或者是复制的延迟性等。

但不得不说,部署是极为简单的,机器资源要求也不高,在很多时候还是非常实用的,比如做容灾备份,数据备份等。

对啦,想不如做,看也不如做,感兴趣的话,我还是建议可以抽空试一试~


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
Ubuntu Linux 测试技术
Linux系统之部署轻量级Markdown文本编辑器
【10月更文挑战第6天】Linux系统之部署轻量级Markdown文本编辑器
91 1
Linux系统之部署轻量级Markdown文本编辑器
|
1月前
|
搜索推荐 Linux 测试技术
Linux系统之部署homer静态主页
【10月更文挑战第11天】Linux系统之部署homer静态主页
79 41
Linux系统之部署homer静态主页
|
26天前
|
运维 监控 Linux
Linux系统之部署Linux管理面板1Panel
【10月更文挑战第20天】Linux系统之部署Linux管理面板1Panel
77 3
Linux系统之部署Linux管理面板1Panel
|
1月前
|
Web App开发 资源调度 网络协议
Linux系统之部署IP工具箱MyIP
【10月更文挑战第5天】使用Docker部署Radicale日历和联系人应用Linux系统之部署IP工具箱MyIP
85 1
Linux系统之部署IP工具箱MyIP
|
23天前
|
消息中间件 Linux RocketMQ
在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
通过以上步骤,你可以在Red Hat Enterprise Linux 9上使用Docker快速安装并部署RocketMQ。这种方法不仅简化了安装过程,还提供了一个灵活的环境来管理和扩展消息队列系统。RocketMQ作为一款高性能的分布式消息系统,通过Docker可以实现快速部署和高效管理。
53 2
|
24天前
|
消息中间件 Linux RocketMQ
在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
通过以上步骤,你可以在Red Hat Enterprise Linux 9上使用Docker快速安装并部署RocketMQ。这种方法不仅简化了安装过程,还提供了一个灵活的环境来管理和扩展消息队列系统。RocketMQ作为一款高性能的分布式消息系统,通过Docker可以实现快速部署和高效管理。
32 3
|
25天前
|
Java Linux 网络安全
NIFI在Linux服务区上的部署配置过程是什么?
【10月更文挑战第21天】NIFI在Linux服务区上的部署配置过程是什么?
40 2
|
27天前
|
关系型数据库 MySQL Linux
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
219 3
|
27天前
|
存储 NoSQL 定位技术
Redis geo原理
Redis的GEO功能基于Earth Mapper(http://earth-api.org/)库,它允许存储地理位置信息并执行一些基于该信息的操作。
25 3
|
1月前
|
存储 NoSQL 大数据
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
33 3