基于Redis Cluster的分布式缓存配置篇(二)

工欲善其事,必先利其器。先了解Redis的配置项,通常保存在redis.conf配置文件,如下对redis-3.2.6的配置文件做详细介绍。

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

配置参照上表,接下来可以搭建集群了。