Redis进阶:配置文件(一)
对于配置文件来说,往往是很多大佬们入手运维优化的第一步,因此我们想要真正的进阶,就一定要看看配置文件中有哪些可以配置的地方,有哪些可以优化的配置点。当然,咱也不是特别专业,有很多配置也不知道是啥意思,更不知道应该配成什么才是最好的。既然这样,那就一起来学学呗。
整个配置文件有两篇文章,基于 Redis6.2 版本的原生配置文件。其它没有在配置文件中出现的配置项可能都并不是非常常用的选项,Redis7 以及更新版本的配置项也并没有详细的列出,如果大家有兴趣,可以到官方文档中去查找完整的以及最新的所有配置项信息。
基本配置
打开配置文件,最开始的部分就是告诉我们可以进行一些单位的转换。直接使用 1k 可以表示 1000bytes ,而使用 1kb 则可以表示 1024bytes ,注意这一块的微小差别哦。
代码语言:javascript复制# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
接着,就是教我们可以 INCLUDES 其它配置文件,这个也是很多类似的系统工具都提供的功能,最典型的就是 Nginx 配置 vhost 的时候大家也往往会不同的站点单独使用一个配置文件。但其实它们最后都是在主配置文件中 INCLUDES 进来的。紧跟着后面是可以使用 loadmodule 加载一些外部模块和插件,比如官方文档上就有的布隆过滤器之类的插件。
好了,继续向下看,我们将看到 NETWORK 这一个大的配置模块。
NETWORK配置
代码语言:javascript复制bind 127.0.0.1 ::1
protected-mode no
port 6379
这三个应该是同学们接触到的比较多的配置项,bind 是绑定 IP ,默认就是绑定本地的回环地址,protected-mode 是保护模式的开关,打开后服务端将只接收 bind 绑定的客户端连接,并且需要配置密码(注意如果是多实例哨兵部署,这个要设置成no,否则哨兵之间可能无法通信)。最后的 port 就是服务端启动时所监听的端口号。
剩下的几个配置大家看看就好,平常改动这几个配置的应该不多。
代码语言:javascript复制# tcp 未连接队列数量配置,要注意主进程是否有慢查询,如果出现慢查询
# 这里就会积压,超过这个数量之后就会产生队列溢出,抛弃连接
# 不要大于系统的 /proc/sys/net/core/somaxconn 配置,可以设置成 2048 ,和系统的 somaxconn 一起改
tcp-backlog 511
# 使用 unix socket 形式连接
# 之前我们试过,默认是注释的状态
# unixsocket /run/redis.sock
# unixsocketperm 700
# 客户端空闲多久后关闭连接
timeout 0
# 客户端保持活跃状态的时间,推荐就是 300s
tcp-keepalive 300
TLS/SSL 配置
这一块的配置是用于配置安全套接字连接的,对应的 HTTP 上就是 HTTPS 的那个意思。不过一般我们也很少会配置这里,因为大部分情况下其实我们的 Redis 会优先配置在内网使用,如果有外网使用需求的话,增加这一套配置是对于安全的又一层保障。
代码语言:javascript复制# 默认情况下,TLS/SSL 是关闭的
# 如果要打开的话,先把 port 设置成 0
# 然后打开下面这个注释
# tls-port 6379
# 配置X.509证书和私钥以用于验证
# tls-cert-file redis.crt
# tls-key-file redis.key
# 如果密钥文件使用密码短语加密就在下面这里直接配置上
# tls-key-file-pass secret
# 有的时候,可能会配置不同的证书,比如客户端证书和服务端证书
# 在这里,可以直接配置客户端证书
# tls-client-cert-file client.crt
# tls-client-key-file client.key
# 客户端证书如果是密码的,也可以直接把密码写在这里
# tls-client-key-file-pass secret
# 配置 Diffie-Hellman (DH) 文件,使用 DH 密钥
# tls-dh-params-file redis.dh
# 配置使用 CA 证书进行验证
# tls-ca-cert-file ca.crt
# tls-ca-cert-dir /etc/ssl/certs
# 默认情况下,需要客户端使用有效的客户端证书
# 如果配置为 no 则不需要也不接受客户端证书
# 如果配置为 optinal 则接受客户端请收并验证其有效,但并不是必须的
# tls-auth-clients no
# tls-auth-clients optional
# 默认情况下,主从复制和 Cluster 间不会使用 TLS ,这里可以设置成 yes 开启主从复制也使用 TLS
# tls-replication yes
# tls-cluster yes
# 使用什么 TLS 协议
# 下面打开注释就是只启用 1.2 和 1.3 的 TLS ,不使用 1.1x 版本
# tls-protocols "TLSv1.2 TLSv1.3"
# 配置允许的密码,只对小于等于 TLSv1.2 以下的版本有效
# tls-ciphers DEFAULT:!MEDIUM
# 配置 TLSv1.3 所使用的密码套件信息
# tls-ciphersuites TLS_CHACHA20_POLY1305_SHA256
# 使用 yes 的话,选择密码时,使用服务器的首选项
# 设置 no 的话,服务端跟随客户端的选择
# tls-prefer-server-ciphers yes
# 禁用或开启 TLS 缓存
# tls-session-caching no
# TLS 缓存会话的默认数量,不设置或者保持注释状态的话,默认是 20480
# tls-session-cache-size 5000
# TLS 缓存会话的超时时间
# tls-session-cache-timeout 60
好吧,实话实说,从来没配置过这一块的内容,所以说只能是照着注释大概翻译一下。
GENERAL 通用配置
通用配置这一块,比较常用的是下面几个配置。
代码语言:javascript复制daemonize yes #后台运行
pidfile "/var/run/redis_6379.pid" # 进程id文件存放路径
databases 16 # 库数量
这三个配置之前的文章中也都用过,也不用多解释了,剩下的东西我们再通过注释看一下。
代码语言:javascript复制# 可以通过upstart和systemd管理Redis守护进程
# 不是我们常见的那个 supervisectl 工具
# upstart 和 systemd 是大部分 Linux 自带的那个
# supervised auto
# 服务端日志输出级别
# 有 debug、verbose、notice、warning
# debug 输出的内容最多全面,适合测试环境
# notic 和 warning 适合生产环境
loglevel notice
# 配置日志的输出路径
# 如果 daemonize 是 no ,输出到控制台
# 如果 daemonize 是 yes ,输出到指定的路径文件中,如果没配,输出到 /dev/null
logfile ""
# 系统日志记录相关的配置
# syslog-enabled no
# syslog-ident redis
# syslog-facility local0
# 系统崩溃日志相关的配置
# crash-log-enabled no
# crash-memcheck-enabled no
# 启动时显示 Redis 的 Logo 不
always-show-logo no
# Linux 下查看进程名时,是否设置 Redis 的进程名
# 就是我们用 ps 命令查看时的那个名字
set-proc-title yes
# 进程名的模板
proc-title-template "{title} {listen-addr} {server-mode}"
SNAPSHOTTING 快照配置
这一块呀,其实就是 RDB 相关的配置,本身对于 RDB 持久话来说,它就是一种快照机制。因此,这一大块的配置名称也是使用的 SNAPSHOTTING 。
代码语言:javascript复制# 不用多解释了吧,RDB 持久化的规则
# 不记得的小伙伴看之前的 Redis进阶:持久化策略 这篇文章或者视频哦
save 3600 1
save 300 100
save 60 10000
# 假如 bgsave 的时候发生问题,默认情况下会禁止写入
# 这个吧,可以帮助发现问题,也就是持久化失败了会很明显的出现无法写入数据的情况
# 但如果你已经有了对于持久化的监控,把它关掉也可以
stop-writes-on-bgsave-error yes
# 是否在持久化时对数据进行 LZF 压缩
rdbcompression yes
# 是否对 RDB 内容进行 CRC64 签名检查
rdbchecksum yes
# 启用或禁用对于 ziplist 和 listpack 的完整整理
# 可以设置 no yes clients
# 默认值是 clients ,表示仅对客户端连接进行整理,但它会影响集群
# 集群操作时,可以临时设置为 no
# sanitize-dump-payload no
# RDB 文件的名称
dbfilename "dump.rdb"
# 删除同步文件,仅在有 AOF 文件时有效
# 主从复制时,在没有配置 RDB 持久化策略的机器上是否删除复制时使用的 RDB 文件
rdb-del-sync-files no
# 工作目录
# 之前讲过,rdb、aof、cluster nodes 文件都会放到这个目录下
dir "/usr/local/var/db/redis"
REPLICATION 主从复制相关配置
主从配置是一块非常大的配置部分,有很多的配置参数。不过当时我们学习的时候大部分都是在命令行操作的,而且其实主要接触到的也就那么两个命令以及对应的配置参数。其它的配置参数咱们今天就一起都来好好看看。
代码语言:javascript复制# 不多解释了吧
# 之前文章中我们使用的是在命令中直接配置
# 也说过在配置文件中也可以直接配置,就是在这里了
# replicaof <masterip> <masterport>
# 主从配置时认证相关的内容
# 之前也讲过了
# masterauth <master-password>
# masteruser <username>
# 当从库失去与主机的连接之后要怎么办?
# 设置为 yes ,就还是正常响应命令及结果,但可以包含过期数据
# 设置为 no ,除了 INFO、REPLICAOF 等等的一些命令之外,其它的命令报错
# 具体哪些命令可以使用直接去看原版注释
replica-serve-stale-data yes
# 配置从库是否是只读的,换成 no 的话就也可以写入数据了
replica-read-only yes
# 复制的同步策略,使用磁盘还是socket
# 磁盘就是发送 RDB 文件
# socket 就是直接主库请求从库的socket端口同步命令
# 现在肯定是无盘复制好些啦,不过默认是 no ,因为无盘复制还是实验阶段
repl-diskless-sync no
# 当使用无盘复制的时候,可以配置等待时间
# 一般主库会等待一会再向从库发送数据
repl-diskless-sync-delay 5
# 无盘加载
# 一般情况下,socket 会比文件传输快,但也有可能传送时有新的数据
# 这里的配置如果是 disabled ,就是不使用无盘复制,先将文件保存到磁盘再加载
repl-diskless-load disabled
# 副本以预定义的间隔向服务器发送PING
# 默认值为10秒
# repl-ping-replica-period 10
# 复制的超时时间
# repl-timeout 60
# 同步之后是否禁用主库上的 TCP_NODELAY
# 使用 yes 会使用较少的包向从库发送数据,但会增加延迟和带宽
repl-disable-tcp-nodelay no
# 复制缓冲日志大小
# repl-backlog-size 1mb
# 缓冲日志删除时间
# repl-backlog-ttl 3600
# 复制副本的优先级 优先级高的副本在哨兵选举时的得分会更高
replica-priority 100
# 在 哨兵 信息中可以移除当前副本的信息
# replica-announced yes
# 从机最小写入数量
# 几个从机处于在线状态
# 从机的延迟小于10秒
# min-replicas-to-write 3
# min-replicas-max-lag 10
# 主库的 role 命令可以查看到的从库的信息
# replica-announce-ip 5.5.5.5
# replica-announce-port 1234
无盘复制大概的意思是指主服务器直接通过套接字将快照内容发送到从节点,生成快照是一个遍历的过程,主节点会一边遍历内存,一边将序列化的内容发送到从节点,从节点还是跟之前一样,先将接收到的内容存储到磁盘文件中,再进行一次性加载。
KEYS TRACKING 键跟踪
主要是对于客户端的缓存来说的。一般情况下,Redis 支持客户端缓存一些键的内容,这样可以帮助客户端更快地响应数据并且减少服务端的压力。默认状态下是不开启的,当开启之后,如果数据发生了变化,服务端会向客户端发通知并更新缓存,而客户端缓存的键数量如果超出了下面设置的值,就会随机删除一个之前缓存的客户端缓存 Key 。
代码语言:javascript复制# 客户端缓存时跟踪的键数量
# tracking-table-max-keys 1000000
更详细的资料大家可以自己再去搜索一下哈。
SECURITY 安全配置
安全相关的配置不用我说大家应该也想到了,一个是全局密码,一个是之前我们学过的 ACL ,这两块的配置之前也是在命令行中直接操作的,同样地,它们也可以通过配置文件来实现。另外,ACL 配置文件还可以单独设置一个配置文件,我们也讲过。
代码语言:javascript复制# ACL 用户的配置
# user alice on -DEBUG @all ~* >somepassword
# ACL 日志长度
acllog-max-len 128
# 使用单独的 acl 文件保存 acl 用户信息
#aclfile /usr/local/etc/redis_users.acl
# 全局密码配置
# requirepass aabbcc
# 为 PUB/SUB 模式提供用户的默认权限
# acl-pubsub-default resetchannels
# 给命令重命名(已标记为废弃)
# 可以更改危险命令的名称
# 现在推荐的是使用 ACL 控制用户可以执行的命令权限
# rename-command CONFIG ""
CLIENTS 客户端配置
就一个,客户端的最大连接数。另外在系统层面还要注意 Linux 系统的 ulimit 配置。
代码语言:javascript复制maxclients 10000
总结
今天的内容是配置文件学习的第一部分,主要是基本配置、快照(RDB)、主从复制、安全相关配置的内容。有很多内容是我们之前用过的,但更多的内容其实是我们平常很少会接触到的,在这里不管用不用得到,大概的看一眼留个印象才是更重要的。如果确实想要精通整个 Redis 以及需要对 Redis 优化有深度需求的同学,那还是要更加详细地了解每个配置参数的作用以及它们更详细的含义。
下篇文章我们将继续学习配置文件中后半部分的内容。