工欲善其事,必先利其器。先了解Redis的配置项,通常保存在redis.conf配置文件,如下对redis-3.2.6的配置文件做详细介绍。
配置项 | 默认值 | 描述 |
---|---|---|
bind | 127.0.0.1 | 指定节点绑定的IP地址, 要监听所有请求则设置“0.0.0.0”。 |
protected-mode | yes | 是否开启保护模式。 如果bind配置项没有限制IP、也未设置访问密码,则建议开启该参数,表示Redis只会本地进行访问,拒绝外部访问。如果bind配置项限制了IP和requirepass设置了访问密码,则建议关闭此配置项。 |
port | 6379 | Redis实例默认端口号,可根据实际场景修改。 |
tcp-backlog | 511 | 高并发环境中设置高速后台日志,避免慢客户端连接问题。 |
timeout | 15 | 设置客户端连接时的超时时间,单位秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接。如果设置为0 表示关闭此设置。 |
tcp-keepalive | 300 | 指定用于发送ACKs的时间,单位秒。设置为0表示禁用长连接, 非0值表示开启长连接。同时client端socket也可以通过配置keepalive选项,开启长连接。 需要注意的是关闭连接需要双倍的时间。 |
daemonize | no | 设置为yes表示redis是后台运行的进程。 |
supervised | no | 是否需要配置supervise进程管理方式,有四个值 no upstart system auto 可根据实际情况调整。 |
pidfile | /var/run/redis.pid | 运行Redis存放pid的文件,默认是/var/run/redis.pid。运行多个redis实例则需要指定不同的pid文件和端口。 |
loglevel | notice | 日志级别,总共支持四个级别:debug、verbose、 notice、 warning。生产环境推荐notice级别。 |
logfile | ./redis.log | 日志文件名,文件名推荐以port区分,如 ./redis/logs/node-7001.log |
databases | 16 | 最大db簇的个数 |
save | save 900 1 save 300 10 save 60 10000 | 数据持久化的频率:在一定时间内执行一定数量的写操作时自动保存快照,其中第一个参数表示多长时间,第二个参数表示执行多少次写操作。 save 900 1 是指900秒内至少有1次写操作 save 300 10 是指300秒内至少有10次写操作 save 60 10000 指60秒内至少有10000次写操作 |
stop-writes-on-bgsave-error | yes | 集群后台存储发生错误,是否终止所有客户端write请求。测试中服务器内存不足、永久缓存value过大造成磁盘空间不足、强制停止集群等均会造成后台存储发生错误而导致集群节点crash的情况。 注:此配置通常需要根据操作系统内核参数vm.overcommit_memory的配置来优化。 |
rdbcompression | yes | 缓存数据持久化到快照时,是否用LZF压缩数据。如果期望提高部分CPU性能,可设置为no关闭此压缩选项。 |
rdbchecksum | yes | 是否对rdb文件使用CRC64校验和,设置yes表示每个rdb文件内容末尾都追加CRC校验和。以便于其他第三方校验工具很方便的检测文件的完整性。 |
dbfilename | dump.rdb | 设置dump的文件位置。如:dump-7001.rdb |
dir | ./ | redis工作目录,该配置项一定是个目录,而不能是文件名。 |
slave-serve-stale-data | yes | 当slave与master失去联系,或者复制正在进行的时候,slave可能会有两种表现: 1. 如果为yes,slave仍然会应答客户端请求,但返回的数据可能是过时,或者在第一次同步的时候数据可能是空的。 2. 如果为no,在你执行除了info he salveof之外的其他命令时,slave 都将返回一个 “SYNC with master in progress” 的错误 |
slave-read-only | yes | Slave是否设置为只读,通常不建议修改此项。 |
repl-diskless-sync | no | 通常用来设置无硬盘复制功能。 |
repl-diskless-sync-delay | 10 | diskless复制的延迟时间,单位秒。一旦复制开始,节点不会再接收新slave的复制请求,直到下一个rdb传输。最好等待一段时间,等更多的slave连上来。 |
repl-disable-tcp-nodelay | no | slave与master的连接,是否禁用TCP-nodelay选项。设置”yes”表示禁用,那么socket通讯中数据将会以packet方式发送(packet大小受到socket buffer限制)。可提高socket通讯的效率,但是小数据将会被buffer,不会被立即发送,对于接受者可能存在延迟。 设置“no”表示开启TCP-nodelay选项,任何数据都会被立即发送,及时性较好,但是效率较低。建议设为no,但是在高并发或者主从有大量操作的情况下,设置为yes |
slave-priority | 100 | slave的权重值。当master失效后,Sentinel将会从slave列表中找到权重值最低(>0)的slave,并提升为master。如果权重值为0,表示此slave为”观察者”,不参与master选举。 |
appendonly | yes | 是否启用AOF文件持久化 |
appendfilename | appendonly.aof | 设置aof的文件位置。如:appendonly-7001.aof |
appendfsync | everysec | Redis支持三种同步AOF文件的策略: always 表示每次有写操作都进行同步 效率最低, 数据可靠性最高 everysec 每秒同步一次 性能折中 no 不主动调用fsync同步到磁盘,完全由操作系统调用,linux是30秒写一次, 性能最高,数据可靠性最低 |
no-appendfsync-on-rewrite | no | 在aof rewrite期间,是否对aof新记录的append暂缓使用文件同步策略,主要考虑磁盘IO开支和请求阻塞时间。默认为no,表示”不暂缓”,新的aof记录仍然会被立即同步。 |
auto-aof-rewrite-percentage | 100 | Redis会隐式调用BGREWRITEAOF来重写log文件,以缩减文件大小,此配置判断log文件大小的基准值和百分比。 |
auto-aof-rewrite-min-size | 64mb | Redis会记录上次重写时的aof大小。假如Redis自启动至今还没有进行过重写,那么启动时aof文件的大小会被作为基准值。这个基准值会和当前的aof大小进行比较。如果当前aof大小超出所设置的增长比例,则会触发重写。如果设置auto-aof-rewrite-percentage为0,则会关闭此重写功能。 |
aof-load-truncated | yes | 指Redis在恢复时,会忽略最后一条可能存在问题的指令。即在aof写入时,可能存在指令写错的问题(突然断电,写了一半),这种情况下,如果设置yes会记录日志并继续,而设置no会直接恢复失败。 |
lua-time-limit | 5000 | lua脚本执行的最大时间,单位毫秒。redis会记个log,然后返回error。当一个脚本超过了最大时限。只有SCRIPT KILL和SHUTDOWN NOSAVE可以用。如果为0或负数表示无限执行时间 |
slowlog-log-slower-than | 10000 | 慢日志记录,单位微妙。如果操作时间超过此值,将会把command信息”记录”起来(内存,非文件)。 其中”操作时间”不包括网络IO开支,只包括请求达到server后进行”内存实施”的时间。 如果设置为”0”,则表示记录全部操作,不建议设置为0。 |
slowlog-max-len | 128 | “慢操作日志”保留的最大条数,”记录”将会被队列化,如果超过了此长度,旧记录将会被移除。此类日志只会维持在内存中而不会写入磁盘。 slowlog get 5 返回最近的5条慢查询日志 slowlog len 返回当前已有慢查询日志的条数 slowlog reset 清空当前所有的慢查询日志 |
latency-monitor-threshold | 0 | 是否开启redis自身延迟监控配置,默认0是关闭监控。 |
notify-keyspace-events | “” | 默认空字符串,表示关闭通知 |
hash-max-ziplist-entries | 512 | Hash在条目数量较小的时候会使用一种高效的内存数据结构编码,当超过某个临界点就会采用另一种存储方式,该临界点由下面的hash-max-ziplist-value和hash-max-ziplist-entries两个配置决定。 |
hash-max-ziplist-value | 64 | |
list-max-ziplist-size | -2 | 与Hash类似,较小的List会以一种特殊的编码方式来节省空间,只要List不超过设定的上限。 |
list-compress-depth | 0 | |
set-max-intset-entries | 512 | 限制特殊编码的最大上限,特殊编码指的是缓存数据全是64位无符号整型数字构成的字符串。 |
zset-max-ziplist-entries | 128 | 有序集合也会采用特殊编码来节省空间,只要不超过上限。 |
zset-max-ziplist-value | 64 | |
hll-sparse-max-bytes | 3000 | RedisHyperLogLog是用来做基数统计的算法,HyperLogLog的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定并且很小的。当HyperLogLog用稀疏式表示法时所用内存超过下面的限制,就会转换成稠密式表示,为了更高的内存利用率,官方建议值为3000,不建议修改此配置项。 |
activerehashing | yes | 是否开启顶层数据结构的rehash功能,如果内存允许、实时性要求不高,请设置为true开启它。rehash能够很大程度上提高K-V存取的效率。 |
client-output-buffer-limit | normal 0 0 0 | 普通client,包括monitor |
client-output-buffer-limit | slave 256mb 64mb 60 | slave用来同步master数据的client |
client-output-buffer-limit | pubsub 32mb 8mb 60 | Pub/Sub模式中订阅了至少一个channel或者模式的client |
hz | 10 | Redis server执行后台任务的频率,此值越大表示redis对”间歇性task”的执行次数越频繁(次数/秒)。”间歇性task”包括”过期集合”检测、关闭”空闲超时”的连接等,此值必须大于0且小于500。此值过小就意味着更多的cpu周期消耗,后台task被轮询的次数更频繁。此值过大意味着”内存敏感”性较差。建议采用默认值。 |
aof-rewrite-incremental-fsync | yes | 当一个child在重写AOF文件的时候,如果设置为true,那么这个文件会以每次32M数据的来被同步,在大量新增提交到磁盘的场景下是有用的,并且能避免高峰延迟。 |
requirepass | “” | 设置客户端连接后进行任何其他指定前需要使用的密码。 |
maxclients | 10000 | 最大并发连接数,默认为10000,这个跟系统本身的 open-file-limit 有关。 |
cluster-enabled | no | 节点开启集群选项配置 |
cluster-config-file | ** ** | 节点的配置文件,该文件是由集群节点来创建和维护的,不能人工修改。多个实例的节点需要,建议以端口号标记配置文件。 |
cluster-node-timeout | ** ** | 节点超时时间(单位毫秒),超过则认为节点宕机。 |
cluster-slave-validity-factor | 10 | 如果将该项设置为0(单位秒),不管slave节点和master节点间失联多久都会一直尝试failover(设为正数,失联大于一定时间(factor节点TimeOut),不再进行FailOver) |
cluster-require-full-coverage | yes | 默认情况下,当集群检测到某个哈希槽(hash slot)没有被覆盖(没有任何节点为此服务)会停止接受查询服务,如果集群部分宕机最终会导致整个集群不可用,当哈希槽重新被全覆盖的时候会自动变为可用。如果希望哈希槽未被覆盖的集群节点继续接受服务,需要将cluster-require-full-coverage设置为no。 |
cluster-migration-barrier | 1 | 考虑一种极端情况,集群有一台主Redis和四台从Redis,从Redis全部挂掉,failover机制有可能造成集群只有主Redis而无从Redis的尴尬境况。为了保证集群的名副其实,可以规定,当从Redis少于某个数量时,拒绝执行failover。 |
配置参照上表,接下来可以搭建集群了。