打开/关闭从节点的读命令执行权限
前面的章节曾经提到过,在使用单机 Redis 服务器时,用户可以为主服务器创建从服务器,然后通过让从服务器处理读请求来提升整个系统处理读请求的能力。
与这种做法不一样的是,集群的从节点在默认情况下只会对主节点进行复制,但是不会处理客户端发送的任何命令请求:每当从节点接收到命令请求的时候,它只会向客户端发送转向消息,引导客户端向某个主节点重新发送命令请求。
举个例子,对于主节点 30001 和它的从节点 30005 来说,如果我们向从节点发送以下命令,那么从节点将把客户端转向至主节点,然后再执行命令:
127.0.0.1:30005> GET num
-> Redirected to slot [2765] located at 127.0.0.1:30001
"10086"
127.0.0.1:30001>
但是在某些情况下,用户可能想要让从节点也能处理读请求,从而提高整个集群处理读请求的能力。为此,Redis 向用户提供了 READONLY
和 READWRITE
两个命令,它们可以临时打开或关闭客户端在从节点上执行读命令的权限。
READONLY:打开读命令执行权限
用户可以通过执行以下命令,让客户端临时获得在从服务器上执行读命令的权限:
READONLY
这个命令在成功执行之后将返回 OK 作为结果。
在前面的例子中,当我们直接向从节点 30005 发送读请求 GET num 命令时,该命令将被转向至主节点 30001 执行。但是通过执行 READONLY 命令,我们可以让客户端临时获得在 30005 上执行读命令的权限,这样一来,针对 num 键的 GET 命令请求就不会被转向至节点 30001,而是直接在节点 30005 上执行:
127.0.0.1:30005> READONLY
OK
127.0.0.1:30005> GET num
"10086"
READONLY
命令只对执行了该命令的客户端有效,它并不影响正在访问相同从节点的其他客户端。
READWRITE:关闭读命令执行权限
在使用 READONLY
命令打开客户端对从节点的读命令执行权限之后,我们可以通过执行以下命令重新关闭该权限:
READWRITE
这个命令在执行完毕之后将返回 OK 作为结果。这样一来,执行了该命令的客户端将不能再对从服务器执行读命令。
作为例子,以下代码展示了客户端在执行 READWRITE 命令之后,读请求再次被转向至主节点的过程:
127.0.0.1:30005> READWRITE
OK
127.0.0.1:30005> GET num
-> Redirected to slot [2765] located at 127.0.0.1:30001
"10086"
127.0.0.1:30001>