Redis重要参数回顾
最近有点闹心. 先是昨天壁挂炉管子崩了,家里发大水. 小花狸还把钥匙扔厕所里了,没注意直接给冲走了.. 晚上,有邮件报警. 才发现家里键盘还让小花狸玩坏了... 这孩子.太淘气了 晚上9点半,打车去单位处理. 发现Redis内存使用接近上限.已经使用了10G左右. 我调整了一下上限,解除了报警. 但是查看top的时候,发现Redis-server cpu使用率达到100%. 昨天是崩溃的一天.. 当时每秒执行400左右,设置并查看慢日志.没有明显问题. 后来想起,这个Redis有大量写入.触发了rdb持久化存储.每分钟fork一个子进程,进行转储导出.那个CPU使用率达到100%的进程,应该是fork的子进程. 对业务应该没有影响.毕竟Redis rdb是通过 Copy-on-write 写时复制机制的.(好像就是修改请求,写内存的新页,不会修改原来的数据页,让fork的子进程做持久化.) 不过我还是修改了save的配置.减少rdb持久化频率.毕竟每分钟持久化一次,写6G多文件,没有什么必要. 修改之后,习惯性的查看配置. 狗血的事情来了... 1) "dbfilename" 2) "authorized_keys" 。。。。。 91) "dir" 92) "/root/.ssh" 这是什么鬼?这台Redis是以root运行的.. 当时晚上11点,倒抽一口凉气... 马拉个鸡..这黑客是要砸我饭碗吗? http://www.aneasystone.com/archives/2015/11/redis-crackit.html 由于我们服务器都有ACL保护,所以这个漏洞原来也没有太当回事. 终于都弄完了... 回顾一下Redis的几个重要参数. #在默认情况下,如果RDB快照持久化操作被激活(至少一个条件被激活)并且持久化操作失败,Redis则会停止接受更新操作。 #这样会让用户了解到数据没有被正确的存储到磁盘上。否则没人会注意到这个问题,可能会造成灾难。 # #如果后台存储(持久化)操作进程再次工作,Redis会自动允许更新操作。 # #然而,如果你已经恰当的配置了对Redis服务器的监视和备份,你也许想关掉这项功能。 #如此一来即使后台保存操作出错,redis也仍然可以继续像平常一样工作。 stop-writes-on-bgsave-error yes #是否在导出.rdb数据库文件的时候采用LZF压缩字符串和对象? #默认情况下总是设置成‘yes’, 他看起来是一把双刃剑。 #如果你想在存储的子进程中节省一些CPU就设置成'no', #但是这样如果你的kye/value是可压缩的,你的到处数据接就会很大。 rdbcompression yes rdbcompression 就是为什么之前会看到 fork的子进程cpu使用率100%的原因. #从版本RDB版本5开始,一个CRC64的校验就被放在了文件末尾。 #这会让格式更加耐攻击,但是当存储或者加载rbd文件的时候会有一个10%左右的性能下降, #所以,为了达到性能的最大化,你可以关掉这个配置项。 # #没有校验的RDB文件会有一个0校验位,来告诉加载代码跳过校验检查。 rdbchecksum yes slave-serve-stale-data yes 当slave丢失master或者同步正在进行时,如果发生对slave的服务请求: slave-serve-stale-data设置为yes则slave依然正常提供服务 slave-serve-stale-data设置为no则slave返回client错误:"SYNC with master in progress" repl-ping-slave-period 10 slave发送PINGS到master的时间间隔 repl-timeout 60 IO超时时间 repl-disable-tcp-nodelay no 解释: 在slave和master同步后(发送psync/sync),后续的同步是否设置成TCP_NODELAY 假如设置成yes,则redis会合并小的TCP包从而节省带宽,但会增加同步延迟(40ms),造成master与slave数据不一致 假如设置成no,则redis master会立即发送同步数据,没有延迟 前者关注性能,后者关注一致性 repl-backlog-size 1mb 避免slave断开重连之后,全量的数据同步 maxmemory-policy volatile-lru noeviction: 不进行置换,表示即使内存达到上限也不进行置换,所有能引起内存增加的命令都会返回error allkeys-lru: 优先删除掉最近最不经常使用的key,用以保存新数据 volatile-lru: 只从设置失效(expire set)的key中选择最近最不经常使用的key进行删除,用以保存新数据 allkeys-random: 随机从all-keys中选择一些key进行删除,用以保存新数据 volatile-random: 只从设置失效(expire set)的key中,选择一些key进行删除,用以保存新数据 volatile-ttl: 只从设置失效(expire set)的key中,选出存活时间(TTL)最短的key进行删除,用以保存新数据 maxmemory-samples 5 Redis中的LRU不是严格意义上的LRU算法实现,是一种近似的LRU实现,主要是为了节约内存占用以及提升性能。 Redis的LRU是取出配置的数目的key,然后从中选择一个最近最不经常使用的key进行置换,maxmemory-samples 默认的5 可以通过调整样本数量来取得LRU置换算法的速度或是精确性方面的优势。 Redis不采用真正的LRU实现的原因是为了节约内存使用。虽然不是真正的LRU实现,但是它们在应用上几乎是等价的 如果你将maxmemory-samples设置为10,那么Redis将会增加额外的CPU开销以保证接近真正的LRU性能,可以通过检查命中率来查看有什么不同。 no-appendfsync-on-rewrite no 重写 aof文件的时候,是否调用fsync 还有一些参数,先整理这么多吧。
正文到此结束