(书)如何管理redis数据库-4.如何在Redis中管理副本和客户端

介绍

Redis是一个开源的内存中键值数据存储。它最受追捧的功能之一是的支持:任何Redis服务器都可以将其数到任意数量的副本中,从而实现高读取可伸缩性和强大的数据冗余。此外,Redis旨在允许许多客户端(默认情况下最多10000个)连接数据并与数据交互,因此对于许多用户需要访问同一数据集的情况而言,它是一个不错的选择。

本教程介绍了用于管理Redis客户端和副本的命令。

如何使用本指南

本指南以备有完整示例的备忘单形式编写。我们鼓励您跳至与您要完成的任务相关的任何部分。

本指南中显示的命令已在运行Redis版本的Ubuntu 18.04服务器上进行了测试 4.0.9。要设置类似的环境,您可以按照我们的指南如何在Ubuntu 18.04上安装和保护Redis的步骤1进行操作。我们将通过使用Redis命令行界面运行它们来演示这些命令的行为。请注意,如果您使用其他Redis界面(例如Redli),则某些命令的确切输出可能会有所不同。redis-cli

另外,您可以提供一个托管的Redis数据库实例来测试这些命令,但是请注意,根据数据库提供者所允许的控制级别,本指南中的某些命令可能无法按所述方式工作。要配置DigitalOcean托管数据库,请遵循我们的托管数据库产品文档。然后,您必须 安装Redli 设置TLS隧道才能通过TLS连接到托管数据库。

注意: Redis项目在其文档和各种命令中使用术语“主”和“从”来标中的不同角色,尽管该项目的参与者正在采取措施在不引起兼容性问题的情况下更改此语言。 。DigitalOcean通常更喜欢使用替代术语“主要”和“副本”。

本指南将在可能的情况下默认为“主要”和“副本”,但请注意,在某些情况下,不可避免地会出现“主”和“从”这两个术语。

管理副本

Redis最具特色的功能之一是其内置功能。使时,Redis创建主实例的精确副本。这些辅助实例在它们的连接断开时会随时重新连接到主要实例,并且始终旨在保留主要实例的精确副本。

如果不确定当前连接的Redis实例是主实例还是副本,则可以通过运行以下role命令进行检查:

* role 

如果您使用Redis Sentinel,则此命令将返回masterslave,或者可能返回。sentinel

要将Redis实例动态指定为另一个实例的副本,请运行replicaof命令。此命令将预期的主服务器的主机名或IP地址和端口作为参数:

* replicaof hostname_or_IP port 

如果服务器已经是另一台主服务器的副本,它将停旧服务器,并立即开始与新服务器同步。它还将丢弃旧数据集。

要将副本提升回主副本,请运行以下replicaof命令:

* replicaof no one 

这将阻止实主服务器,但不会丢弃的数据集。在原始主数据库失败的情况下,此语法很有用。在replicaof no one发生故障的主数据库的副本上运行后,以前的副本可以用作新的主数据库,并拥有自己的副本作为故障保护。

注意:在版本5.0.0之前,Redis包括此命令的一个版本slaveof

管理客户

一个客户是任何机器或软件连接到服务器才能访问服务。Redis附带了一些命令,可帮助跟踪和管理客户端连接。

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

  * client list 


Output

"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 id=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 id=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 " 

以下是每个字段的含义:

  • id:唯一的64位客户端ID
  • name:客户端连接的名称,由先前的client setname命令定义
  • addr:客户端连接的地址和端口
  • fd:与客户端所连接的套接字相对应的文件描述符
  • age:客户端连接的总时长,以秒为单位
  • flags:一组一个或多个单字符标志,它们提供有关客户端的更详细的详细信息;有关更多详细信息,请参见client list命令文档
  • db:客户端连接到的当前数据库ID号(可以从015
  • sub:客户端订阅的频道数
  • psub:客户端的模式匹配订阅数
  • mutli:客户端已在事务中排队的命令数(将显示-1客户端是否尚未开始事务或0是否仅已开始事务且未排队任何命令)
  • qbuf:客户端的查询缓冲区长度,0表示它没有待处理的查询
  • qbuf-free:客户端查询缓冲区中的可用空间量,0表示查询缓冲区已满
  • obl:客户端的输出缓冲区长度
  • oll:客户端的输出列表的长度,当客户端的缓冲区已满时,将在其中排队答复
  • omem:客户端的输出缓冲区使用的内存
  • events:客户端的文件描述符事件,可以是r“可读”,w“可写”或两者兼有
  • cmd:客户端运行的最后一条命令

设置客户端名称对于调试使用Redis的任何应用程序中的连接泄漏都很有用。每个新连接都将在开始时没有分配的名称,但是client setname可用于为当前客户端连接创建一个新连接。尽管Redis通常将字符串长度限制为512 MB,但是对客户端名称的长度没有限制。但是请注意,客户端名称不能包含空格:

* client setname elaine 

要检索客户端连接的名称,请使用以下client getname命令:

  * client getname 


Output

"elaine" 

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

  * client id 


Output

(integer) "19492" 

Redis客户端ID永远不会重复,并且会单调递增。这意味着,如果一个客户端的ID大于另一个客户端,则它是在以后的时间建立的。

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

系统通常被描述为_同步异步_。在同中,每当客户端添加或更改数据时,客户端都必须从一定数量的副本中收到某种确认,以使更改注册为已提交。这有助于防止节点发生数据冲突,但这要付出一定的等待时间,因为客户端必须等待执行另一项操作,直到它从一定数量的副本中收到回音。

另一方面,在异中,一旦将数据写入本地存储,客户端就会看到确认操作已完成的确认。但是,这与副本实际写入数据之间可能会有时滞。如果其中一个副本在写入更改之前失败,则该写入将永远丢失。因此,尽管异允许客户端继续执行操作而没有等待副本引起的延迟,但它可能导致节点之间的数据冲突,并且可能需要数据库管理员方面的额外工作来解决这些冲突。

由于专注于性能和低延迟,Redis默认情况下实现异。但是,您可以使用该wait命令模拟同。wait在指定的时间段(以毫秒为单位)内阻止当前客户端连接,直到所有先前的写命令成功传输并被指定数量的副本接受为止。此命令使用以下语法:

* wait number_of_replicas number_of_milliseconds 

例如,如果要在30毫秒的超时时间内至少3个副本注册所有先前的写入操作之前阻止客户端连接,则wait语法应如下所示:

* wait 3 30 

wait命令返回一个整数,该整数表示已确认写入命令的副本数,即使并非每个副本都这样做:

Output

2 

要取消阻止以前通过waitbrpop,或)xread命令阻止的客户端连接,可以client unblock使用以下语法运行命令:

* client unblock client_id 

要暂时挂起当前连接到Redis服务器的每个客户端,可以使用以下client pause命令。这在需要以受控方式更改Redis设置的情况下很有用。例如,如果要将一个副本提升为主实例,则可以事先暂停每个客户端,以便升级副本并使客户端作为新的主实例连接到该副本,而不会丢失任何写操作。

client pause命令要求您指定要挂起客户端的时间(以毫秒为单位)。下面的示例将所有客户端暂停一秒钟:

* client pause 1000 

client kill语法使您可以基于多个不同的过滤器关闭单个连接或一组特定的连接。语法如下所示:

* client kill filter_1 value_1 ... filter_n value_n 

在Redis 2.8.12和更高版本中,可以使用以下过滤器:

  • addr:允许您从指定的IP地址和端口关闭客户端连接
  • client-id:允许您根据其唯一ID字段关闭客户端连接
  • type:关闭一个给定类型,它可以是每一个客户端normalmasterslave,或pubsub
  • skipme:此过滤器的值选项为yesno
    • 如果no指定了if ,则调用该client kill命令的客户端不会被跳过,并且如果其他过滤器适用于该客户端,它将被杀死
    • 如果yes指定,则将跳过运行该命令的客户端,而kill命令将对该客户端无效。skipme始终yes默认为

结论

本指南详细介绍了许多用于管理Redis客户端和副本的命令。如果您想在本指南中概述其他相关的命令,参数或过程,请在下面的注释中提出疑问或提出建议。