2023年2月13日星期一

Redis 配置文件详解

bind 0.0.0.0

# 监听地址,可以用空格隔开后多个监听IP

 

protected-mode yes

# redis3.2 之后加入的新特性,默认为yes时,在没有设置bind IP和密码的时候,redis只允许本地使用127.0.0.1:6379的连接方式访问数据,虽然可以远程连接这台redis,但是无法访问内部的数据,而当你尝试访问内部数据时,将提示警告信息并拒绝远程访问

# 故而当redis在实际生产服务器上的时候一般设置为no的同时也会给当前redis设置对应的bind的ip地址和密码,特别是在使用跨服务器组成的集群时,这个参数设置为yes,无法进行远程访问,同时当我们将这个参数设置为no时,最好给当前redis设置对应的访问密码,以便保证redis内的数据安全。

 

port 6379

# 监听端口

 

tcp-backlog 511

# 三次握手的时候server端收到client ack确认号之后的队列值,即全队列长度

 

timeout 0

# 客户端和Redis服务端的连接超时时间,默认是0,表示永不超时

 

tcp-keepalive 300

# tcp 会话保持时间300s

 

daemonize no

# 默认redis-server不作为守护进程运行的,而前台运行,如果想在后台运行,就把它改成 yes,当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件

 

supervised no

# 和OS相关参数,可设置通过upstart和systemd管理Redis守护进程,centos7后都使用systemd

pidfile /var/run/redis_6379.pid

# pid文件路径

 

loglevel notice

# 日志级别

Redis总共支持四个级别:debug、verbose、notice、warning,默认为notice

四个级别根据使用阶段来选择,生产环境选择notice 或者warning

1. debug:会打印出很多信息,适用于开发和测试阶段

2. verbose(冗长的):包含很多不太有用的信息,但比debug要清爽一些

3. notice:适用于生产模式

4. warning : 警告信息

 

logfile "/path/redis.log"

# 日志路径

 

databases 16

# 设置数据库数量,默认:0-15,共16个库,可以使用SELECT 【db_id】命令连接上指定库

 

always-show-logo yes

# 在启动redis 时是否显示redis的logo

 

save 900 1

save 300 10

save 60 10000

# redis自动存储机制,比如以上分别表示为,

在900秒内有1个键内容发生更改就自动快照备份

在300秒内有10个键内容发生更改就自动快照备份

在60秒内有10000个健以上的变化,就自动快照备份

 

stop-writes-on-bgsave-error yes

# 在后台redis自动存储时,一旦出错(比如空间满等原因导致快照无法保存出错时)就禁止redis写入操作

默认为yes,不过实际生产中建议为no,其实还是看业务而定,

如果这个数据的影响比较大,对准确性追求比较高时,建议为yes,否则可以设置为no

 

rdbcompression yes

# 持久化到RDB文件时,是否压缩,"yes"为压缩,"no"则反之

所谓的 RDB文件,一般默认为dump.rdb,是redis的数据存储文件,也就是快照文件,默认路径为 ./也就是和redis.conf放在同一个路径/etc/下面,当然你也看可以手动指定,而在docker中默认在 /data/下面

 

rdbchecksum yes

#是否对备份文件开启RC64校验,默认是开启

 

dbfilename dump.rdb

# 存储数据的rdb文件名

 

dir ./

# 快照文件保存路径,示例:dir "/apps/redis/data"

 

replicaof

# 指定复制的master主机地址和端口,5.0版之前的指令为slaveof

 

masterauth  [maser_password]

# 指定复制的master主机的密码,当主从复制不开启时,

并且当主机master参数里面的 requirepass 没有设置密码时,

一般slave从服务器的redis的这个参数配置,需要注释掉,因为没意义

 

replica-serve-stale-data yes

# 是否复制坏的数据,一般当从库同主库失去连接或者复制正在进行,从库有两种运行方式:

1、设置为yes(默认设置),从库会继续响应客户端的读请求,此为建议值

2、设置为no,除去指定的命令之外的任何请求都会返回一个错误"SYNC with master in progress"。

 

replica-read-only yes

# 是否设置从库只读,建议值为yes, 可以做到主从读写分离,提高读写效率的同时,

# 如果改成no,此时主库同步从库时可能会覆盖数据,造成数据丢失,因为对于同一个key可能同时出现两次修改,

# 并且你不能确定从主向从复制,以及从自己写数据时,这两种情况对同一个key的改变的先后顺序,

# 并且这两次值得哪个是正确的值的修改行为

 

repl-diskless-sync no

# 是否使用socket方式复制数据(无盘异步同步),新slave连接连接时候需要做数据的全量同步,

# redis server就要从内存dump出新的RDB文件,然后从master传到slave,有两种方式把RDB文件传输给客户端:

1、基于硬盘(disk-backed):为no时,master创建一个新进程dump生成RDB磁盘文件,RDB完成之后由父进程(即主进程)将RDB文件发送给slaves,此为推荐值

2、基于socket(diskless):master创建一个新进程直接dump RDB至slave的网络socket,不经过主进程和硬盘

当基于硬盘(disk-backed 为no 时,RDB文件创建后,一旦创建完毕,可以同时服务更多的slave,

当基于socket(为yes)时, 新slave连接到master之后得逐个同步数据。

当磁盘I/O较慢且网络较快时,可用diskless(yes),否则使用磁盘diskless(no)

 

repl-diskless-sync-delay 5

# diskless时复制的服务器等待的延迟时间,设置0为关闭,在延迟时间内到达的客户端,会一起通过diskless方式同步数据,但是一旦复制开始,master节点不会再接收新slave的复制请求,直到下一次同步开始才再接收新请求。即无法为延迟时间后到达的新副本提供服务,新副本将排队等待下一次RDB传输,因此服务器会等待一段时间才能让更多副本到达。推荐值:30-60

 

repl-ping-replica-period 10

# slave根据master指定的时间进行周期性的PING master 监测master状态

 

repl-timeout 60

# 复制连接的超时时间,需要大于repl-ping-slave-period,否则会经常报超时

 

repl-disable-tcp-nodelay no

# 是否在slave套接字发送SYNC之后禁用 TCP_NODELAY,

# 如果选择"yes",Redis将合并多个报文为一个大的报文,从而使用更少数量的包向slaves发送数据,但是将使数据传输到slave上有延迟,Linux内核的默认配置会达到40毫秒,

# 如果 "no" ,数据传输到slave的延迟将会减少,但要使用更多的带宽

 

repl-backlog-size 512mb

# 复制缓冲区内存大小,当slave断开连接一段时间后,该缓冲区会累积复制副本数据,因此当slave 重新连接时,通常不需要完全重新同步,只需传递在副本中的断开连接后没有同步的部分数据即可。只有在至少有一个slave连接之后才分配此内存空间。

 

repl-backlog-ttl 3600

# 多长时间内master没有slave连接,就清空backlog缓冲区,默认为3600秒

 

replica-priority 100

# 当master不可用,Sentinel会根据slave的优先级选举一个master,值越低的slave会当选master,而配置成0,永远不会被选举,一般多个slave都设为一样的值,让其自动选择

 

min-replicas-to-write 3

# 至少有3个可连接的slave,mater才接受写操作,也就是间接限定最小的从redis的数量

 

min-replicas-max-lag 10

# 和上面类似,在这里指的是至少3个slave的ping延迟不能超过10秒,否则master也将停止写操作

 

requirepass foobared

#设置redis 连接密码,如果有特殊符号,用" "引起来

同时注意,用以下auth命令可以设置当前的redis的密码,但是只是临时的,重启redis服务器,密码就还原了。

要想永久设置密码,需要在配置文件中设置当前requirepass这个参数

 

rename-command

#重命名一些高危命令,示例:rename-command FLUSHALL "" 禁用命令

 

maxclients 10000

# Redis最大连接客户端的数量

 

maxmemory

# redis使用的最大内存,单位为bytes字节,0为不限制,建议设为物理内存一半,8G内存的计算方式8(G)*1024(MB)1024(KB)*1024(Kbyte),需要注意的是缓冲区是不计算在maxmemory内。

 

appendonly no

# 是否开启AOF日志记录,默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了,但是redis如果中途宕机,会导致可能有几分钟的数据丢失(取决于dump数据的间隔时间),它是根据save来策略进行持久化,而Append Only File是另一种持久化方式,可以提供更好的持久化特性,Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。默认不启用此功能

 

appendfilename "appendonly.aof"

# AOF文件名,是文本文件,存放在dir指令指定的目录中,默认也就放在redis.conf同一个文件夹下,当然这个AOF存储的文件的默认名为 appendonly.aof,并且默认情况下,该功能并不会开启,因为AOF(Append Only File)默认是不开启的

 

appendfsync everysec

# AOF(Append Only File)持久化策略的配置,一般有以下几种参数选项:

no:表示不执行fsync,由操作系统保证数据同步到磁盘,

always:表示每次写入都执行fsync,以保证数据同步到磁盘,

everysec:表示每秒执行一次fsync,可能会导致丢失这1s数据。

详细可以参考这篇文章:https://redis.com.cn/topics/persistence.html#rdb-aof

 

no-appendfsync-on-rewrite no

# 在aof rewrite期间,是否对aof新记录的append暂缓使用文件同步策略,主要考虑磁盘IO开支和请求阻塞时间。

默认为no,表示"不暂缓",新的aof记录仍然会被立即同步,Linux的默认fsync策略是30秒,

如果为yes 可能丢失30秒数据,但由于yes性能较好而且会避免出现阻塞因此比较推荐。

 

auto-aof-rewrite-percentage 100

# 当AOF log增长超过指定百分比例时,重写AOF文件,

设置为0表示不自动重写Aof 日志,重写是为了使aof体积保持最小,

但是如果不重写,可以确保保存最完整的数据,但是可能会导致AOF文件的持续增长。

 

auto-aof-rewrite-min-size 64mb

# 触发aof rewrite的最小文件大小,默认为 64MB

 

aof-load-truncated yes

# 是否加载由于其他原因导致的末尾异常的AOF文件(主进程被kill/断电等),建议yes

 

aof-use-rdb-preamble yes

# redis4.0新增RDB-AOF混合持久化格式,在开启了这个功能之后,AOF重写产生的文件将同时包含RDB格式的内容和AOF格式的内容,

其中RDB格式的内容用于记录已有的数据,而AOF格式的内存则用于记录最近发生了变化的数据,

这样Redis就可以同时兼有RDB持久化和AOF持久化的优点(既能够快速地生成重写文件,也能够在出现问题时,快速地载入数据)。

 

lua-time-limit 5000

# lua脚本的最大执行时间,单位为毫秒

 

cluster-enabled yes

# 是否开启集群模式,默认是单机模式

 

cluster-config-file nodes-6379.conf

# 由node节点自动生成的集群配置文件名称

 

cluster-node-timeout 15000

# 集群中node节点连接超时时间,单位为毫秒,超过此时间,会踢出集群,

详情可以参考这篇文章:https://blog.csdn.net/yaomingyang/article/details/79081299

 

cluster-replica-validity-factor 10

# 在执行故障转移的时候可能有些节点和master断开一段时间,数据比较旧,这些节点就不适用于选举为master,超过这个时间的就不会被进行故障转移,

计算公式:(node-timeout * replica-validity-factor) + repl-ping-replica-period

集群中当一个节点向另一个节点发送PING命令,但是目标节点未在给定的时限内返回PING命令的回复时,那么发送命令的节点会将目标节点标记为PFAIL(possible failuer,可能已失效);等待节点回复的时限称为节点超时时限(node timeout),是一个节点选项(node-wise setting);

该配置用于决定当 Redis Cluster 集群中,一个 master 宕机后,如何选择一个 slave 节点完成故障转移自动恢复(failover)。

如果设置为 0 ,则不管 slave 与 master 之间断开多久,都认为自己有资格成为 master。

下面提供了两种方式来评估 slave 的数据是否太旧。

  • 如果有多个 slave 可以 failover,他们之间会通过交换信息选出拥有最大复制 offset 的 slave 节点。
  • 每个 slave 节点计算上次与 master 节点交互的时间,这个交互包含最后一次 ping 操作、master 节点传输过来的写指令、上次 master 断开的时间等。如果上次交互的时间过去很久,那么这个节点就不会发起 failover。

针对第二点,交互时间可以通过配置定义,如果 slave 与 master 上次交互的时间大于 (node-timeout * cluster-replica-validity-factor) + repl-ping-replica-period,该 slave 就不会发生 failover。

例如,`node-timeout = 30 秒,cluster-replica-validity-factor=10,repl-ping-slave-period=10秒,

表示slave节点与master节点上次交互时间已经过去了310秒,那么slave节点就不会做failover。

调大 cluster-replica-validity-factor 则允许存储过旧数据的 slave 节点提升为 master,

调小的话可能会导致没有 slave 节点可以升为 master 节点。

考虑高可用,建议大家设置为 cluster-replica-validity-factor 0。

 

cluster-migration-barrier 1

# 集群迁移屏障,一个主节点master至少拥有一个正常工作的从节点,

没有 slave 节点的 master 节点称为孤儿 master节点,这个配置就是用于防止出现裸奔的 master。

即如果主节点的slave节点故障后会将多余的从节点分配到当前主节点成为其新的从节点。

当某个 master 的 slave 节点宕机后,集群会从其他 master 中选出一个富余的 slave 节点迁移过来,确保每个 master 节点至少有一个 slave 节点,

防止当孤立 master 节点宕机时,没有slave节点可以升为 master 导致集群不可用。

默认配置为 cluster-migration-barrier 1,是一个迁移临界值。

含义是:迁移后 master 节点至少还有 1 个 slave 节点才能做迁移操作。

比如 master A 节点有2个以上 slave 节点 ,当集群出现孤儿 master B 节点时,A 节点富余的 slave 节点可以迁移到 master B 节点上。

生产环境建议维持默认值,最大可能保证高可用,不建议设置为非常大的值或者配置 cluster-allow-replica-migration no 禁用自动迁移功能。

cluster-allow-replica-migration 默认配置为 yes,表示允许自动迁移。

 

cluster-require-full-coverage yes

# 集群请求槽位全部覆盖,如果一个主库宕机且没有备库就会出现集群槽位不全,

那么yes情况下redis集群槽位验证不全就不再对外提供服务,也就是当 redis cluster 发现至少还有一个 哈希槽没有被分配时禁止查询操作。

这就会导致集群部分宕机,整个集群就不可用了,当所有哈希槽都有分配,集群会自动变为可用状态。

而no则可以继续使用但是会出现查询数据查不到的情况(因为有数据丢失)。

 

cluster-replica-no-failover no

# 如果为yes,此选项阻止在主服务器发生故障时尝试对其主服务器进行故障转移。 但是,主服务器仍然可以执行手动强制故障转移。

默认配置为 no,当配置成 yes,在master 宕机时,slave 不会做故障转移升为 master。

这个配置在多数据中心的情况下会很有用,你可能希望某个数据中心永远不要升级为 master 节点,否则 master 节点就漂移到其他数据中心了,因为如果此配置为no,而我的集权当前节点出错failover,此时我master降级为slave,并且有新的slave被选举为master,而原master可能会自动回复,而此时会自动重新加入到cluster里面,但是此时作为slave的原master的分配是随机的,所以会出现master 节点就漂移到其他数据中心的情况,也就是其他的数据节点中去。

 

slowlog-log-slower-than 10000

# 以微秒为单位的慢日志记录,为负数会禁用慢日志,为0会记录每个命令操作。

举个例子,如果这个选项的值为100,那么执行时间超过100微秒的命令就会被记录到慢查询日志。

 

slowlog-max-len 128

# 指定服务器最多保存多少条慢查询日志,达到此长度后,记录新命令会将最旧的命令从命令队列中删除,以此滚动删除,

也就是说当服务器存储的慢查询日志数量等于slowlog-max-len选项的值时,服务器在添加一条新的慢查询日志之前,会先将最旧的一条慢查询日志删除,并将最新的一条添加进去,简单来说先进先出。

# 对于以上两个参数slowlog-log-slower-than和slowlog-max-len而言,需要补充一点是,

Slow log ,它是 Redis 用来记录超过指定执行时间的日志系统,所记录的日志也就是慢日志,用户可以通过这个功能产生的慢日志来监视和优化查询速度,

执行时间不包括与客户端交谈,发送回复等I/O操作,而是实际执行命令所需的时间(在该阶段线程被阻塞并且不能同时为其它请求提供服务)。

Slow log 保存在内存里面,读写速度非常快,因此可放心地使用,不必担心因为开启 slow log 而影响 Redis 的速度。

 

另外对于慢日志有以下几个常用命令:

SLOWLOG len              # 查看慢日志的记录条数

SLOWLOG get             # 查看慢日志的记录

SLOWLOG reset          # 清空慢日志

 

参考文章:

https://cloud.tencent.com/developer/article/1947475

https://zhuanlan.zhihu.com/p/384307361

https://www.jb51.net/article/267398.htm

注:关于redis参数配置优化,可以参考以下这篇文章,特别是关于虚拟内存的部分:

https://www.shuzhiduo.com/A/kPzO7aKwzx/

留下您的评论