如何管理 Redis 中的副本和客户端

介绍

Redis是一个开源的,内存中的关键值数据存储器。其最受欢迎的功能之一是其对复制的支持。任何Redis服务器都可以将其数据复制到任何数量的复制品,允许高可读度和强大的数据冗余性。此外,Redis被设计为允许许多客户端(默认情况下高达10000个)连接和与数据交互,使其成为许多用户需要访问相同数据集的情况下的好选择。

本教程将提供用于管理 Redis 客户端和复制件的命令的概述。

如何使用此指南

这个指南是写成一个骗局的表,包含自含的示例,我们鼓励你跳到任何与你试图完成的任务相关的部分。

在本指南中显示的命令在运行 Redis 版本 6.0.1 版本的 Ubuntu 22.04 服务器上进行了测试。 要设置类似的环境,您可以遵循我们指南中的 Step 1How To Install and Secure Redis on Ubuntu 22.04 上进行测试。 我们将通过使用 Redis 命令行接口的 redis-cli 来演示这些命令的行为。 如果您使用不同的 Redis 接口 - 例如 - 某些命令的准确输出可能会有所不同。

或者,您可以提供一个受管理的 Redis 数据库实例来测试这些命令,但取决于数据库提供商允许的控制水平,本指南中的一些命令可能无法按描述的方式工作。 要提供 DigitalOcean 受管理数据库,请遵循我们的 管理数据库产品文档

<$>[注] 注: Redis 项目在其文档和各种命令中使用一词来识别复制中的不同角色,尽管该项目的贡献者(正在采取措施改变这种语言)(https://github.com/antirez/redis/issues/5335)在这种情况下不会引起兼容性问题。

此指南将在可能时默认为主要复制,但请注意,有一些情况下一词不可避免地出现。

管理回复

Redis 最突出的特征之一是其 嵌入式复制。当使用复制时,Redis 会创建主要实例的精确副本。

如果您不确定当前连接的 Redis 实例是否是主实例或复制品,则可以通过运行角色命令来检查:

1role

此命令将返回masterreplica,如果您使用的是 Redis Sentinel,则可能会返回sentinel

要将 Redis 实例指定为飞行的另一个实例的复制件,请运行复制命令. 此命令将预期主服务器的主机名或 IP 地址和端口作为参数:

1replicaof hostname_or_IP port

如果服务器已经是另一个主要的副本,它将停止复制旧的服务器,并立即开始同步与新服务器。

若要将复制回归为主要,请运行以下复制命令:

1replicaof no one

这将阻止实例复制主要服务器,但不会丢弃它已经复制的数据集. 此语法在原始原始失败的情况下是有用的。

客户管理

一个 client是连接到服务器以访问服务的任何机器或软件。

客户端列表命令返回了一组有关当前客户端连接的可读信息:

1client list
1[secondary_label Output]
2"id=18165 addr=[2001:db8:0:0::12]:47460 fd=7 name=jerry age=72756 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping
3id=18166 addr=[2001:db8:0:1::12]:47466 fd=8 name= age=72755 idle=5 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=info
4id=19381 addr=[2001:db8:0:2::12]:54910 fd=9 name= age=9 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client
5"

以下是每个领域的含义:

*id':一个独特的64位客户端ID *名称':客户端连接的总长度,由先前的"客户端设置"命令所定义 *adr':客户端连接 *fd'的地址和端口:与客户端连接 *db'的套接字对应的[文件描述器]https://en.wikipedia.org/wiki/File_descriptor:客户端连接的总长度,以秒为单位 *flags':一组一个或多个单色旗,为客户端提供更花岗的细节;审查[客户端列表 ' 命令文件](https://redis.io/commands/client-list),以获得更多细节 db':客户端连接的当前数据库编号. 其范围从"0"到"15" *"子":客户端订阅的频道数量从" "起"到"psub":客户端的图案匹配订阅次数

  • "mutli":客户端在交易中排队的命令数量. 这将显示-1 如果客户端尚未开始交易或0 如果它只开始交易且未排队任何命令
  • qbuf' : 客户端的查询缓冲长度, 表示 0 ` 它没有待处理的查询
  • qbuf-free' : 客户端的查询缓冲器中的自由空间量, 0 意味着查询缓冲器是完整的 *obl' : 客户端的输出缓冲长度
  • omem : 当其缓冲器满
  • : 客户端的输出缓冲器使用的内存
  • 事件: 客户端的文件解写器事件。 这些可以是‘r'表示"可读",‘w'表示"可写",或者两者兼有 *`cmd':客户端运行的最后一个命令

设置客户端名称对任何应用程序中使用 Redis 的连接漏洞进行调试都是有用的。每一个新连接都没有指定名称开始,但客户端设置名称可以用来为当前客户端连接创建一个。

1client setname elaine

若要获取客户端连接的名称,请使用客户端 getname命令:

1client getname
1[secondary_label Output]
2"elaine"

若要获取客户端的连接 ID,请使用客户端 id命令:

1client id
1[secondary_label Output]
2(integer) "19492"

Redis 客户端 ID 永远不会重复,并且是 monotonically incremental. 这意味着如果一个客户端有一个 ID 比另一个更大,那么它是在稍后建立的。

阻止客户端和关闭客户端连接

在同步复制中,每当客户端添加或更改数据时,它必须从一定数量的复制品获得某种认可,以便将更改注册为已承诺。

在非同步复制中,客户端在数据被写入本地存储时就会收到一个确认,即操作已经完成。然而,在此之间可能存在延迟,直到复制实际上写入数据时。如果其中一个复制程序在编写更改之前失败,则该复制程序将永远丢失。因此,虽然非同步复制程序允许客户端继续执行操作,而无需等待复制程序的延迟,则可能导致节点之间的数据冲突,并且可能需要数据库管理员进行额外的工作来解决这些冲突。

由于其专注于性能和低延迟,Redis默认情况下实现非同步复制,但是,您可以使用等待命令模拟同步复制。等待阻止当前客户端连接一段时间(在毫秒内),直到所有以前的写作命令成功传输并被指定数量的复制品接受。

1wait number_of_replicas number_of_milliseconds

例如,如果您想阻止客户端连接,直到所有以前的写作在 30 毫秒的时间内至少被 3 个复制件注册,则您的等待语法将如下写成:

1wait 3 30

等待命令返回一个代表承认写命令的复制件数的整数,即使不是每个复制件都这样做:

1[secondary_label Output]
22

要解锁以前被阻止的客户端连接,无论是从等待,brpopxread命令中,您可以运行一个解锁客户端命令,使用以下语法:

1client unblock client_id

为了暂时暂停当前连接到 Redis 服务器的每个客户端,您可以使用客户端暂停命令. 这在您需要以控制的方式对您的 Redis 设置进行更改的情况下非常有用。

客户端暂停命令要求您指定您想要暂停客户端的时间(以毫秒) 下面的示例暂停所有客户端一秒:

1client pause 1000

客户端杀死语法允许您关闭单个连接或基于多种不同的过滤器的特定连接。

1client kill filter_1 value_1 ... filter_n value_n

以下过滤器可用:

  • addr:允许您从指定的 IP 地址和端口关闭客户端连接
  • client-id:允许您根据其独特的 ID 字段
  • type 关闭客户端连接:允许您关闭每一个特定类型的客户端,这可以是 normalmasterreplicapubsub
  • skipme:此过滤器的值选项是 yesno:
  • 如果指定了 no,则呼叫 client kill 命令的客户端将不会被忽视,如果其他过滤器应用于它
  • 如果指定了 yes,则运行的客户端命令

结论

本指南详细介绍了一些用于管理 Redis 客户端和复制件的命令. 如果在本指南中您想要了解的其他相关命令、论点或程序,请在评论中询问或提出建议。

有关 Redis 命令的更多信息,请参阅我们的教程系列 如何管理 Redis 数据库

Published At
Categories with 技术
comments powered by Disqus