首页 > 编程知识 正文

redis 主从 哨兵 集群,java redis面试题

时间:2023-05-06 05:23:42 阅读:24370 作者:2309

本文参考你好客网Redis面试问题

什么是Redis主从模式? Redis主从模式使用Redis实例作为主机,其馀用作备份机。 主机和备份计算机上的数据完全匹配,主机支持写入和读取数据等各项操作,从机只支持与主机数据同步和读取。 这意味着客户端可以将数据写入主机,主机可以自动将数据写入同步到从机。

主从模式很好地解决了数据备份问题,主从服务的数据基本一致,可以将写入数据的命令发送到主机执行,将读取数据的命令发送到不同的从机执行,达到读写分离的目的

Redis的主从复制功能非常强大,一个主机可以有多个slave,一个slave可以有多个slave。 这样就形成了强大的多级别服务器群集体系结构。

主从模式Redis主从模式的模式图如下图所示。

在主从模式下,可以看到只有一个是主从站,另一个是从站,从站下面可以有任意数量的从站。

Redis主从复制注意事项默认情况下,master节点可以读取和写入,slave节点只能读取,禁止写入。 请不要更改配置以使从属节点支持写入。 第一个写入的数据不同步到其他节点,然后master节点更改相同的数据将复盖slave节点上的数据,因此没有意义。 master节点挂起后,redis不再向外部提供写入服务。 因为剩下的从属节点不会成为主节点。 主节点锁定不影响从属节点的读取。 主节点启动后,Redis将再次向外部提供写入服务。 slave节点锁定不影响其他slave节点的读取和主节点的读取和写入,并在重新启动后从主节点同步数据。 它提供了主从优势和劣势的读写隔离、提高了高效的数据热备份,以及许多复制缺点主节点的故障。 群集不起作用,可用性低。 要从主节点升级,必须手动干预单个点,这限制了容易降低性能的主节点的存储能力。 主节点的写入受到限制。 (只有一个主节点) )完全同步具有毫秒或秒级纸箱现象的特点。 另一方面,主节点只能是slave

配置Redis主从模式首先使用vim创建主配置文件。 具体指令如下。

vim redis/master-6739.conf如下图所示。

写入以下配置:

bind0.0.0.0port 6379 log file ' 6379.log ' db filename ' dump-6379.RDB ' daemonizeyesrdbcompressionyes,即主节点的端口

vim redis/slave1-6380.conf写入以下配置:

bind0.0.0.0port 6380 log file ' 6380.log ' db filename ' dump-6380.RDB ' daemonizeyesrdbcompresssionyessslaveof 192.168 sleon 现在,我们将重新创建slave2节点的配置。 具体命令如下。

vim redis/slave2-6381.conf写入以下配置:

bind0.0.0.0port 6381 log file ' 6381.log ' db filename ' dump-6381.RDB ' daemonizeyesrdbcompresssionyessslaveof 192.168

redis-server redis/master-6739.conf redis-server redis/slave1- 6380.conf redis-server redis/slave2- 6381.conf

ps -ef | grep redis-server执行完成后,如下图所示。

现在,所有配置都已完成,服务已成功启动。 现在,登录master和两个slave,查看密钥name是否存在。 具体命令如下。

get name运行完成后,如下图所示。

此时,可以看到三个节点没有name密钥。 现在,将master设置为name的值。 具体命令如下。

set name haicoder运行完成后,分别在master和两个slave中检索数据,如下图所示。

在主机上设置密钥,最后设置两个

个 slave 都获取到了这个键的值,即,master 的数据会自动同步到 slave 节点。现在,我们尝试在 slave 设置键,具体命令如下:

set name1 haicoder1

执行完毕后,如下图所示:

我们看到,此时提示我们不能在 slave 写入数据,即 master 可以读写数据,但 slave 只能读取数据。

注意,使用主从模式时应注意 matser 节点的持久化操作,matser 节点在未使用持久化的情况详情下如果宕机,并自动重新拉起服务,从服务器会出现丢失数据的情况。因为 master 服务挂了之后,重启服务后,slave 节点会与 master 节点进行一次完整的重同步操作,所以由于 master 节点没有持久化,就导致 slave 节点上的数据也会丢失掉。所以在配置了 Redis 的主从模式的时候,应该打开主服务器的持久化功能。

查看主从节点

我们要查看当前节点是 master 节点还是 slave 节点,我们可以使用 info 命令,具体命令如下:

info

我们在 master 上执行如下图所示:

我们可以看到,此时显示的 Replication 配置项下面的 role 为 master,现在,我们再次在 slave 节点下查看,执行如下图所示:

我们看到,此时显示的是 slave,同时,我们还可以直接使用 info 加要查看的节点,来查看具体的配置,具体命令如下:

info Replication

我们首先在 master 上查看,输出如下:

我们看到,此时直接显示了 Replication 节点的信息,现在,我们再次查看 slave 节点的信息,输出如下:

我们看到,此时就显示了是 slave 节点了。

主从复制原理 流程

当启动一个 slave node 的时候,它会发送一个 PSYNC 命令给 master node。

如果这是 slave node 初次连接到 master node,那么会触发一次 full resynchronization 全量复制。此时 master 会启动一个后台线程,开始生成一份 RDB 快照文件,同时还会将从客户端 client 新收到的所有写命令缓存在内存中。

RDB 文件生成完毕后, master 会将这个 RDB 发送给 slave,slave 会先写入本地磁盘,然后再从本地磁盘加载到内存中,接着 master 会将内存中缓存的写命令发送到 slave,slave 也会同步这些数据。

slave node 如果跟 master node 有网络故障,断开了连接,会自动重连,连接之后 master node 仅会复制给 slave 部分缺少的数据。

主从复制的断点续传

从 Redis2.8 开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份。

master node 会在内存中维护一个 backlog,master 和 slave 都会保存一个 replica offset 还有一个 master run id,offset 就是保存在 backlog 中的。如果 master 和 slave 网络连接断掉了,slave 会让 master 从上次 replica offset 开始继续复制,如果没有找到对应的 offset,那么就会执行一次 resynchronization。

无磁盘化复制

master 在内存中直接创建 RDB ,然后发送给 slave,不会在自己本地落地磁盘了。只需要在配置文件中开启 repl-diskless-sync yes 即可。具体配置如下:

repl-diskless-sync yes# 等待 5s 后再开始复制,因为要等更多 slave 重新连接过来repl-diskless-sync-delay 5 过期key处理

slave 不会过期 key,只会等待 master 过期 key。如果 master 过期了一个 key,或者通过 LRU 淘汰了一个 key,那么会模拟一条 del 命令发送给 slave。

主从复制的完整流程 流程

slave node 启动时,会在自己本地保存 master node 的信息,包括 master node 的 host 和 ip ,但是复制流程没开始。

slave node 内部有个定时任务,每秒检查是否有新的 master node 要连接和复制,如果发现,就跟 master node 建立 socket 网络连接。然后 slave node 发送 ping 命令给 master node。

如果 master 设置了 requirepass,那么 slave node 必须发送 masterauth 的口令过去进行认证。master node 第一次执行全量复制,将所有数据发给 slave node。而在后续,master node 持续将写命令,异步复制给 slave node。

全量复制

master 执行 bgsave ,在本地生成一份 rdb 快照文件。

master node 将 rdb 快照文件发送给 slave node,如果 rdb 复制时间超过 60 秒(repl-timeout),那么 slave node 就会认为复制失败,可以适当调大这个参数(对于千兆网卡的机器,一般每秒传输 100MB,6G 文件,很可能超过 60s)

master node 在生成 rdb 时,会将所有新的写命令缓存在内存中,在 slave node 保存了 rdb 之后,再将新的写命令复制给 slave node。

如果在复制期间,内存缓冲区持续消耗超过 64MB,或者一次性超过 256MB,那么停止复制,复制失败。

client-output-buffer-limit slave 256MB 64MB 60

slave node 接收到 rdb 之后,清空自己的旧数据,然后重新加载 rdb 到自己的内存中,同时基于旧的数据版本对外提供服务。

如果 slave node 开启了 AOF,那么会立即执行 BGREWRITEAOF,重写 AOF。

增量复制 如果全量复制过程中,master-slave 网络连接断掉,那么 slave 重新连接 master 时,会触发增量复制。master 直接从自己的 backlog 中获取部分丢失的数据,发送给 slave node,默认 backlog 就是 1MB。master 就是根据 slave 发送的 psync 中的 offset 来从 backlog 中获取数据的。 heartbeat

主从节点互相都会发送 heartbeat 信息。

master 默认每隔 10 秒发送一次 heartbeat,slave node 每隔 1 秒发送一个 heartbeat。

异步复制

master 每次接收到写命令之后,先在内部写入数据,然后异步发送给 slave node。

更多

原文链接链接

其他目录

更多文章,可以关注下方公众号:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。