目录
1、修改配置文件
2、设置主从关系
3、测试主从关系
4、哨兵模式
5、主从复制原理
6、主从复制的缺点
首页 数据库 Redis Redis如何实现主从复制

Redis如何实现主从复制

May 30, 2023 am 08:01 AM
redis

  前面介绍Redis,我们都在一台服务器上进行操作的,也就是说读和写以及备份操作都是在一台Redis服务器上进行的,那么随着项目访问量的增加,对Redis服务器的操作也越加频繁,虽然Redis读写速度都很快,但是一定程度上也会造成一定的延时,那么为了解决访问量大的问题,通常会采取的一种方式是主从架构Master/Slave,Master 以写为主,Slave 以读为主,Master 主节点更新后根据配置,自动同步到从机Slave 节点。

  接下来我们就来介绍如何进行主从架构的搭建。

  ps:这里我是在一台机器上模拟多个Redis服务器,与实际生产环境中相比,基本配置都是一样,仅仅是IP地址和端口号变化。

  Redis如何实现主从复制

1、修改配置文件

  首先将redis.conf 配置文件复制三份,通过修改端口分别模拟三台Redis服务器。

  Redis如何实现主从复制

  然后我们分别对这三个redis.conf 文件进行修改。

  ①、修改 daemonize yes

  Redis如何实现主从复制

  表示指定Redis以守护进程的方式启动(后台启动)

  ②、配置PID文件路径 pidfile

  Redis如何实现主从复制

  表示当redis作为守护进程运行的时候,它会把 pid 默认写到 /var/redis/run/redis_6379.pid 文件里面

  ③、配置端口 port

  Redis如何实现主从复制

  ④、配置log 文件名字

  Redis如何实现主从复制

  ⑤、配置rdb文件名

  Redis如何实现主从复制

  依次将 6380redis.conf 、6381redis.conf 配置一次,则配置完毕。

  接下来我们分别启动这三个服务。

  Redis如何实现主从复制

  通过命令查看Redis是否启动:

  Redis如何实现主从复制

  接下来通过如下命令分别进入到这三个Redis客户端:

1

2

3

redis-cli -p 6379

redis-cli -p 6380

redis-cli -p 6381

2、设置主从关系

  ①、通过  info replication 命令查看节点角色

  Redis如何实现主从复制    Redis如何实现主从复制

  Redis如何实现主从复制

  我们发现这三个节点都是扮演的 Master 角色。如何将节点6380和6381转换为从节点角色?

  ②、选择6380端口和6381端口,执行命令:SLAVEOF 127.0.0.1 6379

  Redis如何实现主从复制    Redis如何实现主从复制

  我们再看 6379 节点信息:

  Redis如何实现主从复制

一旦重新启动服务,之前通过命令设置的主从关系将会失效。通过配置redis.conf文件可以实现永久保存这种关系。

3、测试主从关系

  ①、增量复制

  主节点执行 set k1 v1 命令,从节点 get k1 能获取吗?

  Redis如何实现主从复制

  Redis如何实现主从复制

  Redis如何实现主从复制

  由上图可知是可以获取的。

  ②、全量复制

  通过执行 SLAVEOF 127.0.0.1 6379,如果主节点 6379 以前还存在一些 key,那么执行命令之后,从节点会将以前的信息也都复制过来吗?

  答案也是肯定的,这里我就不贴测试结果了。

  ③、主从读写分离

  主节点能够执行写命令,从节点能够执行写命令吗?

  Redis如何实现主从复制

  这里的原因是在配置文件 6381redis.conf 中对于 slave-read-only 的配置

  Redis如何实现主从复制

  如果我们将其修改为 no 之后,执行写命令是可以的。

  Redis如何实现主从复制

  但是从节点写命令的数据从节点或者主节点都不能获取的。

  ④、主节点宕机

  主节点 Maste 挂掉,两个从节点角色会发生变化吗?

  Redis如何实现主从复制

  Redis如何实现主从复制

  上图可知主节点 Master 挂掉之后,从节点角色还是不会改变的。

  ⑤、主节点宕机后恢复

  主节点Master挂掉之后,马上启动主机Maste,主节点扮演的角色还是 Master 吗?

  Redis如何实现主从复制

  也就是说主节点挂掉之后重启,又恢复了主节点的角色。

4、哨兵模式

  通过前面的配置,主节点Master 只有一个,一旦主节点挂掉之后,从节点没法担起主节点的任务,那么整个系统也无法运行。哨兵模式由此诞生,因为从节点能够自动接管主节点的职责,解决了主节点宕机的问题。

  哨兵模式就是不时地监控redis是否按照预期良好地运行(至少是保证主节点是存在的),若一台主机出现问题时,哨兵会自动将该主机下的某一个从机设置为新的主机,并让其他从机和新主机建立主从关系。

  Redis如何实现主从复制

  哨兵模式搭建步骤:

  ①、在配置文件目录下新建 sentinel.conf 文件,名字绝不能错,然后配置相应内容

  Redis如何实现主从复制 

1

sentinel monitor 被监控机器的名字(自己起名字) ip地址 端口号 得票数

  Redis如何实现主从复制

  分别配置被监控的名字,ip地址,端口号,以及得票数。当主机宕机时,从机需要投票决定谁接替成为主机,得票数达到1时不足以成为主机,必须超过1才可成为主机

  ②、启动哨兵

1

redis-sentinel /etc/redis/sentinel.conf

  启动界面:

  Redis如何实现主从复制

  接下来,我们干掉主机 6379,然后看从节点有啥变化。

  Redis如何实现主从复制

  干掉主节点之后,我们查看后台打印日志,发现 6381投票变为主节点了。

  Redis如何实现主从复制

  这时候我们查看从节点 6381的节点信息:

  Redis如何实现主从复制

  6381 节点自动变为主节点了。

  PS:哨兵模式也存在单点故障问题,如果哨兵机器挂了,那么就无法进行监控了,解决办法是哨兵也建立集群,Redis哨兵模式是支持集群的。

5、主从复制原理

Redis的复制功能包括同步(sync)和命令传播(command propagate)两种操作。

  ①、旧版同步

  当从节点发出 SLAVEOF 命令,要求从服务器复制主服务器时,从服务器通过向主服务器发送 SYNC 命令来完成。该命令执行步骤:

  1、从服务器向主服务器发送 SYNC 命令

  2、收到 SYNC 命令的主服务器执行 BGSAVE 命令,在后台生成一个 RDB 文件,并使用一个缓冲区记录从开始执行的所有写命令

  3、当主服务器的 BGSAVE 命令执行完毕时,主服务器会将 BGSAVE 命令生成的 RDB 文件发送给从服务器,从服务器接收此 RDB 文件,并将服务器状态更新为RDB文件记录的状态。

  4、主服务器将缓冲区的所有写命令也发送给从服务器,从服务器执行相应命令。

  ②、命令传播

  当同步操作完成之后,主服务器会进行相应的修改命令,这时候从服务器和主服务器状态就会不一致。

  为了让主服务器和从服务器保持状态一致,主服务器需要对从服务器执行命令传播操作,主服务器会将自己的写命令发送给从服务器执行。从服务器执行相应的命令之后,主从服务器状态继续保持一致。

  总结:通过同步操作以及命令传播功能,能够很好的保证了主从一致的特性。

  但是我们考虑一个问题,如果从服务器在同步主服务器期间,突然断开了连接,而这时候主服务器进行了一些写操作,这时候从服务器恢复连接,如果我们在进行同步,那么就必须将主服务器从新生成一个RDB文件,然后给从服务器加载,这样虽然能够保证一致性,但是其实断开连接之前主从服务器状态是保持一致的,不一致的是从服务器断开连接,而主服务器执行了一些写命令,那么从服务器恢复连接后能不能只要断开连接的哪些写命令,而不是整个RDB快照呢?

  同步操作其实是一个非常耗时的操作,主服务器需要先通过 BGSAVE 命令来生成一个 RDB 文件,然后需要将该文件发送给从服务器,从服务器接收该文件之后,接着加载该文件,并且加载期间,从服务器是无法处理其他命令的。

  为了解决这个问题,Redis从2.8版本之后,使用了新的同步命令 PSYNC 来代替 SYNC 命令。该命令的部分重同步功能用于处理断线后重复制的效率问题。也就是说当从服务器在断线后重新连接主服务器时,主服务器只将断开连接后执行的写命令发送给从服务器,从服务器只需要接收并执行这些写命令即可保持主从一致。

6、主从复制的缺点

  主从复制虽然解决了主节点的单点故障问题,但是由于所有的写操作都是在 Master 节点上操作,然后同步到 Slave 节点,那么同步就会有一定的延时,当系统很繁忙的时候,延时问题就会更加严重,而且会随着从节点slave的增多而愈加严重。

以上是Redis如何实现主从复制的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

redis集群模式怎么搭建 redis集群模式怎么搭建 Apr 10, 2025 pm 10:15 PM

Redis集群模式通过分片将Redis实例部署到多个服务器,提高可扩展性和可用性。搭建步骤如下:创建奇数个Redis实例,端口不同;创建3个sentinel实例,监控Redis实例并进行故障转移;配置sentinel配置文件,添加监控Redis实例信息和故障转移设置;配置Redis实例配置文件,启用集群模式并指定集群信息文件路径;创建nodes.conf文件,包含各Redis实例的信息;启动集群,执行create命令创建集群并指定副本数量;登录集群执行CLUSTER INFO命令验证集群状态;使

redis指令怎么用 redis指令怎么用 Apr 10, 2025 pm 08:45 PM

使用 Redis 指令需要以下步骤:打开 Redis 客户端。输入指令(动词 键 值)。提供所需参数(因指令而异)。按 Enter 执行指令。Redis 返回响应,指示操作结果(通常为 OK 或 -ERR)。

redis怎么读源码 redis怎么读源码 Apr 10, 2025 pm 08:27 PM

理解 Redis 源码的最佳方法是逐步进行:熟悉 Redis 基础知识。选择一个特定的模块或功能作为起点。从模块或功能的入口点开始,逐行查看代码。通过函数调用链查看代码。熟悉 Redis 使用的底层数据结构。识别 Redis 使用的算法。

redis怎么使用单线程 redis怎么使用单线程 Apr 10, 2025 pm 07:12 PM

Redis 使用单线程架构,以提供高性能、简单性和一致性。它利用 I/O 多路复用、事件循环、非阻塞 I/O 和共享内存来提高并发性,但同时存在并发性受限、单点故障和不适合写密集型工作负载的局限性。

redis数据怎么清空 redis数据怎么清空 Apr 10, 2025 pm 10:06 PM

如何清空 Redis 数据:使用 FLUSHALL 命令清除所有键值。使用 FLUSHDB 命令清除当前选定数据库的键值。使用 SELECT 切换数据库,再使用 FLUSHDB 清除多个数据库。使用 DEL 命令删除特定键。使用 redis-cli 工具清空数据。

redis怎么读取队列 redis怎么读取队列 Apr 10, 2025 pm 10:12 PM

要从 Redis 读取队列,需要获取队列名称、使用 LPOP 命令读取元素,并处理空队列。具体步骤如下:获取队列名称:以 "queue:" 前缀命名,如 "queue:my-queue"。使用 LPOP 命令:从队列头部弹出元素并返回其值,如 LPOP queue:my-queue。处理空队列:如果队列为空,LPOP 返回 nil,可先检查队列是否存在再读取元素。

redis怎么查看所有的key redis怎么查看所有的key Apr 10, 2025 pm 07:15 PM

要查看 Redis 中的所有键,共有三种方法:使用 KEYS 命令返回所有匹配指定模式的键;使用 SCAN 命令迭代键并返回一组键;使用 INFO 命令获取键的总数。

redis怎么启动服务器 redis怎么启动服务器 Apr 10, 2025 pm 08:12 PM

启动 Redis 服务器的步骤包括:根据操作系统安装 Redis。通过 redis-server(Linux/macOS)或 redis-server.exe(Windows)启动 Redis 服务。使用 redis-cli ping(Linux/macOS)或 redis-cli.exe ping(Windows)命令检查服务状态。使用 Redis 客户端,如 redis-cli、Python 或 Node.js,访问服务器。

See all articles