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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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服务只能读而不能写。

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

后文

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

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

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


目录
相关文章
|
3月前
|
NoSQL 关系型数据库 Linux
ERPNext 搭建教程:Linux 一键部署与维护
ERPNext 是一款开源免费的企业资源计划系统,适用于中小企业信息化管理。基于 Python 和 Frappe 框架开发,支持财务、销售、人力、库存等模块,具备高度可定制性。本文介绍如何通过 Websoft9 在 Linux 下快速部署 ERPNext,并提供环境配置、系统维护等实用建议,适合开发者和企业用户快速上手。
437 7
ERPNext 搭建教程:Linux 一键部署与维护
|
5月前
|
监控 Linux 应用服务中间件
Linux多节点多硬盘部署MinIO:分布式MinIO集群部署指南搭建高可用架构实践
通过以上步骤,已成功基于已有的 MinIO 服务,扩展为一个 MinIO 集群。该集群具有高可用性和容错性,适合生产环境使用。如果有任何问题,请检查日志或参考MinIO 官方文档。作者联系方式vx:2743642415。
1440 57
|
3月前
|
Java Linux 网络安全
Linux云端服务器上部署Spring Boot应用的教程。
此流程涉及Linux命令行操作、系统服务管理及网络安全知识,需要管理员权限以进行配置和服务管理。务必在一个测试环境中验证所有步骤,确保一切配置正确无误后,再将应用部署到生产环境中。也可以使用如Ansible、Chef等配置管理工具来自动化部署过程,提升效率和可靠性。
361 13
|
3月前
|
关系型数据库 Linux Nacos
Rocky Linux 部署 Docker 和 NACOS 实例
本文介绍在阿里云环境下基于 Rocky Linux 搭建 Docker 并部署 Nacos 的完整流程。涵盖 Docker 安装、镜像加速配置、网络设置及 MySQL 与 Nacos 容器的创建,适用于开发与生产环境。
481 1
|
5月前
|
Java 关系型数据库 MySQL
在Linux平台上进行JDK、Tomcat、MySQL的安装并部署后端项目
现在,你可以通过访问http://Your_IP:Tomcat_Port/Your_Project访问你的项目了。如果一切顺利,你将看到那绚烂的胜利之光照耀在你的项目之上!
305 41
|
5月前
|
开发框架 Java 关系型数据库
在Linux系统中安装JDK、Tomcat、MySQL以及部署J2EE后端接口
校验时,浏览器输入:http://[your_server_IP]:8080/myapp。如果你看到你的应用的欢迎页面,恭喜你,一切都已就绪。
411 17
|
5月前
|
Java 关系型数据库 MySQL
在Linux操作系统上设置JDK、Tomcat、MySQL以及J2EE后端接口的部署步骤
让我们总结一下,给你的Linux操作系统装备上最强的军队,需要先后装备好JDK的弓箭,布置好Tomcat的阵地,再把MySQL的物资原料准备好,最后部署好J2EE攻城车,那就准备好进军吧,你的Linux军团,无人可挡!
127 18
|
5月前
|
消息中间件 NoSQL Linux
Redis的基本介绍和安装方式(包括Linux和Windows版本),以及常用命令的演示
Redis(Remote Dictionary Server)是一个高性能的开源键值存储数据库。它支持字符串、列表、散列、集合等多种数据类型,具有持久化、发布/订阅等高级功能。由于其出色的性能和广泛的使用场景,Redis在应用程序中常作为高速缓存、消息队列等用途。
859 16
|
5月前
|
开发框架 关系型数据库 Java
Linux操作系统中JDK、Tomcat、MySQL的完整安装流程以及J2EE后端接口的部署
然后Tomcat会自动将其解压成一个名为ROOT的文件夹。重启Tomcat,让新“植物”适应新环境。访问http://localhost:8080/yourproject看到你的项目页面,说明“植物”种植成功。
143 10