redis.conf 文件中的配置一览。

一、网络相关配置

1、bind

默认情况下,如果没有指定 bind 配置,Redis 会监听主机上所有可用的网络接口的连接。可以使用 bind 配置指令指定只监听一个或多个选定的接口,只需要在配置文件中在 bind 后跟一个或多个 IP 地址。

每个地址都可以加上前缀 -,这意味着如果该地址不可用,Redis 也不会启动失败。这里的不可用仅指那些不对应任何网络接口的地址。已经被使用的地址始终会导致启动失败,而不支持的协议则会被静默跳过。

示例:

  • bind 192.168.1.100 10.0.0.1:监听两个特定的 IPv4 地址
  • bind 127.0.0.1 ::1:监听 IPv4 和 IPv6 的回环地址
  • bind * -::*:像默认配置一样,监听所有可用的接口

注意:如果运行 Redis 的计算机直接暴露在互联网中,绑定所有接口是危险的,这会将 Redis 实例暴露给互联网上的所有人。因此,默认情况下,需要取消注释了以下 bind 指令,它会强制 Redis 只监听 IPv4 和 IPv6(如果可用)的回环接口地址(这意味着 Redis 只能接受来自运行同一主机的客户端连接)。

如果您确定要让您的实例监听所有接口,请注释掉以下行。

您还需要设置密码,除非您明确禁用了保护模式。

2、port

指定接受连接的端口,默认端口是 6379(IANA 815344)。如果指定端口为 0,Redis 将不会监听 TCP 套接字。

IANA 815344 是与 Redis 数据库的默认端口号 6379 相关联的编号。这个端口号是由互联网编号分配机构(IANA)分配的,用于识别 Redis 服务通常运行的端口。在网络安全和数据库配置的上下文中,这个端口号是很重要的。例如,当配置 Redis 数据库时,通常会使用这个默认端口。同时,在网络安全的实践中,了解这个端口号有助于正确地设置防火墙规则和网络安全策略,以确保只有受信任的网络或 IP 地址能够访问 Redis 服务。

3、protected-mode

默认值 yes

保护模式是一层安全保护机制,用于避免暴露在互联网的 Redis 实例被访问和利用。

当保护模式开启且默认用户没有密码时,服务器仅接受来自 IPv4 地址(127.0.0.1)、IPv6 地址(::1)或 Unix 域套接字的本地连接。

默认情况下,保护模式是启用的,只有在您确定希望其他主机的客户端在没有配置认证时连接到 Redis,才应禁用它。

注意

  • 安全性:禁用保护模式会使 Redis 实例暴露在网络中,增加被攻击的风险。因此,强烈建议仅在安全的内网中禁用保护模式,并确保配置了适当的认证机制。
  • 认证配置:如果需要允许远程连接,请确保配置了 Redis 密码认证。可以在 redis.conf 文件中修改 requirepass 配置来设置密码。

二、快照相关配置

1、save

该属性用于配置是否 Redis 将数据持久化保存到磁盘中。

配置格式如下:

1
save <seconds> <changes> [<seconds> <changes> ...]

Redis 会在经过指定的秒数并且超过了指定的写操作次数时保存数据库到磁盘。

可以通过传递一个空字符串参数来完全禁用持久化保存。如下示例:

1
save ""

除非另外指定,否则 Redis 默认会持久化数据:

  • 在 3600 秒(1 小时)后,如果至少执行了 1 次更改。
  • 在 300 秒(5 分钟)后,如果至少执行了 100 次更改。
  • 在 60 秒后,如果至少执行了 10000 次更改。

您可以通过取消配置文件中的注释以下行来显式设置这些值。

1
save 3600 1 300 100 60 10000

2、sanitize-dump-payload

启用或禁用在加载 RDB 或 RESTORE 数据时对 ziplist 和 listpack 等进行完全的检查和清理。这可以减少在处理命令时出现断言或崩溃的机会。

选项:

  • no:永不执行完全清理检查。
  • yes:始终执行完全清理检查。
  • clients:仅对用户连接执行完全清理检查。不包括:从主节点接收到的 RDB 文件、RESTORE 命令,以及带有跳过清理负载(skip-sanitize-payload)ACL 标志的客户端连接。

默认值应该是 clients,但由于当前它影响集群通过 MIGRATE 进行重新分片,因此暂时默认设置为 no

1
sanitize-dump-payload no

3、dbfilename

该属性用于配置转储数据库文件的文件名称。

默认值为:dump.rdb

三、通用配置

1、daemonize

默认情况下,Redis 不会以守护进程方式运行。如果需要让 Redis 以守护进程方式运行,可以将该选项设置为 yes。需要注意的是,当 Redis 作为守护进程运行时,会在 /var/run/redis.pid 文件中写入进程 ID。当 Redis 由 upstartsystemd 进行监控时,此参数将不起作用。

1
daemonize no

2、databases

1
databases 16

设置数据库数量。默认的数据库是 DB 0,您可以在每个连接的基础上使用 SELECT <dbid> 选择不同的数据库,其中 dbid 是一个介于 0 和 databases-1 之间的数字。

四、复制相关(REPLICATION)

1、replicaof

该配置用于主从复制。

使用 replicaof 将一个 Redis 实例设置为另一个 Redis 服务器的副本。

以下是需要了解的有关 Redis 复制的一些重要内容:

  • Redis 复制是异步的,但可以配置主节点在检测到没有与至少给定数量的从节点连接时停止接受写操作。
  • 如果复制链接在相对较短的时间内丢失,Redis 从节点能够与主节点进行部分重新同步。您可能需要根据需求合理配置复制回溯大小。
  • 复制是自动进行的,不需要用户干预。网络分区后,从节点会自动尝试重新连接到主节点并与之重新同步。

该配置的格式如下:

1
replicaof <主节点IP> <主节点端口>

2、masterauth

如果主节点设置了密码保护(使用下面的 requirepass 配置),可以让从节点在开始复制同步过程之前进行身份验证,否则主节点将拒绝从节点的请求。

1
masterauth <master-password>

3、masteruser

如果你使用的是 Redis ACL(适用于 Redis 6 版本或更高版本),并且默认用户没有权限执行 PSYNC 命令或其他复制所需的命令。在这种情况下,最好配置一个专门用于复制的用户,并通过如下方式指定 masteruser 配置:

1
masteruser <username>

当指定了 masteruser 时,从节点将使用新的 AUTH 格式与其主节点进行身份验证:AUTH <用户名> <密码>

4、replica-read-only

该配置用于设置从节点实例是否接受写操作。

从节点进行写操作是有一些用处的,例如存储一些临时数据(因为在与主节点重新同步后,写入从节点的数据将很容易被删除),但如果因为配置错误导致客户端向其写入数据,可能会引发问题。

从 Redis 2.6 开始,默认情况下从节点是只读的。

注意:只读从节点并不设计用于暴露给互联网上的不可信客户端。它只是一个防止误用的保护层。默认情况下,只读从节点仍会导出所有管理命令,例如 CONFIGDEBUG 等。你可以在一定程度上通过使用 rename-command 来屏蔽所有管理/危险命令,从而提升只读从节点的安全性。

5、replica-announce-ip 和 replica-announce-port

Redis 主节点能够以不同的方式列出连接的副本的地址和端口。例如,INFO replication 部分提供了此信息,Redis Sentinel 等工具使用这些信息来发现副本实例。另一个获取此信息的地方是主节点执行 ROLE命令的输出中。

副本通常报告的 IP 地址和端口是通过以下方式获得的:

  • IP:地址是通过检查副本连接到主节点时使用的套接字的对等地址自动检测到的。
  • 端口:在复制握手过程中,副本会传递其使用的端口,通常是副本用于监听连接的端口。

然而,当使用端口转发或网络地址转换(NAT)时,副本可能实际上是通过不同的 IP 和端口对来连接的。副本可以使用以下两个选项之一向主节点报告特定的 IP 和端口,以便在 INFOROLE 中报告这些值。

如果只需要覆盖端口或 IP 地址,无需同时使用这两个选项。

1
2
replica-announce-ip 5.5.5.5
replica-announce-port 1234

五、集群相关(CLUSTER)

1、cluster-enabled

普通的 Redis 实例无法成为 Redis 集群的一部分;只有作为集群节点启动的实例才可以。

要将 Redis 实例作为集群节点启动,需要启用该配置:

1
cluster-enabled yes

2、cluster-config-file

1
cluster-config-file nodes-6379.conf

每个集群节点都有一个集群配置文件。此文件不应手动编辑,而是由 Redis 节点创建和更新的。每个 Redis 集群节点都需要一个独立的集群配置文件。请确保在同一系统上运行的实例没有重叠的集群配置文件名。

3、cluster-node-timeout

1
cluster-node-timeout 15000

集群节点超时是指一个节点必须在多长时间内无法访问,才能被视为故障状态。大多数其他内部时间限制是节点超时的倍数。

4、cluster-port

1
cluster-port 0

cluster-port 是集群总线用于监听入站连接的端口。当其设置为默认值 0 时,将绑定到命令端口加 10000 的端口。

设置该值后,在执行 CLUSTER MEET 命令时需要指定集群总线的端口。

5、cluster-replica-validity-factor

1
cluster-replica-validity-factor 10

当主节点故障时,复制节点在数据比较老旧时会避免启动故障转移(failover)操作。

由于从节点无法精确地测量其数据的“年龄”,因此会进行以下两项检查:

  • 复制节点间的消息交换:如果有多个复制节点能够进行故障转移,它们将交换消息,以便优先处理拥有最佳复制偏移量的复制节点(即处理了来自主节点的更多数据)。这些复制节点会根据它们的偏移量进行排名,并按照排名的顺序,在启动故障转移时延迟一定时间。

  • 最后与主节点的交互时间:每个复制节点计算与主节点的最后交互时间,这个时间可以是上次收到的 ping 或命令(如果主节点仍处于“已连接”状态),或自与主节点断开连接以来经过的时间(如果复制链接当前断开)。如果最后一次交互时间太长,该复制节点将不会尝试进行故障转移。

“最后与主节点的交互时间”可以由用户调整。具体来说,如果自上次与主节点交互以来的时间超过以下公式计算的值,复制节点将不会进行故障转移:

1
(node-timeout * cluster-replica-validity-factor) + repl-ping-replica-period

例如,如果 node-timeout 为30秒,cluster-replica-validity-factor 为10,且默认的 repl-ping-replica-period 为10秒,则复制节点在无法与主节点通信超过310秒时,将不会尝试故障转移。

较大的 cluster-replica-validity-factor 可能允许数据过旧的复制节点进行故障转移,而较小的值可能导致集群无法选举出复制节点。

为了最大限度地提高可用性,可以将 cluster-replica-validity-factor 设置为 0,这意味着无论复制节点上次与主节点的交互时间如何,复制节点都会尝试进行故障转移。然而,复制节点仍会根据它们的偏移量排名应用延迟。

0 是唯一可以确保在所有分区恢复后,集群能够继续运行的值。

6、cluster-migration-barrier

1
cluster-migration-barrier 1

集群中的副本可以迁移到孤立的主节点,即那些没有工作副本的主节点。这样可以提高集群应对故障的能力,因为如果主节点没有工作副本,在发生故障时就无法进行故障转移。

副本只有在原主节点至少有一个给定数量的其他工作副本时,才会迁移到孤立的主节点。这个数量被称为迁移屏障(migration barrier)。例如,迁移屏障设为1意味着,只有当原主节点至少还剩1个工作副本时,副本才会迁移。这个值通常反映了你希望每个主节点在集群中拥有的副本数量。

默认值为1(即副本只有在原主节点至少还有一个副本时才会迁移)。要禁用迁移,只需将迁移屏障设置为一个非常大的值,或将 cluster-allow-replica-migration 设置为 no。迁移屏障值为0也可以设置,但仅在调试时有用,在生产环境中是危险的。

7、cluster-allow-replica-migration

1
cluster-allow-replica-migration yes

关闭此选项可以减少自动集群配置的使用。它既会禁用副本迁移到孤立主节点的功能,也会禁用从变为空的主节点进行迁移的功能。

默认值为 yes(允许自动迁移)。

8、cluster-require-full-coverage

1
cluster-require-full-coverage yes

默认情况下,如果 Redis 集群节点检测到至少有一个哈希槽没有覆盖(没有节点提供服务),它们会停止接受查询。这意味着如果集群部分停机(例如,一些哈希槽不再有节点覆盖),整个集群最终会不可用。一旦所有哈希槽都再次覆盖,集群会自动恢复可用性。

但是,有时你可能希望集群中的一部分仍在工作并继续处理已覆盖的键空间部分。要实现这一点,可以将 cluster-require-full-coverage 选项设置为 no

9、cluster-replica-no-failover

1
cluster-replica-no-failover no

此选项在设置为 yes 时,防止副本在主节点故障期间尝试进行故障转移。然而,如果被强制,副本仍然可以执行手动故障转移。

在不同的场景中,这种设置是非常有用的,尤其是在多个数据中心操作的情况下,我们希望在非总数据中心故障的情况下,某一侧永远不会被提升为主节点。

10、cluster-allow-reads-when-down

1
cluster-allow-reads-when-down no

此选项在设置为 yes 时,允许节点在集群处于故障状态时处理读取流量,只要它相信自己拥有相应的槽。

这对于两种情况非常有用。

  • 第一种情况是当应用程序在节点故障或网络分区期间不需要数据一致性时。一个例子是缓存,只要节点有数据,就应该能够提供服务。
  • 第二个使用案例是针对不满足推荐的三个分片但希望启用集群模式并在以后扩展的配置。在一个或两个分片的配置中,主节点故障会导致整个集群的读写中断,如果未设置此选项,则会发生这种情况;而设置此选项后,只有写入中断。在没有主节点的法定人数时,槽的所有权将不会自动更改。

11、cluster-allow-pubsubshard-when-down

1
cluster-allow-pubsubshard-when-down yes

此选项在设置为 yes 时,允许节点在集群处于故障状态时处理发布/订阅分片流量,只要它相信自己拥有相应的槽。

如果应用程序希望在集群全局稳定状态不正常时仍然使用发布/订阅功能,这将非常有用。如果应用程序希望确保只有一个分片为给定频道提供服务,则应将此功能保持为“是”。

1
cluster-link-sendbuf-limit 0

集群链接发送缓冲区限制是指单个集群总线链接的发送缓冲区在字节上的内存使用限制。如果超出此限制,集群链接将被释放。这主要是为了防止发送缓冲区在与慢速对等节点的链接上无限增长(例如,PubSub 消息堆积)。

默认情况下,此限制是禁用的。当 'mem_cluster_links' INFO 字段和/或 'CLUSTER LINKS' 命令输出中的 'send-buffer-allocated' 条目持续增加时,可以启用此限制。建议的最小限制为 1GB,以便集群链接缓冲区至少能够容纳一个 PubSub 消息(client-query-buffer-limit 的默认值为 1GB)。

12、cluster-announce-hostname

1
cluster-announce-hostname ""

集群可以使用此属性来配置其宣布的主机名。

这是需要使用 TLS 服务器名称指示(SNI)或处理基于 DNS 路由的应用程序的常见用例。默认情况下,此值仅作为 CLUSTER SLOTS 命令中的附加元数据显示,但可以使用 cluster-preferred-endpoint-type 配置进行更改。该值会沿着集群总线传达给所有节点,将其设置为空字符串将移除主机名,并传播该移除操作。

13、cluster-announce-human-nodename

1
cluster-announce-human-nodename ""

集群可以配置一个可选的节点名称,作为调试和管理信息的补充,除了节点 ID 之外。此名称在节点之间进行广播,因此在报告跨节点事件(例如节点故障)时,将与节点 ID 一起使用。

14、cluster-preferred-endpoint-type

1
cluster-preferred-endpoint-type ip

集群可以通过其 IP 地址、用户定义的主机名或声明没有端点来宣传客户端应如何连接它们。

通过该配置,可以设置显示为首选端点的类型,该配置的取值如下:

  • ip
  • hostname
  • unknown-endpoint

该值控制 MOVEDASKING 请求返回的端点,以及 CLUSTER SLOTS 的第一个字段。

如果首选端点类型设置为主机名,但没有设置公告的主机名,则将返回一个问号 ?

当集群宣传自己具有未知端点时,表示服务器不知道客户端如何能够到达集群。这可能发生在某些网络情况下,存在多条可能的到达节点的路径,而服务器不知道客户端选择了哪条路径。在这种情况下,服务器期望客户端使用上次请求时所用的相同端点进行连接,但使用响应中提供的端口。

六、集群对 Docker 或 NAT(网络地址转换) 的支持

在某些部署中,Redis 集群节点的地址发现可能会失败,原因可能是地址被 NAT 转换,或者端口被转发(典型的例子是 Docker 及其他容器环境)。为了使 Redis 集群在这些环境中正常工作,需要为每个节点配置其公共地址的静态配置。以下四个选项用于此目的:

  • cluster-announce-ip:节点的公共 IP 地址
  • cluster-announce-port:节点用于非 TLS 连接的客户端端口
  • cluster-announce-tls-port:节点用于 TLS 连接的客户端端口
  • cluster-announce-bus-port:节点的集群消息总线端口

这些信息会被发布到集群消息总线的头部,以便其他节点可以正确地映射发布信息的节点地址。

如果启用了 TLS 集群(tls-cluster 设置为 yes)且没有指定 cluster-announce-tls-port,那么 cluster-announce-port 将指向 TLS 端口。

如果没有配置上述选项,Redis 集群会使用默认的自动检测功能。

示例:

1
2
3
4
cluster-announce-ip 10.1.1.5
cluster-announce-tls-port 6379
cluster-announce-port 0
cluster-announce-bus-port 6380

相关链接

OB tags

#Redis #未完待续