• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

Redis配置文件详解(生产可用)

Redis 彭东稳 8年前 (2016-08-15) 25639次浏览 已收录 2个评论

一、安装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的时候就会报错的哦。

标准配置

以redis用户启动redis

启动后,可以去看日志文件,可能会看到如下警告:

# 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生产可用配置文件

上面提供了一个单实例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

当bgsave出现错误时,Redis是否停止执行写命令。Redis提供了一个参数stop-writes-on-bgsave-error,设置为yes,则当硬盘出现问题时,可以及时发现,避免数据的大量丢失;设置为no,则Redis无视bgsave的错误继续执行写命令,当对Redis服务器的系统(尤其是硬盘)使用了监控时,该选项可以考虑设置为no。

rdbcompression yes

是否启用rdb文件压缩手段,默认为yes。为了尽可能使RDB文件体积减小,Redis默认采用LZF算法对RDB文件进行压缩。虽然压缩耗时,但是可以大大减小RDB文件的体积,因此压缩默认开启,参数为rdbcompression。需要注意的是,RDB文件的压缩并不是针对整个文件进行的,而是对数据库中的字符串进行的,且只有在字符串达到一定长度(20字节)时才会进行。

rdbchecksum yes

是否对rdb文件使用CRC64校验和,默认为”yes”。在写入文件和读取文件时都起作用,关闭checksum在写入文件和启动文件时大约能带来10%的性能提升,但是数据损坏时无法发现。

dbfilename dump-6379.rdb

指定rdb文件的名称。

dir ./

指定rdb/AOF文件的目录位置,使用CONFIG GET dir命令可以查看默认位置。

AOF持久化参数

appendonly yes

是否开启aof功能,”yes”表示开启,在开启情况下,aof文件同步功能才生效,默认为”no”。对master机器,建议使用AOF,对于slave,建议采用RDB。

appendfilename “appendonly-6379.aof”

指定AOF存储的文件。

appendfsync everysec

AOF所有写入操作都是先写入内存缓存中,然后调用系统的write或fsync方法进行数据持久化。这个策略是下面几个参数决定的。

always -> 命令写入aof_buf缓存区后立即调用系统fsync操作同步到AOF文件,fsync完成后线程返回。这种情况下,每次有写命令都要同步到AOF文件,硬盘IO成为性能瓶颈,Redis只能支持大约几百TPS写入,严重降低了Redis的性能;即便是使用固态硬盘(SSD),每秒大约也只能处理几万个命令,而且会大大降低SSD的寿命。

everysec -> 命令写入aof_buf缓存区后调用系统write操作,write完成后线程返回;fsync同步文件操作由专门的线程每秒调用一次。everysec是前述两种策略的折中,是性能和数据安全性的平衡,因此是Redis的默认配置,也是推荐的配置。

no -> 命令写入aof_buf后调用系统write操作,不对AOF文件做fsync同步;同步由操作系统负责,通常同步周期为30秒。这种情况下,文件同步的时间不可控,且缓冲区中堆积的数据会很多,数据安全性无法保证。

no-appendfsync-on-rewrite yes

bgrewriteaof机制,在一个子进程中进行aof的重写,从而不阻塞主进程对其余命令的处理,同时解决了aof文件过大问题。现在问题出现了,同时在执行bgrewriteaof操作和主进程写aof文件的操作,两者都会操作磁盘,而bgrewriteaof往往会涉及大量磁盘操作,这样就会造成主进程在写aof文件的时候出现阻塞的情形,现在no-appendfsync-on-rewrite参数出场了。

如果该参数设置为no,是最安全的方式,不会丢失数据,但是要忍受阻塞的问题。如果设置为yes呢?这就相当于将appendfsync设置为no,这说明并没有执行磁盘操作,只是写入了缓冲区,因此这样并不会造成阻塞(因为没有竞争磁盘),但是如果这个时候Redis挂掉,就会丢失数据。丢失多少数据呢?在Linux的操作系统的默认设置下,最多会丢失30s的数据。因此,如果应用系统无法忍受延迟,而可以容忍少量的数据丢失,则设置为yes。如果应用系统无法忍受数据丢失,则设置为no。

auto-aof-rewrite-min-size 64mb

aof文件必须满足此大小时,且还必须满足auto-aof-rewrite-percentage参数设置时,才会触发重写机制。

auto-aof-rewrite-percentage 100

aof每次rewrite之后,都会记住当前aof文件的大小(aof_base_size状态值),并且与当前aof大小(aof_current_size状态值)进行比较,当文件增长到一定比例后,触发aof rewrite。但同时需要满足auto-aof-rewrite-min-size参数。

aof-load-truncated yes

服务器可能在程序正在对AOF文件进行写入时停机,如果停机造成了 AOF 文件出错(corrupt),那么Redis在重启时会拒绝载入这个AOF文件, 从而确保数据的一致性不会被破坏。也可以选择使用redis-check-aof工具进行AOF文件修复操作。

但如果是AOF文件结尾不完整(机器突然宕机等容易导致文件尾部不完整),且aof-load-truncated参数开启,则日志中会输出警告,Redis忽略掉AOF文件的尾部,启动成功。aof-load-truncated参数默认是开启的。

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为有序集合,有两种编码类型: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

节点互连超时的阀值,集群节点超时毫秒数。


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (3)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!

(2)个小伙伴在吐槽