Redis配置文件参数说明

## 头部 说明内存单位,大小写不敏感 ``` # 1k => 1000 bytes # 1kb => 1024 bytes # 1m => 1000000 bytes # 1mb => 1024*1024 bytes # 1g => 1000000000 bytes # 1gb => 1024*1024*1024 bytes ``` ## Includes 引入其他配置文件,如果使用想使用,引入的配置文件,该项需要写在配置文件的末位,否则将会覆盖掉引入文件内的配置。 ``` include /path/to/local.conf .... ``` ## Modules 启动时加载模块,如果server加载模块失败,会终端加载操作。通过`loadmodule`配置引入自定义模块来新增一些功能。 ``` loadmodule /path/to/my_module.so ... ``` ## Network ``` bind: 127.0.0.1 port:6379 timeout:0 tcp-keepalive:300 ``` bind -> 绑定redis服务器网卡IP,默认为127.0.0.1,即本地回环地址,这样只能本机客户端连接Redis,若为空,则可接受所有来自网络的接口的链接。 port-> 指定redis运行的端口,默认为6379,由于Redis是单线程模式,所有单机开多个Redis需要修改端口。 timeout-> 设置客户端连接超时时间,单位为秒。当客户端在这段时间没没有发出任何指定,则视为关闭该链接。默认值为0,表示不关闭。 tcp-keepalive-> 单位为秒,表示将周期性的使用SO_KEEPALIVE检查客户端是否还处于健康状态,避免服务器一直阻塞,官方给出的建议值是300s.如果设置为0,则不会周期性的检测。 ## General ``` daemonize no pidfile /var/../../ loglevel notice logfile "" syslog-enabled no syslog-ident redis syslog-facility local0 crash-log-enabled no crash-memcheck-enabled no database 16 ``` daemonize -> 设置为yes,表示指定Redis以守护进程的方式启动,默认为no. pidfile -> 配置PID文件路径,当redis作为守护进程的时候,它会把pid默认写到`/var/redis/redis_6379.pid`文件里面 loglevel -> 定义日志级别,默认为notice,共有4个值,如下: - debug - 记录大量日志信息,适用于开发,测试极端 - verbose - 较多日志信息 - notice - 矢量日志信息,适用于生产环境光 - warning - 仅有部分重要、关键信息会被记录 logfile -> 配置log文件地址,默认打印在命令行终端的窗口。 databases -> 设置数据库的数目,默认的数据库是DB0,可以在每个链接上使用selelct<dbid>命令选择一个不同的数据库,dbid是一个介于0到datavases-1之间的数。默认值是16,也就是说,Redis有16个数据库。 ## Snapshotting 这里的配置主要用来做持久化操作 ``` save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes dbfilename dump.rdb rdb-del-sysnc-files no dir ./ ``` save -> 这里是用来配置触发Redis持久化条件,也就是什么时候将内存中的数据保存到硬盘。入上为默认配置。 stop-writes-no-bgsave-error -> 默认值为yes,当启用了RDB且最后一次后台保存数据失败,Redis是否停止接受数据。这会让用户意识到数据没有正确持久化到硬盘上,否则没人会注意到灾难发生。如果Redis重启了,那么可以重新接受数据了 rdbcompression -> 默认值是yes,对于存储到磁盘中的快照,可以设置是否进行压缩存储,如果是的话,redis会采用LZF算法进行压缩,如果你想小孩CPU进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。 rdbchecksum -> 默认值是yes,在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做回增大约10%的性能消耗,如果希望获得最大的性能提升,可以关闭此功能。 dbfilename -> 设置快照的名称,默认为`dump.rdb` dir -> 设置快照文件的存放路径,这个配置项一定是一个目录,而不是文件名,使用上面的dbfilename作为保存的文件名。 ## Replication Redis 是高可用的,需要保证服务器不能中断,因此Redis提供了主从库模式,将一份数据保存到多个实例上。用于分担压力的同时,当master挂掉后,其他实例可以继续提供服务。因此我们需要考虑的是,如何保证多个实例之间数据的一致性,同时当master挂掉后,怎么样选举一个新的master。 ``` slave-serve-stale-data yes replicaof <masterip> <masterport> masterauth <master-password> replica-server-stale-data yes replica-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-diskless-load disabled repl-ping-replica-period 10 repl-timeout 60 repl-disable-tcp-nodelay no repl-backlog-size 1mb repl-backlog-ttl 3600 replica-priority 100 min-replicas-to-write 3 min-replicas-max-lag 10 ``` masterauth -> 访问主节点时的密码,每个节点的密码尽量一样,因为创建集群时,你也不知道谁是主谁是从。 slave-serve-stale-data -> 默认值为yes, 当一个slave与master失去联系,或者复制正在进行时,slave可能会有量中表现: - 如果为yes, slave仍然会应答客户端的请求,但返回的数据可能是过时,或者数据可能是空的在第一次同步的时候。 - 如果为no,在你执行info he salveof之外的其他命令时,slave都将返回一个"SYNC with master in progress"的错误。 slave-read-only -> 配置Redis的slave实例是否接受写操作,即slave是否为只读Redis,默认值为yes. repl-diskless-sync -> 主从数据复制是否使用无硬盘复制功能,默认为no. repl-diskless-sync-delay -> 当启用无硬盘备份,服务器等待一段时间后才会通过套接字向从站传送RBD文件,这个等待时间是可配置的,这一点很重要,因为一旦开始传送,就不可能再为一个新到达的从站服务,从站则要排队等待下一次RDB传送,因此服务器等待一段时间以期待更多的从站到达,延迟时间单位为秒,默认为5,要关掉这一功能,只需要将其设置为0.传送会立即开始。 repl-diskless-tcp-nodelay -> 同步之后是否禁用从站上的TCP——Nodelay如果选择YES,redis会使用较少量的TCP包和宽带想从站发送数据。但这会导致在从站增加一点数据的延时。Linux内核默认配置情况下最多40ms的延时,如果选择No,从站的数据延时不会那么多,但备份需要的宽度相对较多,默认情况下我们将潜在因素优化,但在高负载情况下,或者再主从站都跳的情况下,把他切换为YES是个好主意,默认值为NO。 ## Security requirepass -> 设置连接是的密码 rename-command -> 命令重命名,对于一些危险命令例如: - flushdb 清空数据库 - flushall 清空所有记录 - config 客户端连接后可配置服务器 - keys 客户端连接后可查看所有存在的key 作为服务端redis-sver,常常需要禁用以上命令来是的服务器更加安全,禁用的具体做法如下: ``` rename-command FLUSHALL "" ``` 也可以保留命令,但是不能轻易使用,重命名这个命令个即可。 ``` rename-command FLUSHALL asdfggh ``` 这样重启服务器后,则需要使用新命令来执行操作,否则服务器会报错,unknown command。 requirepass -> 设置redis连接密码。 如: requirepass 123 表示设置redis连接密码为123. ## Clients maxclients -> 设置客户端最大并发连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件,描述符-32.redis server自身会使用一些。如果设置maxclients为0表示不做限制,当客户端连接数到达限制时,Redis会关闭新的连接并像客户端返回,`max number of clients reached` 错误信息 ## Memory Management maxmemory -> 设置Redis的最大内存,若为0,表示不限制,通常配合maxmemory-policy参数一起使用 maxmemory-policy -> 当内存使用达到maxmemory设置的最大值时,redis使用的内存清楚策略,有以下几种可以选择 - volatile-lru 利用LRU算法移除设置过过期时间的key(LRU:最近使用 Least Recently Used) - allkeys-lru 利用LRU算法移除和人key - volatile-random 移除设置过过期时间的随机key - allkeys-random 移除随机key - volatile-ttl 移除即将过期的key(minor TTL) - noeviction noeviction 不移除任何key,只是返回一个写错误,默认选项。 maxmemory-samples -> LRU 和minimal TTL算法都不是精准的算法,但是相对精确的算法(为了节省内存),随意你可以选择样本大小进行检验,redis默认选择3个样本进行检验,你可以通过maxmemory-samples进行设置样本数。 ## Append Only Mode appendonly - > 默认Redis使用的是RDB方式持久化,这种方式在许多应用中已经足够了,但是Redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File 是另一种持计划方式,可以提供更好的出就花特性,Redis会把每次写入的数据在接收后都写入appendonly.aof文件,每次启动redis时,都会先把这个文件的数据读到内存里,先忽略RDB文件,默认为NO。 appendfilename -> aof文件名,默认是appendonly.aof appendsync -> aof持久化策略的配置, - no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快。 - always表示每次写入都执行fsync,以保证数据同步到磁盘。 - everysec表示每秒执行一次fsync,可能会导致丢失这样1s的数据。 no-appendfsnc-on-rewrite -> 在aof重写或者写入RDB文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,执行fsync会造成阻塞时间过长,no-appendfsync-on-rewrite字段设置为no,如果延迟要求很高的应用,这个字段可以设置为yes,否则还是设置为no,这样对持久化特性来说是更安全的选择,设置为也是rewrite期间对新鞋操作不fsync,暂时存在内存中。等rewrite完成后再写入,默认为no。建议yes.Linux的默认fsync策略是30秒,可能会丢失30秒的数据,默认为no。 auto-aof-rewrite-percentage -> 默认值100,aof自动重写配置,当目前aof文件大小超过上次重写文件大小的百分之多少后进行重写,即当aof文件增长到一定大小的时候,Redis能够调用bgrewriteaof对日志文件进行重写。当前aof文件大小,是上次日志重写得到的AOF文件大小的二倍时,自动启动新的日志重写过程。 auto-aof-rewrite-min-size -> 64mb.设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写。 aof-load-truncated -> aof文件可能在尾部是不完整的。当Redis启动的时候,aof文件的数据被载入内存,重启可能发生在redis所在的主句操作系统宕机后,尤其在ext4文件系统没有加上data=ordered选项。出现这种现象redis宕机或者异常终止不会造成尾部不完整现象,可以选择redis退出,或者导入尽可能多的数据,如果选择的是yes。当阶段的aof文件呗导入的时候,会自动打不一个log给客户端然后load,如果是no,用户必须手动redis-check-aof修复AOF文件才可以,默认值为yes. aof-use-rdb-preamble -> 混合持久化,RDB是全量内存数据的复制,频繁生成RDB文件会对性能造成很大影响,发生宕机影响分钟级的数据。但是文件较小,加载较快;AOF是写操作日志,一秒一次落盘的操作对性能影响不大,发生宕机之多会影响秒级的数据,但是如果只使用AOF,会导致日志文件太大,需要重写AOF ,因此可以将两者结合起来,两次RDB快照中间的数据,使用AOF日志保存,这样既保证了数据不丢失,也提高了性能。 ## LUA Scripting lua-time-limit -> 一个lua脚本罪行的最大时间,单位为ms,默认值为5000. ## Redis Cluster cluster-enabled -> 集群开关,默认是不开启集群模式。 cluster-config-file -> 集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息,这个文件不需要手动配置,这个配置文件有Redis生成并更新,每个Redis集群节点需要一个单独的配置文件,请确保与实例运行的系统中配置文件名称不冲突,默认配置为nodes-6379.conf. cluster-node-timeout -> 可以配置值为15000.节点互联超时的阈值。集群节点超时毫秒数。 cluster-slave-validity-factor -> 可以配置值为10.在进行故障转移的时候,全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间,导致数据过于陈旧,这样的slave不应该被提升为master,该参数就是用来判断slave节点与master断线的时间是否过长,判断方法是,比较slave断开连接的时间和(node-timeout * slave-validity-factor) + repl-ping-slave-period 如果节点超时间时间为30s.并且slave-validity-factor为10,假设默认的repl-ping-slave-period是10s,即如果超市310秒slave,将不会尝试进行故障转移。 cluster-migration-barrier -> 可配置值为1,master的slave数量大于该值,slave才能迁移到其他孤立master上,如果这个参数若呗设置为2,那么只有当一个主节点拥有2个可工作的节点时,它的一个从节点会尝试迁移。 cluster-require-full-coverage -> 默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务,设置为no,可以在slot没有全部分配的时候提供服务。不建议打开该配置,这样会造成分区的时候,小分区的master一直在接收写请求,而造成很长时间的数据不一致。