Redis的配置文件redis.conf详解
Redis的配置文件位于redis的安装目录下,一般不要直接操作出厂设置的配置文件,需要对其进行备份。# Redis的配置文件样例:
# Redis configuration file example.#
# 请注意,为了读取到配置文件,Redis必须文件路径作为第一个参数来启动: # # ./redis-server /path/to/redis.conf
# 关于单位的一些注意事项:
# 对大小写不敏感 # Note on units: when memory size is needed, it is possible to specify # it in the usual form of 1k 5GB 4M and so forth: # # 1k => 1000 bytes # 1kb => 1024 bytes # 1m => 1000000 bytes # 1mb => 1024*1024 bytes # 1g => 1000000000 bytes # 1gb => 1024*1024*1024 bytes # # units are case insensitive so 1GB 1Gb 1gB are all the same.
1.INCLUDE部分:
################################## INCLUDES ################################### # 在配置多个服务器时很有用,比如,多个服务器的很多个配置项是相同的,但是少部分配 # 置又要不相同,例如:bind等配置,这时可以将相同的配置抽取出来,作为一个单独文件. # 其他配置项根据不同的服务器做不同的配置,最后通过include引用;如果include放在文件 # 的开头,那么redis.conf的配置会覆盖引入文件中的配置,所以如果想要使用引入文件中的配置 # 可以将include放在最后 # include /path/to/local.conf # include /path/to/other.conf
2.MODULES部分:
################################## MODULES ##################################### # Load modules at startup. If the server is not able to load modules # it will abort. It is possible to use multiple loadmodule directives. # # loadmodule /path/to/my_module.so # loadmodule /path/to/other_module.so
NETWORK部分:
################################## NETWORK ######################################
# 默认情况下,如果未指定“ bind”配置指令,则Redis监听服务器上所有可用网络接口的连接。
# 可以使用“ bind”配置指令侦听一个或多个选定接口,然后侦听一个 或更多IP地址 # Examples: # # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 # # ~~~ WARNING ~~~
# 如果运行Redis的电脑直接暴露在互联网中,那么就会将实例暴露给所有人,这是很危险的。
# 指定 redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求 bind 127.0.0.1 # Protected mode is a layer of security protection, in order to avoid that # Redis instances left open on the internet are accessed and exploited. # # 当开启保护模式时,即使没有绑定任何IP,也没有配置密码,Redis仍然只接受本机的访问 # # The server only accepts connections from clients connecting from the # IPv4 and IPv6 loopback addresses 127.0.0.1 and ::1, and from Unix domain # sockets. # # By default protected mode is enabled. You should disable it only if # you are sure you want clients from other hosts to connect to Redis # even if no authentication is configured, nor a specific set of interfaces
# are explicitly listed using the "bind" directive. protected-mode yes # redis监听的端口号。 port 6379
# 此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度,
# 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值
# 默认是511,而Linux的默认参数值是128。
# 当系统并发量大并且客户端速度缓慢的时候,可以将这二个参数一起参考设定。
# 该内核参数默认值一般是128,对于负载很大的服务程序来说大大的不够。
# 一般会将它修改为2048或者更大。
# 在/etc/sysctl.conf中添加:net.core.somaxconn = 2048,
# 然后在终端中执行sysctl -p。
tcp-backlog 511
# 配置unix socket来让redis支持监听本地连接。
# unixsocket /var/run/redis/redis.sock
# 配置unix socket使用文件的权限 # unixsocketperm 700 # 此参数为设置客户端空闲超过timeout,服务端会断开连接,为0则服务端不会主动断开连接,不能小于0。 timeout 0
# tcp keepalive参数。如果设置不为0,就使用配置的SO_KEEPALIVE值,使用keepalive有两个好处:检测挂掉的对端。降低中间设备出问题而
# 导致网络看似连接却已经与对端端口的问题。
# 在Linux内核中,设置了keepalive,redis会定时给对端发送ack。检测到对端关闭需要两倍的设置值。
# 此选项的合理值是300秒,这是从Redis 3.2.1开始的新Redis默认值
tcp-keepalive 300
GENERAL部分:
################################# GENERAL #####################################
# 默认情况下,Redis不会作为守护程序运行。 如果需要,请使用“yes”。
# 请注意,Redis守护进程将在/var/run/redis.pid中写入一个pid文件
daemonize yes
# If you run Redis from upstart or systemd, Redis can interact with your # supervision tree. Options: # supervised no - no supervision interaction # supervised upstart - signal upstart by putting Redis into SIGSTOP mode # supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET # supervised auto - detect upstart or systemd method based on # UPSTART_JOB or NOTIFY_SOCKET environment variables # Note: these supervision methods only signal "process is ready." # They do not enable continuous liveness pings back to your supervisor. supervised no
# 进程管道id文件,如果指定了pid文件,则Redis会在启动时将其写入指定位置,然后在退出时将其删除。
# 当服务器在非守护进程下运行时,如果没有pid文件,则不会创建在配置中指定。
# 当服务器是后台进程时,pidfile是不被指定也会被使用,默认为/var/run/redis.pid
# 如果Redis无法创建它,则不会发生任何不良情况,服务器将正常启动并运行。
pidfile /var/run/redis_6379.pid # 日志级别: # debug (开发/测试阶段) # verbose (有用信息比较少,但不会像debug这么混乱) # notice (中等冗长,您可能想在生产中使用) # warning (用于生产环境) loglevel notice # 用于指定记录日志的文件,空字符串的话,日志会打印到标准输出设备中。后台运行的redis的标准输出是/dev/null logfile "" # 是否打开记录syslog的功能 # syslog-enabled no # syslog的标识符 # syslog-ident redis # 指定syslog的设备,值可以是user或者是local0-local7 # syslog-facility local0 # 数据库的数量,默认使用的是数据库0,可以使用select命令来切换数据库 databases 16 # By default Redis shows an ASCII art logo only when started to log to the # standard output and if the standard output is a TTY. Basically this means # that normally a logo is displayed only in interactive sessions. # # However it is possible to force the pre-4.0 behavior and always show a # ASCII art logo in startup logs by setting the following option to yes. always-show-logo yes
SNAPSHOTTING部分(Redis持久化之rdb):
################################ SNAPSHOTTING ################################
# Redis的持久化 # Save the DB on disk: # 保存格式: # save <seconds> <changes> #
# 如果同时发生了给定的秒数和给定的针对数据库的写操作,那么就会保存到数据库。 # # 在下面的实例中就会出现持久化: # 在900s(15min)后,至少有1个键值发生变化 # 在300s(5min)后,至少修改了10个键值发生了变化 # 在60s(1min)后,至少修改了10000个键值发生了变化 # # 注意:你可以注释掉所有的save命令来禁用save # # 也可以通过配置带有单个空字符串参数的save命令来删除所有先前配置的save指令 # 如下所示: # # save "" save 900 1 save 300 10 save 60 10000 # 默认情况下,如果启用rdb快照保存失败,那么Redis将停止接受写入 # 这就会使用户能够意识到数据不能正确地持久化存储在磁盘上,否则很可能会没人注意到并发生一些灾难 # 如果后台保存过程将再次开始工作,那么Redis就会自动允许再次写入 # 当rdb出现问题时,是否依然继续进行工作,yes:不能进行工作,no:可以进行工作
# 如果配成no的话,表示你不在乎数据的不一致或者有别的办法来控制或者维护
stop-writes-on-bgsave-error yes # 对于存储到磁盘中的快照,你可以设置是和否进行压缩存储。如果是的话,Redis会使用LZF压缩算法进行压缩, # 如果不想消耗CPU来进行压缩的话,可以关闭此功能。其实影响不大。 rdbcompression yes # 在存储和加载rdb文件的时候是否使用CRC64校验和来进行校验,如果开启,将消耗一定的性能,保持默认设置即可。 # 在禁用校验和的情况下创建rdb文件,校验和为0,这将指示加载代码跳过校验。 rdbchecksum yes # rdb的文件的名称 dbfilename dump.rdb # 工作目录: # 在哪个目录下启动Redis,那么这个路径就是工作目录,那么redis的日志就是生成在这个目录下 # 数据目录,数据库的写入就是在这个目录下。aof和rdb文件也会写入这个文件夹中。 # 请注意,您必须在此指定路径而不是文件名。
# 可以使用config get dir命令来获取工作目录。
dir ./
如何触发RDB快照:
1.配置文件中的默认快照设置(冷拷贝之后重新使用 copy dump.rdb dump_new.rdb,最好主机和备份机是两台服务器)
2.命令save和bgsave都可以立即生成dump.rdb文件然后之前的旧的rdb文件
save:save只管保存,即当之前save命令的时候,就无法存储数据了
bgsave:Redis会在后台异步进行快照操作。
执行flushall命令也会立即生成dump.rdb文件但是此文件为空。
如何恢复Redis中的数据:
将备份文件复制到Redis的暗安装目录下,然后重新启动服务。
RDB的优势:
适合大数据内容的存储和恢复
相较于AOF,RDB更适合大数据集的恢复
RDB的劣势:
容易丢失最后一次数据的快照
在fork一个子进程的时候,接下来的工作全部由子进程来操作,父进程不进行任何IO操作,所以内存中的数据被克隆了一份,内存的膨胀需要考虑。
如何停止:
动态停止所有保存rdb保存规则的方法:redis-cli config save ""
SECUTITY部分:
################################## SECURITY ################################### #
# 需要用户在执行任何命令之前先输入AUTH<PASSWORD>
# # 为了保持向后兼容,应该注释掉该命令,因为大部分的用户也不要认证。 # # 警告:在使用requirepass的时候,由于redis实在是太快了,所以因为设置一个更加安全的密码 # # requirepass foobared # 命令重命名。 # 可以在共享环境中更改危险命令的名称。 例如,可以将CONFIG命令重命名为一些难以猜测的名称,以便它仍可用于内部使用的工具,但不适用于一般客户。 # 例如: # rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 # # 通过将命令重命名为空字符串也可以完全取消该命令: # rename-command CONFIG "" # # 请注意,更改登录到AOF文件或传输到副本的命令的名称可能会导致问题。
secutity部分是全部被注释掉的,所以Redis默认是不需要输入密码的,因为Redis是在Linux环境下的服务器中运行,那么安全要求肯定是很高的。
Clients部分:
################################### CLIENTS #################################### # 设置同时连接的最大客户端数量。默认情况下,此限制设置为10000个客户端连接, # 但是,如果Redis服务器无法配置进程文件限制以允许指定的限制,则允许的最大客户端数将设置为当前文件限制减去32(因为Redis保留了 内部使用的文件描述符很少)
# 一旦达到限制,Redis将关闭所有新连接,并发送错误消息“已达到最大客户端数”。
# maxclients 10000
内存管理MEMORY MANAGEMENT部分:
############################## MEMORY MANAGEMENT ################################
# 设置能连上redis的最大客户端连接数量。默认是10000个客户端连接。由于redis不区分连接是客户端连接还是内部打开文件或者和slave连接等,所以maxclients最小建议设置到 # 32。如果超过了maxclients,redis会给新的连接发送’max number of clients reached’,并关闭连接。
# 当达到内存限制时,Redis将尝试根据所选的逐出策略(请参见maxmemory-policy)删除key。 # 当Redis无法根据策略删除key时,或者如果策略被设置为“noeviction”时,Redis会对set、push这些指令返回错误消息,而对get之类的指定继续回复
# 当将Redis用作LRU或LFU缓存,或为实例设置硬盘限制(使用“ noeviction”策略)时,此选项通常很有用。 # 注意slave的输出缓冲区是不计算在maxmemory内的。所以为了防止主机内存使用完,建议设置的maxmemory需要更小一些。 # maxmemory <bytes> # MAXMEMORY POLICY: 当内存容量超过设置的maxmemory后的处理策略: # # volatile-lru -> 利用LRU算法移除设置过过期时间的key # allkeys-lru -> Evict any key using approximated LRU. # volatile-lfu -> Evict using approximated LFU among the keys with an expire set. # allkeys-lfu -> Evict any key using approximated LFU. # volatile-random -> 随机移除设置过过期时间的key。 # allkeys-random -> Remove a random key, any key. # volatile-ttl -> Remove the key with the nearest expire time (minor TTL) # noeviction -> Don't evict anything, just return an error on write operations. # # LRU means Least Recently Used # LFU means Least Frequently Used # # Both LRU, LFU and volatile-ttl are implemented using approximated # randomized algorithms. # # Note: with any of the above policies, Redis will return an error on write # operations, when there are no suitable keys for eviction. # # At the date of writing these commands are: set setnx setex append # incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd # sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby # zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby # getset mset msetnx exec sort # # The default is: # # maxmemory-policy noeviction # LRU, LFU and minimal TTL algorithms are not precise algorithms but approximated # algorithms (in order to save memory), so you can tune it for speed or # accuracy. For default Redis will check five keys and pick the one that was # used less recently, you can change the sample size using the following # configuration directive. # # The default of 5 produces good enough results. 10 Approximates very closely # true LRU but costs more CPU. 3 is faster but not very accurate. # # maxmemory-samples 5 # Starting from Redis 5, by default a replica will ignore its maxmemory setting # (unless it is promoted to master after a failover or manually). It means # that the eviction of keys will be just handled by the master, sending the # DEL commands to the replica as keys evict in the master side. # # This behavior ensures that masters and replicas stay consistent, and is usually # what you want, however if your replica is writable, or you want the replica to have # a different memory setting, and you are sure all the writes performed to the # replica are idempotent, then you may change this default (but be sure to understand # what you are doing). # # Note that since the replica by default does not evict, it may end using more # memory than the one set via maxmemory (there are certain buffers that may # be larger on the replica, or data structures may sometimes take more memory and so # forth). So make sure you monitor your replicas and make sure they have enough # memory to never hit a real out-of-memory condition before the master hits # the configured maxmemory setting. # # replica-ignore-maxmemory yes
APPEND ONLY MODE(Redis持久化之aof)
############################## APPEND ONLY MODE ############################### # 默认情况下,redis异步将数据写入磁盘中。此模式在许多应用中已经足够好了,但是redis进程问题或者电源中断可能会导致 # 几分钟的写入丢失(取决于配置的保存点) # 可以同时启用aof和rdb,并且redis先加载aof # aof是默认关闭的,需要手动开启 appendonly no # aof文件的名称为appendonly.aof appendfilename "appendonly.aof" # Redis支持三种模式: # appendfsync always: 持续持久化,每次数据发生变更就会记录到磁盘中,数据完整性较好但性能较差 # appendfsync everysec: 出厂默认推荐,每秒记录一次,如果一秒内出现宕机,有数据丢失 # appendfsync no :从不同步 # 如果不确定,就是用默认出厂推荐everysec
# appendfsync always appendfsync everysec # appendfsync no # 重写数据的时候能否使用appendfsync对aof文件进行数据的追加。 # 默认使用no,保证数据的一致性。 no-appendfsync-on-rewrite no # 自动重写aof文件 # 当AOF文件大小增加指定百分比时,Redis会自动调用BGREWRITEAOF 进行重写 # # 触发机制:Redis会记住最近一次重写后文件的大小(如果自重新启动以来,没有发生过重写,那么就是用启动时aof文件的大小) # 将当前文件的大小和之间记录的文件的大小进行比较,如果超过了指定的百分比就会进行重写。另外,需要指定文件的最小大小,即使超过了指定的百分比,但是没有超过最小的文件大小,也是不会重写的。 # 这对于重写aof文件非常有用。
# 100%就是一倍 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb # # If aof-load-truncated is set to yes, a truncated AOF file is loaded and # the Redis server starts emitting a log to inform the user of the event. # Otherwise if the option is set to no, the server aborts with an error # and refuses to start. When the option is set to no, the user requires # to fix the AOF file using the "redis-check-aof" utility before to restart # the server. # # Note that if the AOF file will be found to be corrupted in the middle # the server will still exit with an error. This option only applies when # Redis will try to read more data from the AOF file but not enough bytes # will be found. aof-load-truncated yes # When rewriting the AOF file, Redis is able to use an RDB preamble in the # AOF file for faster rewrites and recoveries. When this option is turned # on the rewritten AOF file is composed of two different stanzas: # # [RDB file][AOF tail] # # When loading Redis recognizes that the AOF file starts with the "REDIS" # string and loads the prefixed RDB file, and continues loading the AOF # tail. aof-use-rdb-preamble yes
相同数据集的数据要远大于rdb文件,恢复速度较慢,所以导致aof的运行效率较慢。
AOF总结:
1.RDB持久化方式能够在指定的时间间隔内对数据进行快照存储
2.AOF持久化操作记录每次对数据的写的操作,当服务器重启的时候就会重新执行这些命令来恢复原始的数据。AOF命令还能以Redis追加协议追加保存每次写的操作到文件的末尾。
3.当两种持久化方式都出现的时候,先加载aof文件恢复原始数据。因为AOF文件保存的数据要比RDB文件来的完整。建议不要只使用AOF
4.性能推荐:
因为RDB只用作后备用途,建议只在Slave上保存RDB文件,而且只要15分钟备份一次就够了。只保留save 900 1这条命令就够了。
如果Enable AOF,好处是在最坏的情况下不会丢失超过两秒的数据,启动脚本比较简单,只要load自己的aof文件就行了。代价一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写入到新文件中造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小是64M,太小了,可以设置到5G以上。默认超过原大小的100%时就会触发重写机制。
如果不Enable AOF,只靠Master-slave Replication实现高可用性也可以。能省掉一大笔IO也减少了rewrite时带来的系统波动。代价是如果Master Slave同时倒掉,会丢失十几分钟的数据;载入脚本也要比较Master和Slave的RDB文件,加载较新的那个。