Redis配置文件详解(生产可用)
安装Redis
由于REDIS使用单线程处理请求,CPU的快慢最对REDIS的性能有较大影响,官方建议INTEL的CPU,其效率能比AMD高一倍左右。
下载Redis:wget http://download.redis.io/releases/redis-3.2.6.tar.gz
在安装Redis之前,需要安装Redis的依赖程序tcl,如果不安装tcl在Redis执行make test的时候就会报错的哦。
$ yum install -y tcl tcl-devel
$ tar xvf 3.2.6.tar.gz -C /usr/local $ cd /usr/local/ $ mv redis-3.2.6 redis $ cd redis $ make $ make test $ make install $ mkdir /etc/redis $ cp redis/redis.conf /etc/
标准配置
$ mkdir /data/redis/{logs,conf,pid,data} $ cp /usr/local/redis/redis.conf /data/redis/conf/redis-6379.conf
以redis用户启动redis
$ useradd -s /bin/false -M redis $ sudo -u redis `which redis-server` /data/redis/conf/redis-6379.conf
启动后,可以去看日志文件,可能会看到如下警告:
# WARNING: The TCP backlog setting of 65535 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
因为内核参数/proc/sys/net/core/somaxconn默认值是128,而tcp-backlog设置过大(tcp队列,设置为511就不会有问题了),所以出现警告。对于负载很大的服务程序来说大大的不够,一般会将它修改为2048或者更大。可以在/etc/sysctl.conf中添加如下net.core.somaxconn = 2048,然后在终端中执行sysctl -p即可。
# WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1′ to /etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1′ for this to take effect.
报警说内核参数/proc/sys/vm/overcommit_memory设置为0了,需要设置为1;overcommit_memory它是内存分配策略,可选值:0、1、2(默认)。
0:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2:表示内核允许分配超过所有物理内存和交换空间总和的内存。
什么是Overcommit和OOM?
Linux对大部分申请内存的请求都回复”yes”,以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做Overcommit。当Linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。
当oom-killer发生时,Linux会选择杀死哪些进程?选择进程的函数是oom_badness函数(在mm/oom_kill.c中),该函数会计算每个进程的点数(0~1000)。点数越高,这个进程越有可能被杀死。每个进程的点数跟oom_score_adj有关,而且oom_score_adj可以被设置(-1000最低,1000最高)。
# WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command ‘echo never > /sys/kernel/mm/transparent_hugepage/enabled’ as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
Redis警告信息就是要求关闭hugepage(怎么关闭上面已经说了),Oracle也要求关闭,HDFS会因为这个性能严重受影响。就是允许hugepage可以动态分配,而不是系统启动时预先分配,看上去对内存消耗很大的服务都不喜欢它。对于hugepage可以看这篇文章“hugepage详解”
Redis生产可用配置文件
###基本参数### daemonize yes pidfile /data/redis/pid/redis-6379.pid port 6379 tcp-backlog 65535 bind 0.0.0.0 timeout 0 tcp-keepalive 0 loglevel notice logfile /data/redis/logs/redis-6379.log databases 16 lua-time-limit 5000 maxclients 10000 protected-mode yes dir /data/redis/data/ ###慢日志参数### slowlog-log-slower-than 10000 slowlog-max-len 128 ###内存参数### maxmemory 8G maxmemory-policy volatile-lru ###RDB持久化参数### save 3600 1 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename "dump-6379.rdb" ###AOF持久化参数### no-appendfsync-on-rewrite yes appendonly yes appendfilename "appendonly-6379.aof" appendfsync no auto-aof-rewrite-min-size 512mb auto-aof-rewrite-percentage 100 aof-load-truncated yes aof-rewrite-incremental-fsync yes ###客户端Buffer参数### client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 ###其他参数### hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes latency-monitor-threshold 0 hz 10 ###安全参数### requirepass 123456789 masterauth 123456789 rename-command KEYS REDIS_KEYS rename-command FLUSHDB REDIS_FLUSHDB rename-command FLUSHALL REDIS_FLUSHALL ###复制参数(从库)### ###集群参数###
上面提供了一个单实例Redis的配置,具体的参数含义下面都有介绍,对于复制相关参数只有在从库才有用,而集群参数只有开启集群模式的时候才有用。这一点要注意。
基本参数
daemonize yes
将redis是否以后台进程的方式运行,默认为”no”。如果”daemonize yes”,那么将会把进程id信息写入文件中,请注意:启动redis进程的用户需要具有写入此目录的权限。
pidfile /data/redis/pid/redis-6379.pid
当redis以后台进程启动时,给定一个pid文件。
port 6379
指定server需要侦听的客户端连接端口,client与server在此端口进行TCP通信。
bind 0.0.0.0
指定redis监听在那个IP上面,如果你的物理服务器有多个网络接口,请你为将server socket绑定在指定IP上。
timeout 0
指定socket连接空闲时间(秒),如果connection空闲超时,将会关闭连接(TCP socket选项)如果为0,表示永不超时。
tcp-keepalive 0
指定TCP连接是否为长连接,”侦探”信号由server端维护,长连接将会额外的增加server端的开支(TCP socket选项)。默认为0,表示禁用,非0值表示开启”长连接”;”侦探”信号的发送间隔将有linux系统决定。在多次”侦探”后,如果对等端(客户端socket)仍不回复,将会关闭连接,否则连接将会被保持开启。client端socket也可以通过配置keepalive选项,开启”长连接”。(单位:秒)
loglevel notice
server日志级别,合法值:debug,verbose,notice,warning默认为notice。
debug – 适合开发环境,客户端操作信息都会输出日志;
verbose – 输出一些相对有用的信息,目前效果不明;
notice适 – 合生产环境;
warning – 异常信息;
logfile /data/redis/logs/redis-6379.log
指定redis日志文件目录,默认为stdout。
databases 16
设定redis所允许的最大”db簇”的个数,默认为16个簇。客户端可以通过”select”指令指定需要使用的”db簇”索引号,默认为0。redis的顶层数据结构中,所有K-V都潜在的包括了”db簇”索引号,任何一个key都将隶属于一个”db”。任何对数据的检索,只会覆盖指定的”db”;例如数据被插入到”db 10″中,那么在”db 1″中去get,将会返回null。对数据归类到不同的db簇中,可以帮助我们实现一些特定的需求,比如根据不同客户端连接,来指定不同的db索引号。
maxclients 10000
所允许的客户端连接数,默认为10000。此值不可能被设置成过大,因为每个socket连接都会以”文件描述符”的方式被系统打开,它受到系统”文件打开个数”的限制。如果超过此值,server将会拒绝连接。
lua-time-limit 5000
lua脚本运行的最大时间。
dir /data/redis/data
用来定义持久化文件的存储目录,包括AOF和RDB。
慢日志参数
slowlog-log-slower-than 10000
“慢操作日志”记录,单位:微秒(百万分之一秒,1000 * 1000),如果操作时间超过此值,将会把command信息”记录”起来(内存,非文件)。其中”操作时间”不包括网络IO开支,只包括请求达到server后进行”内存实施”的时间.”0″表示记录全部操作。
slowlog-max-len 128
“慢操作日志”保留的最大条数,”记录”将会被队列化,如果超过了此长度,旧记录将会被移除。可以通过”SLOWLOG <subcommand> args”查看慢记录的信息(SLOWLOG get 10,SLOWLOG reset)。通过”SLOWLOG get num”指令可以查看最近num条慢速记录,其中包括”记录”操作的时间/指令/K-V等信息。
内存参数
maxmemory <bytes>
redis-cache所能使用的最大内存(bytes),默认为0,表示”无限制”,最终由OS物理内存大小决定(如果物理内存不足,有可能会使用swap)。如果此值设置过小(比如32字节),将直接导致server无法使用。此值尽量不要超过机器的物理内存大小,从性能和实施的角度考虑,可以为物理内存3/4。此配置需要和”maxmemory-policy”配合使用,当redis中内存数据达到maxmemory时,触发”清除策略”。如果使用”清除策略”后,仍无法得到足够的内存来存储新的数据,那么write操作的客户端将会收到”error OOM..”信息,此时server只读。
在”内存不足”时,任何write操作(比如set,lpush等)都会触发”清除策略”的执行。在实际环境中,建议redis的所有物理机器的硬件配置保持一致(内存一致),同时确保master/slave中”maxmemory””policy”配置一致
maxmemory-policy volatile-lru
“内存不足”时,数据清除策略,默认为”volatile-lru”。
volatile-lru ->对”过期集合”中的数据采取LRU(近期最少使用)算法,如果对key使用”expire”指令指定了过期时间,那么此key将会被添加到”过期集合”中。每个Redis对象,都保留一个“最后访问时间”的属性,可以用来判断此对象空闲的时间,那么LRU算法就可以根据此属性来进行判断。将已经过期/LRU的数据优先移除,如果”过期集合”中全部移除仍不能满足内存需求,将OOM。
allkeys-lru -> 对所有的数据,采用LRU算法。
volatile-random -> 对”过期集合”中的数据采取”随即选取”算法,并移除选中的K-V,直到”内存足够”为止。如果如果”过期集合”中全部移除全部移除仍不能满足,将OOM。
allkeys-random -> 对所有的数据,采取”随即选取”算法,并移除选中的K-V,直到”内存足够”为止。
volatile-ttl -> 对”过期集合”中的数据采取TTL算法(最小存活时间),移除即将过期的数据。
noeviction -> 不做任何干扰操作,直接返回OOM异常。
如果数据的过期不会对”应用系统”带来异常,且系统中write操作比较密集,建议采取”allkeys-lru“。如果数据对应用系统比较重要,可以直接使用noeviction算法。
安全参数
requirepass <foobared>
当前server的授权密码,任何客户端或者slave与此server交互前,需要提交密码,其他server的masterauth配置和此参数值保持一致。密码应该足够复杂(64字节)。
RDB持久化参数
save 3600 1
snapshot配置,save <seconds> <changes>,用来描述”在多少秒期间至少多少个变更操作”触发snapshot。snapshot最终将生成新的dump.rdb文件,save “”用来禁用snapshot功能。如上表示1小时内至少一个key变更,触发snapshot。
stop-writes-on-bgsave-error yes
如果snapshot过程中出现错误,即数据持久化失败,是否终止所有的客户端write请求。这个选项很让人为难,”yes”表示终止,一旦snapshot故障,那么此server为只读服务。如果为”no”,那么此次snapshot将失败,但下一次snapshot不会受到影响,不过如果出现故障,数据只能恢复到”最近一个成功点”。
rdbcompression yes
是否启用rdb文件压缩手段,默认为yes。压缩可能需要额外的cpu开支,不过这能够有效的减小rdb文件的大小,有利于存储/备份/传输/数据恢复。
rdbchecksum yes
是否对rdb文件使用CRC64校验和,默认为”yes”,那么每个rdb文件内容的末尾都会追加CRC校验和。对于其他第三方校验工具,可以很方便的检测文件的完整性。
dbfilename dump-6379.rdb
指定rdb文件的名称。
dir ./
指定rdb/AOF文件的目录位置,使用CONFIG GET dir命令可以查看默认位置。
AOF持久化参数
appendonly no
是否开启aof功能,”yes”表示开启,在开启情况下,aof文件同步功能才生效,默认为”no”。对master机器,建议使用AOF,对于slave,建议关闭(采用snapshot)。
appendfilename “appendonly-6379.aof”
指定AOF存储的文件。
appendfsync everysec
aof中文件同步机制。
always -> 任何一个aof记录都立即进行文件同步(磁盘写入),安全性最高;如果write请求比较密集,将会造成较高的磁盘IO开支和响应延迟。
everysec -> 每秒同步一次,性能和安全性都较高的策略,也是默认值。
no -> 不直接同步,让文件同步交给OS控制,OS将会根据文件流通道中buffer情况/空闲情况进行择机写入磁盘,安全性和效率与OS设定有关。
no-appendfsync-on-rewrite no
在aof rewrite期间,是否对aof新记录的append暂缓使用文件同步策略,主要考虑磁盘IO开支和请求阻塞时间。默认为no,表示”不暂缓”,新的aof记录仍然会被立即同步。如设置为no,那么在AOFREWRITE时REDIS的处理能力可能下降(如有大量set操作),甚至卡死的发生。如设置为yes,那么就存在丢数据的风险,例如AOF需要几分钟,且处理时REDIS挂掉,那么AOF在buffer的数据丢失,这几分钟的数据无法持久化。
auto-aof-rewrite-min-size 64mb
aof rewrite触发时机,最小文件大小。
auto-aof-rewrite-percentage 100
aof每次rewrite之后,都会记住当前aof文件的大小,当文件增长到一定比例后,继续进行aof rewrite。
aof-rewrite-incremental-fsync yes
aof rewrite过程中,是否采取增量”文件同步”策略,默认为”yes”,而且必须为yes。rewrite过程中,每32M数据进行一次文件同步,这样可以减少”aof大文件”写入对磁盘的操作次数。
客户端Buffer参数
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
在客户端与server进行的交互中,每个连接都会与一个buffer关联,此buffer用来队列化亟待被client接受的响应信息。如果client不能及时的消费响应信息,那么buffer将会被不断积压而给server带来内存压力。如果buffer中积压的数据达到阀值,将会导致连接被关闭,buffer被移除。buffer控制类型包括:
normal -> 普通连接。
slave -> 与slave之间的连接。
pubsub -> pub/sub类型连接,此类型的连接,往往会产生此种问题;因为pub端会密集的发布消息,但是sub端可能消费不足。
指令格式:client-output-buffer-limit <class> <hard> <soft> <seconds>”,其中hard表示buffer最大值,一旦达到阀值将立即关闭连接;soft表示”容忍值”,它和seconds配合,如果buffer值超过soft且持续时间达到了seconds,也将立即关闭连接,如果超过了soft但是在seconds之后buffer数据小于了soft,连接将会被保留。其中hard和soft都设置为0,则表示禁用buffer控制,通常hard值大于soft。
其他参数
hash-max-ziplist-entries 512
通过”TYPE key”指令查看key的数据类型。通过”OBJECT encoding key”查看key的编码类型。hash类型的数据结构在编码上可以使用ziplist和hashtable。ziplist的特点就是文件存储(以及内存存储)所需的空间较小,在内容较小时,性能和hashtable几乎一样。因此redis对hash类型默认采取ziplist。如果hash中条目的条目个数或者value长度达到阀值,将会被重构为hashtable。ziplist中允许存储的最大条目个数,建议为128。
hash-max-ziplist-value 64
ziplist中允许条目value值最大字节数,建议为1024。
list-max-ziplist-entries 512
list-max-ziplist-value 64
对于list类型,将会采取ziplist,linkedlist两种编码类型,同hash。
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
zset为有序集合,有2中编码类型:ziplist,skiplist。因为”排序”将会消耗额外的性能,当zset中数据较多时,将会被重构为skiplist。同hash。
set-max-intset-entries 512
intset中允许保存的最大条目个数,如果达到阀值,intset将会被重构为hashtable。
hll-sparse-max-bytes 3000
value大小小于等于hll-sparse-max-bytes使用稀疏数据结构(sparse),大于hll-sparse-max-bytes使用稠密的数据结构(dense)。一个比16000大的value是几乎没用的,建议的value大概为3000。如果对CPU要求不高,对空间要求较高的,建议设置到10000左右。
activerehashing yes
Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存。
hz 10
Redis server执行后台任务的频率,默认为10,此值越大表示redis对”间歇性task”的执行次数越频繁(次数/秒)。”间歇性task”包括”过期集合”检测、关闭”空闲超时”的连接等,此值必须大于0且小于500。(参见redis.h源码)。此值过小就意味着更多的cpu周期消耗,后台task被轮询的次数更频繁。此值过大意味着”内存敏感”性较差。建议保持默认值。
latency-monitor-threshold 0
延迟监控功能是用来监控redis中执行比较缓慢的一些操作,用LATENCY打印redis实例在跑命令时的耗时图表。只记录大于等于下边设置的值的操作。0的话,就是关闭监视。默认延迟监控功能是关闭的,如果你需要打开,也可以通过CONFIG SET命令动态设置。
include /path/to/local.conf
include指令用来载入额外的配置文件模板,也可以在redis server启动时,手动指定需要include的配置文件。
复制参数(从库)
slaveof <masterip> <masterport>
将当前server做为slave,并为其指定master信息。
masterauth <master-password>
以认证的方式连接到master,如果master中使用了”密码保护”,slave必须交付正确的授权密码,才能连接成功。”requirepas”配置项指定了当前server的密码。此配置项中<master-password>值需要和master机器的”requirepas”保持一致。此参数配置在slave端。
slave-serve-stale-data yes
如果当前server是slave,那么当slave与master失去通讯时,是否继续为客户端提供服务,”yes”表示继续,”no”表示终止。在”yes”情况下,slave继续向客户端提供只读服务,有可能此时的数据已经过期。在”no”情况下,任何向此server发送的数据请求服务(包括客户端和此server的slave)都将被告知”error”。
slave-read-only yes
slave是否为”只读”,强烈建议为”yes”。
repl-ping-slave-period 10
slave向指定的master发送ping消息的时间间隔(秒),默认为10。
repl-timeout 60
slave与master通讯中,最大空闲时间,默认60秒,超时将导致连接关闭。
repl-diskless-sync no
repl-diskless-sync-delay 5
当启用无硬盘备份,服务器等待一段时间后才会通过套接字向从站传送RDB文件,这个等待时间是可配置的。 这一点很重要,因为一旦传送开始,就不可能再为一个新到达的从站服务。从站则要排队等待下一次RDB传送。因此服务器等待一段时间以期更多的从站到达。 延迟时间以秒为单位,默认为5秒。要关掉这一功能,只需将它设置为0秒,传送会立即启动。
repl-disable-tcp-nodelay no
slave与master的连接,是否禁用TCP nodelay选项。”yes”表示禁用,那么socket通讯中数据将会以packet方式发送(packet大小受到socket buffer限制),可以提高socket通讯的效率(tcp交互次数),但是小数据将会被buffer,不会被立即发送,对于接受者可能存在延迟。”no”表示开启tcp nodelay选项,任何数据都会被立即发送,及时性较好,但是效率较低。建议为”no”。
slave-priority 100
适用Sentinel模块(unstable,M-S集群管理和监控),需要额外的配置文件支持。slave的权重值,默认100。当master失效后,Sentinel将会从slave列表中找到权重值最低(>0)的slave,并提升为master。如果权重值为0,表示此slave为”观察者”,不参与master选举。
集群参数
cluster-enabled yes
开启Redis 3.0集群功能。
cluster-config-file /data/redis-6558/nodes.conf
设定了保存节点配置文件的路径,默认值为nodes.conf。节点配置文件无须人为修改,它由Redis集群在启动时创建,并在有需要时自动进行更新。
cluster-node-timeout 5000
节点互连超时的阀值,集群节点超时毫秒数。
原文:http://www.ywnds.com/?p=5721