Redis 5.0.4配置文件redis.conf全文解读

   Redis解压完毕可见目录下的redis.conf,在安装之后生成自启动脚本就有步骤是复制该配置文件到/etc/redis/目录下,话不多说,看看去:

1.头部说明

  头部内容说明:注意单位问题,当需要设置内存大小的时候,可使用类似1k、5GB、4M这样的常见格式,单位不区分大小写,1GB 1Gb 1gB的写法是完全一样的。

2.INCLUDES

  一般情况下只有一个配置文件,但若对所有的Redis服务器有通用版配置文件的基础上,又对每个服务器有个性化配置需求,就可以通过include /path/to/local.conf参数配置多个配置文件。

  注意:“inclue”选项不能被admin或Redis哨兵的“CONFIG REWRITE”命令重写,因为Redis总是使用最后解析的配置行作为配置指令的值,最好在redis.conf 开头配置includes来避免它在运行时被覆写;相反,若要以include的配置为主,那么需要将 include 配置写在 redis.conf 文件的末尾。

3.MODULES

  Redis 4.0起引入Module自定义模块开发功能,loadmodule参数引入自定义模块。

4.NETWORK

  Network涉及的参数:

  • bind:配置一个或多个 ip地址来实现监听一个或多个网络接口;默认值127.0.0.1,即只允许本地客户端连接,不可远程连接;如果bind值为空,则Redis监听服务器上所有可用网络接口的连接。
  • protected-mode:redis3.2版本后新增的配置项,默认为yes,需配置bind ip或者设置访问密码来实现连接redis服务,值为no时,外部网络可以直接访问。
  • port:Redis运行端口,默认值6379,如果端口设置为0,Redis就不会监听TCP套接字,单机开启多个Redis服务进程时该值就需有差异。
  • tcp-backlog:在高并发环境下需要一个高backlog值来避免客户端慢连接问题,默认值511,注意Linux内核默默地将这个值减小到/proc/sys/net/core/somaxconn的值,所以需要确认增大somaxconn和tcp_max_syn_backlog两个值来达到想要的效果。
  • unixsocket、unixsocketperm:指定用来监听Unix socket的路径,没有默认值, 所以在没有指定的情况下Redis不会监听Unix socket。
  • timeout:设置客户端空闲多少秒后关闭连接,单位为秒,默认0,(0代表禁用,永不关闭)。
  • tcp-keepalive:定时通过SO_KEEPALIVE向客户端发送ACK检测客户端是否存活,该值是发送ACK的时间间隔,单位为秒,Redis 3.2.1.起官方建议值300s,如果为0,则不会定期检测,timeout和tcp-keepalive都可用来清理失效的连接。

5.GENERAL

  GENERAL涉及的参数:

  • daemonize:Redis默认不作为守护进程来运行的,可以把这个设置为"yes"让它作为守护进程来运行,注意,当作为守护进程的时候,Redis会把进程ID写到 /var/run/redis.pid。
  • supervised:通过upstart和systemd管理Redis守护进程,这些supervision方法仅表示“process is ready”。
  • pidfile:配置PID文件路径,当redis作为守护进程运行的时候,会把pid写进指定路径文件中。
  • loglevel:设置日志级别,默认notice,可选值如下:

debug(很多信息,对开发/测试有用)
verbose(很多精简的有用信息,但是不像debug等级那么多)
notice(适量的信息,基本上是生产环境中需要的程度
warning(只有很重要/严重的信息会记录下来)

  • logfile:定义日志名称,空值表示强制输出到命令行终端窗口上,注意:如果Redis以守护进程方式运行,而设置日志为标准输出的话,那么日志会发送到 /dev/null。
  • syslog-enabled: 要使用系统日志记录器很简单,只要设置 “syslog-enabled” 为 “yes” 就可以了, 然后根据需要设置其他一些syslog参数就可以了。
  • syslog-ident:指定syslog身份,默认为redis。
  • syslog-facility:指定syslog的设备,必须是一个用户或者是 LOCAL0 ~ LOCAL7 之一。
  • databases:设置数据库个数,默认数据库是 DB 0,可以通过SELECT WHERE dbid(0~## ‘databases’ - 1)来为每个连接使用不同的数据库。
  • always-show-logo:yes
今天的不高兴
和昨天的不高兴
大有区别
如果昨天你问我
为什么不高兴
我会滔滔不绝跟你说上半天
而今天
你最好别问我

6.SNAPSHOTTING

  SNAPSHOTTING涉及的参数:

  • save: 指定触发 Redis的持久化条件,即指定秒数和数据变化次数之后把数据库写到磁盘上。

   下面的例子将会进行把数据写入磁盘的操作:save 900 1 #900秒内如果超过1个key被修改,则发起数据快照保存。
  注意:不需要持久化数据时把所有"save"配置注释即可,也可通过添加一条带空字符串参数的save指令来移除之前所有配置的save指令。

  • stop-writes-on-bgsave-error:默认为yes,如果开启RDB快照(至少一条save指令)并且最新的后台保存失败,Redis将会停止接受写操作,这将提醒用户数据没有正确的持久化到硬盘,否则可能没人注意到故障发生。如果后台保存进程重启,Redis将自动允许写操作。且如果已经部署了适当的Redis服务器和持久化的监控,可关掉这个功能以便于即使是硬盘,权限等出问题了Redis也能够像平时一样正常工作,
  • rdbcompression:当导出到 .rdb 数据库时是否用LZF压缩字符串对象,默认设置为 “yes”,所以几乎总是生效的,如果想节省CPU的话可以把这个设置为 “no”,但是如果有可压缩的key的话,那数据文件就会更大了。
  • rdbchecksum:因为版本5的RDB有一个CRC64算法的校验在文末,这使文件格式更可靠,但在生产和加载RDB文件时,有性能消耗的代价(大约10%),所以可以关掉它来获取性能最优化;另外,在禁用校验和的情况下创建的RDB文件的校验和为零,它将跳过检查加载代码。
  • dbfilename:定义持久化数据库的文件名。
  • dir: 定义数据持久化路径。

7.REPLICATION

  REPLICATION涉及的参数:

  • replicaof :主从同步参数,通过 slaveof 配置来实现Redis实例的备份,用于本机Redis作为slave去连接主Redis
  • masterauth :如果master设置了密码(通过下面的 “requirepass” 选项来配置),那么slave在开始同步之前必须进行身份验证,否则它的同步请求会被拒绝。
  • replica-serve-stale-data:当一个slave与master的连接断开,或者同步正在进行中,slave的行为有两种可能:

   如果 slave-serve-stale-data 设置为 “yes” (默认值),slave会继续响应客户端请求,可能是正常数据,也可能是还没获得值的空数据。
   如果 slave-serve-stale-data 设置为 “no”,slave会回复"正在从master同步(SYNC with master in progress)"来处理各种请求,除了 INFO 和 SLAVEOF 命令。

  • replica-read-only:一般slave为只读库,该参数配置salve实例是否接受写操作,可写的slave实例可能对存储临时数据比较有用 (因为写入salve的数据在同master同步之后将很容被删除),但是如果客户端由于配置错误在写入时也可能产生一些问题。
  • repl-diskless-sync:DISKLESS REPLICATION目前是实验性功能,该参数定义主从数据复制是否使用无硬盘复制功能,默认值为no。

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

  • repl-diskless-sync-delay:启用无硬盘复制时,一旦传输开始,后续新的replicas就得排队等待,所以master节点会在这个delay时间之后再传输以期望会有多个replicas连接进来,再同时同步到多个replicas节点,这个时间以秒为单位,默认为5秒,要关掉这一功能,只需将它设置为0秒,传送会立即启动。
  • repl-ping-replica-period:slave根据指定的时间间隔向服务器发送ping请求,默认10秒。
  • repl-timeout: 以下选项为设置同步的超时时间:
    1)从replicas角度来看,在与master SYNC期间有大容量数据传输造成超时;
    2)从replicas角度来看,master超时,如data、ping等;
    3)在master角度来看,replicas超时,如REPLCONF ACK pings。

  确保这个值大于指定的repl-ping-slave-period,否则在主从间低业务量时每次都会检测到超时.

  • repl-disable-tcp-nodelay:是否在replicas套接字发送SYNC之后禁用 TCP_NODELAY ,如果选择“yes”,Redis将使用更少的TCP包和带宽来向replicas发送数据,但是这将使数据传输到replicas上有延迟,Linux内核的默认配置会达到40毫秒;如果选择了 “no”, 数据传输到replicas的延迟将会减少但要使用更多的带宽,默认会为低延迟做优化,但高负载情况或主从之间的跳数过多时,“yes”是个不错的选择,默认值no。
  • repl-backlog-size:设置数据复制backlog缓冲大小,backlog记录replicas断开连接期间产生的数据,当replicas重新连接时,无需做全量同步,增量同步断开期间replicas丢失的数据即可;同步的backlog越大,replicas 能够进行增量同步并且允许断开连接的时间就越长,backlog在至少有一个replicas连接的情况下master才会创建。
  • repl-backlog-ttl:当master在一段时间内不再与任何replicas连接,backlog将会释放;该参数配置了从最后一个replicas断开多少秒后,backlog缓冲将会释放,0表示永不释放backlog。

注意:replicas节点永远都不会释放这个backlog缓冲区,因为它有可能升级到master节点, 要力保能够与新从节点实现 “增量同步”。

  • replica-priority:通过Redis的Info输出的replicas节点信息(整数值),当master运行故障时,Redis Sentinel根据该配置值来选择一个replicas提升为master。优先级数字小的replicas会优先考虑提升为master,如有3个 replicas节点priority 值分别为 10,100,25,Sentinel 会选择 priority为10的节点提升为master,0作为一个特殊的优先级,标识这个replicas不能作为master,默认优先级为100。
  • min-replicas-to-write 3、min-replicas-max-lag 10:该配置表示可用的replicas少于3个、延迟超过10秒就禁止写操作,当至少有 N个replicas节点延迟少于M秒时,master才接受写操作,N个replicas需要是“oneline”状态,延时是以秒为单位,并且必须小于等于指定值,是从最后一个从replicas接收到的ping(通常每秒发送)开始计数;将上面参数的任意一个设置为 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/Port信息:
  IP:通过自动识别replica连接master的Socket 的信息中自动获取;
  Port:与master连接的端口,也是 replicas节点用来监听其他客户端的连接。
  注意:若启用了端口转发或者 NAT,可能需要其他IP和Port才能连接到replicas节点。 这种情况下,需要设置这两个选项,这样 replicas 就会用这两个选项设置的值覆盖默认行为获取的值,然后报告给 master节点。 根据实际情况,可以只设置其中某个选项,而不用两个选项都设置。

8.SECURITY

  SECURITY涉及的参数:

  • requirepass:该参数要求客户端在处理任何命令时都要通过AUTH 验证身份,这个功能在限制不被信任的其它客户端连接时很实用,为了向后兼容的话,这段应该注释掉,而且大多数时候不需要身份验证(例如:它们运行在自己的服务器上。)

  警告:由于Redis太快了,所以居心不良的人可以尝试超过每秒150k个密码来试图破解连接。这意味着需要一个设置高强度的密码,否则破解太容易了。

  • rename-command:在共享环境下,可以为危险命令进行重命名规避风险,比如,为 CONFIG 改个其他不太容易猜到的名字,例如:rename-command ONFIG b840fc02d524045429941cc15f59e41cb7be6c52,甚至也可以通过给命令赋值一个空字符串来完全禁用这条命令。

9.CLIENTS

  CLIENTS涉及的参数:

  • maxclients:设置客户端最大并发连接数,默认10000,由于redis不区分连接是客户端连接还是内部打开文件或者和replicas连接等,那么最大的客户端连接数就被设置成当前文件限制数减32(因为Redis服务器保留了一些文件描述符作为内部使用),所以该参数最低值32,一旦并发数达到设定值,Redis会关闭所有新连接并发送错误’max number of clients reached’。

10.MEMORY MANAGEMENT

  MEMORY MANAGEMENT涉及的参数:

  • maxmemory:Redis配置的最大内存,当内存满了,会根据maxmemory-policy策略进行数据处理,如果因为删除策略Redis无法删除key,或者策略设置为 “noeviction”,Redis会回复需要更多内存的错误信息给命令。例如,SET,LPUSH等等,但是会继续响应像Get这样的只读命令。

  警告:master为同步replicas的输出缓冲区所需内存不计算在使用内存中,如果需要附加多个replicas,建议设置一个稍小的maxmemory,这样系统就会有空闲的内存作为replicas的输出缓存区(但是如果最大内存策略设置为"noeviction"的话就没必要了)。

  • maxmemory-policy:最大内存策略:如果达到内存限制了,Redis如何删除key,可以在下面五个策略里面选:

volatile-lru -> 根据LRU算法生成的过期时间来删除。
allkeys-lru -> 根据LRU算法删除任何key。
volatile-random -> 根据过期设置来随机删除key。
allkeys->random -> 无差别随机删。
volatile-ttl -> 根据最近过期时间来删除(辅以TTL)
noeviction -> 谁也不删,直接在写操作时返回错误。
  注意:对所有策略来说,如果Redis找不到合适的可以删除的key都会在写操作时返回一个错误。
  目前涉及的命令:set setnx setex append incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd sinter sinterstore union sunionstore sdiff sdiffstore zadd zincrby zunionstore interstore hset hsetnx hmset hincrby incrby decrby getset mset msetnx exec sort

  • maxmemory-samples:LRU, LFU and minimal TTL算法都不是很精确,二是近似算法(为了节省内存),因此可以调整它的速度或精度;例如:默认Redis会检查5个key然后取最近最少使用的那个。

  可以通过maxmemory-samples进行设置样本数,默认值5是比较合适的值,10非常接近真实的LRU,但消耗更多的CPU,3更快,但不太准确。

  • replica-ignore-maxmemory:是否开启replica的最大内存

不爱那么多,只爱一点点,别人眉来又眼去,我只偷看你一眼。 ——李敖

11.LAZY FREEING

  Redis 有两种原语删除keys:一种是用DEL命令对object的阻塞(同步)删除, 同步删除意味着删除过程中服务端会停止处理新命令,以便以同步方式回收与object关联的所有内存; 如果删除的 key 与一个小的 object 相关联,则执行DEL命令所需的时间非常短,与Redis中的大多数其他O(1)或O(log_N)命令相当; 若要删除的 key 管理了一个很大的 object,但是,如果key与包含数百万个元素的聚合值关联,则服务器可以阻塞很长时间(甚至几秒钟)以完成操作。

  基于上述原因,Redis还提供了UNLINK(非阻塞DEL)等非阻塞删除原语以及FLUSHALL和FLUSHDB命令的异步选项,以便在后台回收内存;这些命令在固定时间内执行,另一个线程将尽可能快的从后台尽快回收内存。

  DEL,UNLINK 以及用于FLUSHALL和FLUSHDB的 ASYNC 选项由用户控制。 这取决于应用程序的设计,用户可以按需选择使用阻塞或者非阻塞的方式;然而因为其他操作的副作用,Redis服务器有时不得不删除keys或flush整个数据库,具体来说,Redis在以下场景中独立于用户调用删除对象:

  1)在逐出时:由于maxmemory和maxmemory策略配置,为了在不超过指定内存限制的情况下为新数据腾出空间;
  2)因为数据过期配置:必须从内存中删除具有相关生存时间的key(参阅expire命令);
  3)因为命令的副作用,该命令将数据存储在ma已经存在的key上,例如,RENAME命令会删除旧的key内容当它被另一个key内容替换时,类似地,SUNIONSTORE或SORT with STORE选项会删除现有key,SET命令本身删除指定键的任何旧内容,以便用指定字符串替换它;
  4)在复制过程中,当replica与其主服务器执行全量同步时,将删除整个数据库的内容以便加载刚刚传输过来的RDB文件。

  在上述所有情况下,默认情况是以阻塞的方式删除对象,就像调用DEL一样;但是,可以使用以下配置指令,具体配置每种情况,以非阻塞方式释放内存,如调用UNLINK:

  • lazyfree-lazy-eviction:内存满时逐出,默认值no;
  • lazyfree-lazy-expire:删除过期key,默认值no;
  • lazyfree-lazy-server-del:内部删除,比如rename oldkey newkey时,如果newkey存在需要删除newkey,默认值no;
  • replica-lazy-flush:接收完RDB文件后清空数据选项,默认值no。

12.APPEND ONLY MODE

  默认情况下,Redis在磁盘上异步转储数据集,这种模式在许多应用程序中已经足够好了,但是Redis进程的问题或断电可能会导致几分钟的写操作丢失(取决于配置的保存点)。

  Append Only File是一种更好的持久化方式,例如,使用默认的数据fsync策略(请参阅配置文件的后面部分),Redis在断电等意外情况只会丢失最多一秒的写入数据,在系统正常运行而 Redis 进程出错(如崩溃)的情况下只会丢掉最近一次写操作。

  可以同时启用AOF和RDB持久化方案,而不会出现问题。如果启用了AOF,Redis将在启动阶段自动加载AOF文件,该方式提供更好的持久化保证,更多详情可参阅http://redis.io/topics/persistence。

  APPEND ONLY MODE涉及的参数如下:

  • appendonly:是否开启AOF,默认no;
  • appendfilename:定义AOF文件名,默认为"appendonly.aof";
  • appendfsync:数据同步模式,默认值是“everysec”,是在速度和数据安全的两者寻求平衡的折中模式。

  fsync()调用告诉操作系统将数据写入磁盘而不是等更多的数据进入输出缓冲区,某些操作系统会真的马上flush数据到磁盘上,而某些操作系统将尝试尽快这样做,Redis支持三种不同的模式:

no:不调用fsync,让操作系统决定什么时候写数据到磁盘,比较快;
always:每次对append only log写入后进行fsync,速度慢,但是最安全。
everysec:每秒钟只同步一次,比较折中的模式,如果不确定,使用“everysec”。

  • no-appendfsync-on-rewrite:如果对延迟要求很高的应用,这个字段可以设置为yes,否则还是设置为no,从持久化的角度来看,这是最安全的选择;设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes。

  当AOF fsync策略设置为always或everysec,并且后台保存进程(后台保存或AOF日志后台重写)正在对磁盘执行大量I/O时,在某些Linux配置中,Redis可能会在fsync()调用上阻塞太长时间。请注意,目前还没有对此进行修复,因为即使在不同的线程中执行fsync,也会阻止同步写入调用。为了缓解这个问题,可以使用该选项,防止在BGSAVE或bgrowriteaof正在进行时在主进程中调用fsync()。这意味着当另一个子进程在保存时,Redis的持久性是与“appendfsync none”相同。实际上,这意味着在最坏的情况下(使用默认的Linux设置),可能会丢失长达30秒的日志。

  • auto-aof-rewrite-percentage 100、auto-aof-rewrite-min-size 64mb:AOF自动重写配置,默认值为100;设置允许重写的最小AOF文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写。

  自动重写AOF文件,如果AOF日志文件增大到指定百分比,Redis能够通过BGREWRITEAOF自动重写AOF日志文件。

  工作原理:Redis记住上次重写时AOF文件的大小(如果重启后还没有重写操作,就直接用启动时的AOF大小)比较基础大小与当前大小,如果当前大小超过基础大小的比例达到指定百分比,就会触发重写操作,指定百分比为0会禁用AOF自动重写特性。

  • aof-load-truncated:Redis在以AOF方式恢复数据时,对最后一条可能出问题的指令的处理方式,默认值yes。

  在Redis启动过程中,当AOF数据被加载回内存时,可能会发现AOF文件在末尾被截断,这可能是因为Redis运行的系统宕机了,特别是当ext4文件系统没有在data=ordered选项的情况下挂载时(但是,当Redis本身崩溃或中止但操作系统仍然正常工作时,这种情况不会发生)。
  Redis可以在发生这种情况时终止进程,或者加载AOF文件中尽可能多的数据(目前的默认值),如果发现AOF文件在结尾处被截断,则可以启动。以下选项控制此行为。

yes:则加载截断的AOF文件,Redis服务器开始发出日志来通知用户事件;否则,如果将该选项设置为“no”,服务器将因错误而中止并拒绝启动。
no:用户需要在重新启动服务器之前使用“redis check AOF”实用程序修复AOF文件。请注意,如果在中间发现AOF文件已损坏,则服务端因错误终止进程并拒绝启动,此选项仅适用于Redis试图从AOF文件读取更多数据但找不到足够字节的情况。

  • aof-use-rdb-preamble:当重写AOF文件时,Redis能够在AOF文件中使用RDB前导码,以便更快地重写和恢复,启用此选项时,重写的AOF文件由两个不同的节组成:[RDB file][AOF tail],当加载AOF文件时,Redis通过以 “REDIS” 字符串开头的 AOF 文件识别出此文件是由RDB和AOF组合而成的,Redis会先加载 RDB 部分,然后再加载AOF部分,默认值yes。

13.LUA SCRIPTING

  lua-time-limit:Lua脚本的最长执行时间(毫秒),默认5000ms,如果达到最大执行时间,Redis将记录脚本在允许的最大时间之后仍在执行中,并返回错误信息。当长时间运行的脚本超过最大执行时间时,只有脚本KILL和SHUTDOWN NOSAVE命令可用,KILL用于停止尚未调用write命令的脚本;SHUTDOWN NOSAVE在脚本已经发出写命令但用户不希望等待脚本自然终止的情况下关闭服务器的唯一方法。该参数为0或负值,以便在没有警告的情况下无限执行。

14.REDIS CLUSTER

  REDIS CLUSTER涉及的参数:

  • cluster-enabled:开启redis集群,默认no。
  • cluster-config-file:指定Redis集群配置文件名,每个群集节点都有一个群集配置文件,持久化保存集群的信息,它由Redis节点自动创建和更新,确保同一系统中运行的各Redis实例该配置文件不要重名,默认文件名nodes-6379.conf。
  • cluster-node-timeout:集群节点连接超时设置(单位:毫秒),默认15000。
  • cluster-replica-validity-factor: 集群replica有效因子,默认配置值为10,如果该项设置为0,不管replica节点和Master节点间失联多久都会一直尝试failover。

  在进行故障转移的时候,所有的replica节点都会请求申请为master,但是有些replica节点可能与master断开连接一段时间了, 导致数据过于陈旧,这样的replica节点不应该被提升为master,该参数就是用来判断replica节点与master断开连接的时间是否过长。

判断方法是:比较replica节点断开连接的时间与(node-timeout * slave-validity-factor) + repl-ping-slave-period ,如果replica节点超时时间为30秒,并且slave-validity-factor为10,假设默认的repl-ping-slave-period是10秒,即如果超过310秒replica节点将不会尝试进行故障转移。
较大的slave-validity-factor值可能允许包含过旧数据的replica节点成为master,同时较小的值可能会阻止集群选举出新master。为了达到最大限度的高可用性,可以设置为0,即replica节点不管和master失联多久都可以提升为master。

  • cluster-migration-barrier:通常反映集群中每个master节点所需的replicas节点数量,master的replica数量大于该给定值,replica才能提升为master,如这个参数若被设为2,那么只有当一个master节点拥有2个可工作的从节点时,它的一个从节点才会尝试提升,默认为1(即该集群至少有3个节点,1 master+2 replicas,master宕机,仍有另外1个replica的情况下其中1个replica可以提升),测试环境可设置为0,生成环境中至少设置为1。
  • cluster-require-full-coverage:默认情况下,如果Redis集群节点检测到至少有一个hash slot不可用(没有可用的节点为其提供服务),集群将停止查询数据。这样,如果集群部分关闭(例如不再覆盖一系列散列槽),那么所有集群最终都将不可用,如果所有slot恢复则集群自动恢复。如果需要集群部分可用情况下仍可提供查询服务,设置为no。

注意:不建议打开该配置,这样会造成分区的时候,小分区的master一直在接受写请求,会造成很长时间数据不一致。

  • cluster-replica-no-failover:选项设置为yes时,会阻止replicas尝试对其master在主故障期间进行failover,但是强制情况下,master仍然可以执行手动故障转移。这在类似多个数据中心操作的情况下适用,比如在整个DC故障的情况下不希望其中一方被提升。

15.CLUSTER DOCKER/NAT support

  在某些部署中,Redis集群节点地址发现失败,因为地址是NAT-ted或端口是转发的(典型的情况是Docker和其他容器),为了使Redis集群在这样的环境中工作,需要一个静态配置,其中每个节点都知道其公共地址。

  默认情况下,Redis会自动检测自己的IP和从配置中获取绑定的PORT,告诉客户端或者是其他节点。而在Docker环境中,如果使用的不是host网络模式,在容器内部的IP和PORT都是隔离的,那么客户端和其他节点无法通过节点公布的IP和PORT建立连接。如果开启以下配置,Redis节点会将配置中的这些IP和PORT告知客户端或其他节点,而这些IP和PORT是通过Docker转发到容器内的临时IP和PORT的。

例如:

  • cluster-announce-ip 10.1.1.5
  • cluster-announce-port 6379
  • cluster-announce-bus-port 6380

16.SLOW LOG

  Redis Slow Log存于内存中,记录超过指定执行时间的命令,执行时间不包括与client连接、发送应答等I/O操作,而只是实际执行命令所需的时间(这是命令执行的唯一阶段,线程被阻塞,不能同时服务于其他请求)。

  • slowlog-log-slower-than 10000:执行时间超过该值时记录到慢日志中,单位是微妙,注意,负数将禁用慢日志,而值为0将强制记录每个命令;
  • slowlog-max-len 128:慢查询日志长度,当一个新的命令被写进日志的时候,最旧的那个记录会被删掉,这个长度没有限制,只是要注意它会消耗内存,可以使用slow log RESET回收慢日志使用的内存。

17.LATENCY MONITOR

  latency-monitor-threshold 0:延迟监控功能是用来监控Redis中执行比较缓慢的一些操作,用LATENCY打印Redis实例在跑命令时的耗时图表,只记录大于等于延迟监视器阈值设置的值的操作,Redis延迟监视子系统在运行时对不同的操作进行采样,以便收集与Redis实例的可能延迟源相关的数据。

  默认情况下,延迟监视是禁用的,可以通过“CONFIG SET Latency monitor threshold”轻松启用延迟监视,因为如果没有延迟问题,则通常不需要它,而且收集数据会对性能产生影响,虽然影响很小,但可以在大负载下测量。

18.EVENT NOTIFICATION

  notify-keyspace-events “”:键空间通知使得客户端可以通过订阅频道或模式,来接收那些以某种方式改动了 Redis 数据集的事件。因为开启键空间通知功能需要消耗一些 CPU ,所以在默认配置下,该功能处于关闭状态。

  例如,如果启用了keyspace事件通知,并且客户端对存储在数据库0中的键“foo”执行DEL操作,则将通过Pub/Sub发布两条消息:
PUBLISH keyspace@0:foo del
PUBLISH keyevent@0:del foo
可以在一组类中选择Redis将通知的事件,每个类都由一个字符标识:
K:键空间事件,以“Keyspace@”前缀发布。
E: Keyevent事件,以“Keyevent@”前缀发布。
g:通用命令(非特定类型),如DEL、EXPIRE、RENAME…
$:String命令
l:列出命令
S:集合命令
h:哈希命令
z:排序集合命令
x:过期事件(每次密钥过期时生成的事件)
e:退出事件(为maxmemory退出密钥时生成的事件)
A:g$lshzxe的别名,因此“AKE”字符串表示所有事件。

“notify keyspace events”将零个或多个字符组成的字符串作为参数,空字符串表示通知被禁用。
示例:要启用列表和泛型事件,请从事件名称的角度使用:
notify-keyspace-events Elg

19.ADVANCED CONFIG

  当哈希有少量的条目,并且最大的条目不超过给定的阈值时,使用内存高效的数据结构对其进行编码,可以使用以下指令配置这些阈值:

  • hash-max-ziplist-entries 512、hash-max-ziplist-value 64:当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)同时所有值都小于hash-max-ziplist-value配置(默认64个字节)时,Redis会使用ziplist作为哈希的内部实现。即表示当hash项(field,value)数>512即ziplist项>1024的时候转为dict,表示当hash中的value长度超过64的时候转为dict。
  • list-max-ziplist-size -2:列表也以一种特殊的方式进行编码,以保存空间每个内部列表节点允许的条目数可以指定为固定的最大大小或最大元素数。

  当取正值的时候,表示按照数据项个数来限定每个quicklist节点上的ziplist长度,比如,当这个参数配置成5的时候,表示每个quicklist节点的ziplist最多包含5个数据项。

  当取负值的时候,表示按照占用字节数来限定每个quicklist节点上的ziplist长度,这时,它只能取-1到-5这五个值,每个值含义如下:
*-5: 每个quicklist节点上的ziplist大小不能超过64 Kb;(注:1kb => 1024 bytes)
-4: 每个quicklist节点上的ziplist大小不能超过32 Kb;
-3: 每个quicklist节点上的ziplist大小不能超过16 Kb;
-2: 每个quicklist节点上的ziplist大小不能超过8 Kb;(-2是Redis给出的默认值)
-1: 每个quicklist节点上的ziplist大小不能超过4 Kb。
正数意味着每一个列表节点存储的元素数量要精确到这个数量,最高性能的选项通常是-2(8kb大小)或-1(4kb大小)。

  • list-compress-depth 0:这个参数表示一个quicklist两端不被压缩的节点个数,这里的节点个数是指quicklist双向链表的节点个数,而不是指ziplist里面的数据项个数。实际上,一个quicklist节点上的ziplist,如果被压缩,就是整体被压缩的。
    参数list-compress-depth的取值含义如下:
    0: 是个特殊值,表示都不压缩,这是Redis的默认值。
    1: 表示quicklist两端各有1个节点不压缩,中间的节点压缩。
    2: 表示quicklist两端各有2个节点不压缩,中间的节点压缩。
    3: 表示quicklist两端各有3个节点不压缩,中间的节点压缩。
    依此类推…由于0是个特殊值,很容易看出quicklist的头节点和尾节点总是不被压缩的,以便于在表的两端进行快速存取。
  • set-max-intset-entries 512:集合只有一种特殊的编码方式:当集合被组合时刚好是十进制64位有符号整形数字的字符串,以下配置设置set集大小的限制,以便使用此特殊的内存保存编码。
  • zset-max-ziplist-entries 128、zset-max-ziplist-value 64:与hash和list类似,经过排序的集也经过特殊编码,有序集合也可以用一种特别的编码方式来节省大量空间,这种编码只适合长度和元素都小于改参数限制的有序集合。
  • hll-sparse-max-bytes 3000:HyperLogLog稀疏数据结构表示字节数限制,限制包括16字节的头,小于等于hll-sparse-max-bytes使用稀疏数据结构(sparse),大于hll-sparse-max-bytes使用稠密的数据结构(dense);大于16000的值是完全无用的,因为在这一点上,密集表示更节省内存,建议值为~3000,以便具有的内存好处, 减少内存的消耗。如果不考虑CPU,但空间要求较高,并且数据集由许多基数在0-15000范围内的HyperLogLog组成,则该值可以提高到~10000。
  • stream-node-max-bytes 4096、stream-node-max-entries 100:Streams宏节点最大大小/项,流数据结构是对内部多个项进行编码的大节点的基树。使用此配置,可以配置单个节点的大小(字节),以及在附加新流条目时切换到新节点之前可能包含的最大项目数。如果将以下任何设置设置为0,则会忽略该限制,因此,例如,可以通过将max bytes设置为0,将max entries设置为所需值,从而仅设置max entires限制。
  • activerehashing yes:Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。当实际使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no;如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存。
  • client-output-buffer-limit normal 0 0 0:对客户端输出缓冲进行限制可以强迫那些不从服务器读取数据的客户端断开连接,用来强制关闭传输缓慢的客户端。对于normal client,第一个0表示取消hard limit,第二个0和第三个0表示取消soft limit,normal client默认取消限制,因为如果没有寻问,是不会接收数据的。
  • client-output-buffer-limit replica 256mb 64mb 60:对于slave client和MONITER client,如果client-output-buffer一旦超过256mb,又或者超过64mb持续60秒,那么服务器就会立即断开客户端连接。
  • client-output-buffer-limit pubsub 32mb 8mb 60:对于pubsub client,如果client-output-buffer一旦超过32mb,又或者超过8mb持续60秒,那么服务器就会立即断开客户端连接。
  • client-query-buffer-limit 1gb:客户端查询缓冲区累积新命令,默认情况下,它们被限制在一个固定的数量,以避免协议不同步导致客户端查询缓冲区中未绑定的内存使用量的错误。但是,如果有非常特殊的需求,比如巨大的multi/exec请求或类似的请求,可以在这里配置它。
  • proto-max-bulk-len 512mb:在Redis协议中,批量请求(即表示单个字符串的元素)通常被限制为512 MB。
  • hz 10:Redis调用一个内部函数来执行许多后台任务,比如在超时时关闭客户端的连接,清除从未请求过的过期key,等等。并非所有任务都以相同的频率执行,但Redis会根据指定的“hz”值检查要执行的任务。

  默认情况下,“hz”设置为10;当Redis空闲时,提高这个值将使用更多的CPU,但同时当有许多key同时过期时,Redis将更具响应性,并且可以更精确地处理超时。范围在1到500之间,但是值超过100通常不是一个好主意,大多数用户应该使用默认值10,并且仅在需要非常低延迟的环境中才将此值提高到100。

  • dynamic-hz yes:开启动态HZ,同时到期会使Redis的反应更灵敏,以及超时可以更精确地处理当启用动态HZ时,当启用动态HZ时,实际配置的HZ将用作作为基线,但是一旦连接了更多的客户机,实际上将根据需要使用配置的HZ值的倍数,这样一个闲置的实例将占用的CPU时间很少,而繁忙的实例响应更为迅速。
  • aof-rewrite-incremental-fsync yes:当一个子对象重写AOF文件时,如果启用了该参数,则每生成32MB的数据就会对该文件进行fsync,这有利于把文件写入磁盘,可以避免过大的延迟峰值。
  • rdb-save-incremental-fsync yes:当Redis保存RDB文件时,如果启用该参数,每生成32MB数据,文件将被fsync-ed,以便以增量方式将文件提交到磁盘并避免大延迟峰值。
  • lfu-log-factor 10:概率因子,可以调整计数器counter的增长速度,lfu-log-factor越大,counter增长的越慢。
  • lfu-decay-time 1:衰减因子,是一个以分钟为单位的数值,可以调整counter的减少速度,lfu衰减时间的默认值为1,特殊值为0意味着每次扫描计数器时都会使其衰减。

20.ACTIVE DEFRAGMENTATION

  该部分功能还是试验性的,但也是基于一定的stress测试和人工手动测试。

  活动碎片整理:活动(联机)碎片整理允许Redis服务器压缩内存中少量数据分配和释放之间的剩余空间,从而允许回收内存。碎片化是一个自然的过程,它发生在每个分配器和某些工作负载上,通常需要重新启动服务器以降低碎片,或者至少刷新掉所有数据并重新创建它。但是,由于Oran Agra for Redis 4.0实现了这个特性,这个过程可以在服务器运行时以“hot”方式实施。
   基本上,当碎片超过某个级别(见下面的配置选项)时,Redis将开始通过利用某些特定的Jemalloc特性(为了了解分配是否导致碎片并将其分配到更好的位置)在相邻的内存区域中创建值的新副本,同时,将发布旧的数据副本。对所有键递增地重复此过程将导致碎片回落到正常值。
   需要了解的重要事项:此功能在默认情况下是禁用的,并且仅当编译Redis使用Jemalloc的副本时才起作用,Jemalloc的源代码是Redis这个是Linux版本的默认设置;如果没有碎片问题,则不需要启用此功能;一旦遇到碎片,可以在需要时使用命令“CONFIG SET activedefrag yes”启用此功能。

  涉及的参数:

  • activedefrag yes:启用主动碎片整理;
  • active-defrag-ignore-bytes 100mb:启动活动碎片整理的最小碎片;
  • active-defrag-threshold-lower 10:启动碎片整理的最小碎片百分比;
  • active-defrag-threshold-upper 100:使用最大消耗时的最大碎片百分比;
  • active-defrag-cycle-min 5:在CPU百分比中进行碎片整理的最小消耗;
  • active-defrag-cycle-max 75:磁盘碎片整理的最大消耗;
  • active-defrag-max-scan-fields 1000:将从主字典扫描处理的set/hash/zset/list字段的最大数目。

这配置文件……终于翻完了!!!太难了!!!转载请标来处!!!眼睛都要码瞎了,o(╥﹏╥)o

“你瞧,世界上就是有一千个我,这一千个我终还是抱着你!”—金庸

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章