转载

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的几个重要参数.
  1. #在默认情况下,如果RDB快照持久化操作被激活(至少一个条件被激活)并且持久化操作失败,Redis则会停止接受更新操作。  
  2. #这样会让用户了解到数据没有被正确的存储到磁盘上。否则没人会注意到这个问题,可能会造成灾难。  
  3. #  
  4. #如果后台存储(持久化)操作进程再次工作,Redis会自动允许更新操作。  
  5. #  
  6. #然而,如果你已经恰当的配置了对Redis服务器的监视和备份,你也许想关掉这项功能。  
  7. #如此一来即使后台保存操作出错,redis也仍然可以继续像平常一样工作。  
  8. stop-writes-on-bgsave-error yes  

  1. #是否在导出.rdb数据库文件的时候采用LZF压缩字符串和对象?  
  2. #默认情况下总是设置成‘yes’, 他看起来是一把双刃剑。  
  3. #如果你想在存储的子进程中节省一些CPU就设置成'no',  
  4. #但是这样如果你的kye/value是可压缩的,你的到处数据接就会很大。  
  5. rdbcompression yes  
rdbcompression 就是为什么之前会看到 fork的子进程cpu使用率100%的原因.

  1. #从版本RDB版本5开始,一个CRC64的校验就被放在了文件末尾。  
  2. #这会让格式更加耐攻击,但是当存储或者加载rbd文件的时候会有一个10%左右的性能下降,  
  3. #所以,为了达到性能的最大化,你可以关掉这个配置项。  
  4. #  
  5. #没有校验的RDB文件会有一个0校验位,来告诉加载代码跳过校验检查。  
  6. 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

还有一些参数,先整理这么多吧。
正文到此结束
Loading...