凌云的博客

行胜于言

Redis 配置详解(二)

分类:Redis| 发布时间:2019-04-09 22:49:00


概述

本文接着上一篇 Redis 配置详解(一) 继续讲解 Redis 的相关配置选项。

复制选项

replicaof <masterip> <masterport>

通过 replicaof (即以前的 slaveof)选项可以将 Redis 实例设置为其他 Redis 服务端的副本。

关于 Redis 的复制,有以下几点需要注意:

  • Redis 复制是异步的,但是你可以设置 master 节点,使得 master 节点至少要和指定数量的 replicas 节点连接才提供写服务
  • 当 Redis replicas 节点和 master 节点短暂断开后,replicas 节点可以向 master 节点要求进行部分数据的重传
  • 复制是自动的,不需要用户干预,当发生网络分区后,replicas 节点会自动尝试和 master 节点重连以及进行数据同步
masterauth <master-password>

当 master 节点使用了 “requirepass” 选项后,replicas 节点需要配置此选项。

replica-serve-stale-data yes

此选项为以前的 slave-serve-stale-data,replicas 节点和 master 节点断开连接后,replicas 节点根据 replica-serve-stale-data 选项的配置可能有以下行为:

  • 选项设置为 yes(默认值),replicas 节点会继续向客户端提供服务,此时返回给客户端的数据很可能是过期的
  • 选项设置为 no,除了 INFO, replicaOF, AUTH, PING, SHUTDOWN, REPLCONF, ROLE, CONFIG, SUBSCRIBE, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB, COMMAND, POST, HOST, 和 LATENCY 命令外的其他命令,replicas 节点都会返回 "SYNC with master in progress" 给客户端
replica-read-only yes

设置 replicas 节点是否只读,从 Redis 2.6 开始此选项的默认值为 yes。 需要注意的是只读的 replicas 节点并没有设计为会暴露给网络上不受信任的客户端使用的。 你需要对其进行保护以防实例被滥用。并且只读的 replicas 节点导出了所有如 CONFIG,DEBUG,等管理命令。 你可以使用 'rename-command' 将所有管理/危险 命令进行映射以提高安全性。

repl-diskless-sync no

DISKLESS REPLICATION 目前是实验性功能

当一个不能续传或者新的 replicas 需要进行“全量同步”时。一个 RDB 文件需要由 master 传送到 replicas。 根据 repl-diskless-sync 选项的不同,RDB 文件有以下两种传输方式:

  1. Disk-backed:Redis master 节点创建一个新的进程并且将 RDB 文件写入磁盘。然后文件通过父进程传输给 replicas 节点
  2. Diskless:Redis master 节点一个新的进程并且直接将 RDB 文件写入到 replica 的 socket 中,不写到磁盘

当进行 disk-backed 复制时,当 RDB 文件生成完毕,多个 replicas 通过排队来同步 RDB 文件。 当进行 diskless 复制时,master 节点会等待一段时间再传输以期望会有多个 replicas 连接进来,这样 master 节点就可以同时同步到多个 replicas 节点。

repl-diskless-sync-delay 5

当启用 diskless 复制后,可以通过此选项设置 master 节点创建子进程前等待的时间,单位为秒。

repl-ping-replica-period 10

Replicas 发送 PING 到 master 的间隔,默认值为 10 秒。

repl-timeout 60

此选项用于设置以下情形的 timeout 判断:

  1. 从 replica 节点的角度来看的 SYNC 过程中的 I/O 传输
  2. 从 replica 节点的角度来看的 master 的 timeout(如 data,pings)
  3. 从 master 节点角度来看的 replica 的 timeout(如 REPLCONF ACK pings)

需要注意的是,此选项必须大于 repl-ping-replica-period,否则在低业务量的情况下会经常发生 timeout。

repl-disable-tcp-nodelay no

master 和 replicas 节点的连接是否关掉 TCP_NODELAY 选项。 这个实际影响的是 TCP 层的选项,里面会用 setsockopt 设置,默认为 no,表示 TCP 层会禁用 Nagle 算法,尽快将数据发出, 设置为 yes 表示 TCP 层启用 Nagle 算法,数据累积到一定程度,或者经过一定时间 TCP 层才会将其发出。

repl-backlog-size 1mb

设置复制的 backlog 缓冲大小。当 replicas 节点断开重连后,如果断点发生时的数据还在 backlog 缓冲中, 则不需要全量同步,只需要部分同步。 更大的 backlog 缓冲大小,意味着 replicas 断开重连后,依然可以进行续传的时间越长(支持断开更长时间)。 backlog 缓冲只有在至少一个 replicas 节点连过来的时候 master 节点才需要创建。

repl-backlog-ttl 3600

当 replicas 节点断开连接后,master 节点会在一段时间后释放 backlog 缓冲区。 这个选项设置的是当最后一个 replicas 断开链接后,master 需要等待多少秒再释放缓冲区。

需要注意的是 replicas 节点永远都不会释放这个缓冲区,因为它有可能再次连接到 master 节点, 然后尝试进行 “增量同步”。

replica-priority 100

这是 replicas 节点通过 INFO 接口给出的信息,默认值为 100。 当 master 节点无法正常工作后 Redis Sentinel 通过这个值来决定将哪个 replicas 节点提升为 master 节点。

这个数值越小表示越优先进行提升。如有三个 replicas 节点其 priority 值分别为 10,100,25, Sentinel 会选择 priority 为 10 的节点进行提升。

这个值为 0 表示 replica 节点永远不能被提升为 master 节点。

min-replicas-to-write 3
min-replicas-max-lag 10

以上选项用于设置至少有 N 个 replicas 节点延迟少于 M 秒时,master 节点才能进行写操作, 如上面的例子表示至少有 3 个 replicas 节点延迟少于 M 秒时,master 节点才能进行写操作。 将上面参数的任意一个设置为 0 表示不启用此功能,min-replicas-to-write 的默认值为 0,min-replicas-max-lag 的默认值为 10。

replica-announce-ip 5.5.5.5
replica-announce-port 1234

Redis master 可以通过不同方式列出连接上来的 replicas 节点的地址和端口。 如 Redis Sentinel 等会使用 “INFO replication” 命令来获取 replica 实例信息。 master 的 “ROLE“ 命令也会提供此信息。

这个信息一般来说是通过 replica 节点通过以下方式获取然后报告上来的:

  • IP:通过自动识别连接到 Socket 的信息自动获取
  • Port:一般来说这个值就是 replicas 节点用来接受客户端的连接的监听端口

但是,若启用了端口转发或者 NAT,可能需要其他地址和端口才能连接到 replicas 节点。 这种情况下,需要设置这两个选项,这样 replicas 就会用这两个选项设置的值覆盖默认行为获取的值,然后报告给 master 节点。 根据实际情况,你可以只设置其中某个选项,而不用两个选项都设置。

安全选项

requirepass foobared

设置此选项后,客户端需要使用 AUTH <PASSWORD> 命令进行认证后才能进行其他操作。 当你的服务器有可能被非信任的客户端访问到的时候这个命令是很有用的。

警告:由于 Redis 非常快,外部用户若进行暴力破解,每秒能尝试超过 150k 个密码。因此你需要使用强度非常高的密码才能保证密码不容易被暴力破解掉。

rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52

在共享环境下,可以通过 rename-command 命令将一些危险的命令进行重命名。 如上所示将 CONFIG 命令重命名为难以猜测的命令。

可以通过将命令重命名为空字符串从而将其完全 ”kill“ 掉,如:

rename-command CONFIG ""

rename-command 命令会被记录到日志和 AOF 文件中或者传输到 replicas 节点,而这可能会是一个安全问题。

客户端选项

maxclients 10000

设置同时连接进来的最大客户端数,默认值为 10000。需要注意的是同时连接进来的客户端数量还受限于 Redis 进程所能创建的最大的文件句柄的数量减去 32(Redis 会保留部分句柄用于内部使用)。

当超过限制后 Redis 会向所有新进来的连接发送错误信息 ”max number of clients reached“ 然后关闭连接。