Redis 运维实际经验纪录之一

本文转自一米六二博客(nice name),是将Redis用在较大型数据上的一个运维实例,作者为yahoo!中国的后端工程师,其收集整理的Tokyocabinet/Tokyotyrant文档大合集在亦在网上广为流传。

原文链接:http://www.162cm.com/archives/1062.html

Redis 改版的项目上线有两个月了,记录一下Redis 相关的经验,也给大家一个参照:

我们的Redis Server是一主一从,使用R710的机器,8核心,24G内存。 每天约插入200万左右的数据,现在库里有3000万条纪录,占用了9G的内存。由于现在每天内存增长太快,担心很快会无法负载,因此写了脚本每天将过期数据删除。

现在运行中的问题:

1、Redis运行基本稳定,从没有自己中断过服务,php脚本去set的话大概1秒钟能设置1万条小数据,并没有官方给出的数据高。但是修改配置后大重启服务时大概需要1到2分钟才能完全将硬盘中的数据加载到内存中去,在加载完之前,Redis不能提供服务。

2、Redis的默认配置中,每60秒如果纪录更改数达到1万条就需要dump到硬盘中去,但实际上由于超过了这个数,我们的Redis几乎不停地在dump数据到硬盘上。dump数据到硬盘时,我估计为了达到一个原子的效应,避免数据丢失,Redis是先把数据dump到一个临时文件,然后重命名为你在配置文件设定的数据文件名。而前面说到,加载数据要1到2分钟,dump数据应该也在1分钟左右吧。dump出来的文件差不多1到2个G。这样,服务器几乎一直保持着每分钟写一个2G的文件的这种IO的负载。磁盘基本不闲着。

3、还是在dump中,除开磁盘不闲着以外,CPU也一路飙升:Redis是fork一个子进程来dump数据到硬盘,原有进程占用30%+的CPU,而dump数据的子进程单独享用了一个CPU核心,cpu占用100%。

4、 Redis在dump数据的时候,是fork子进程,这样产生一个问题:Redis本向占用了9G的内存,在dump数据时又fork一个进程,子进程继承了内存分配,也占用了9G的内存…。Redis一下子占用了18G的内存了。(NoSQLFan:由于fork调用的内存会采用操作系统的COW机制,所以内存不会马上加倍,只有在最坏的情况下,也就是在dump的时候主进程中的数据完全被修改了才COPY出两倍的内存来。)

发现这些问题后,我修改了Redis的配置文件,设置为30分钟内只要有一次写修改就dump数据,这样系统负载大幅减轻了。

处于设想中的想法:

主Redis并不dump数据,不管写多少次都不dump到硬盘,或是这个dump的时间非常长。从Redis则主要承担合理地dump数据到硬盘以起备份作用。主Redis启动时先从从Redis中scp或是ftp download数据回来。有待后续验证。

anyShare赠人玫瑰,手有余香,分享知识,德艺双馨!
          

无觅相关文章插件,快速提升流量

分类 Redis · tag ,

  1. 关于“dump数据的子进程单独享用用了一个CPU核心,cpu占用100%;“,因为子进程主要负责把内存中的数据写到磁盘中,也就是说主要负载在IO上面,为什么cpu也占用这么多呢?

  2. 关于第4点,因为fork子进程去dump数据使用了COW机制,内存不应该一下就double吧?

  3. “而前面说到,加载数据要1到2分钟,dump数据应该也在1分钟左右吧;dump出来的文件差不多1到2个G;这样,服务器几乎一直保持着每分钟写一个2G的文件的这种IO的负载;磁盘基本不闲着;”这个计算是不是有问题的?redis server restart是将所有的key加载到内存(可能包括部分value);而replication机制有两种(dump & aof)你说的dump机制及其配置我的理解是对60s内有改变的数据进行dump,而不是对所有数据dump,另外,redis server 也不可能在内存中同时加载所有的数据。

    • @Rocky 你的理解是有误的。

      1.dump.rdb文件不是有改变的数据,而是每次都dump全部数据。具体过程如下:
      1.1 Redis forks. We now have a child and a parent process.
      1.2 The child starts to write the dataset to a temporary RDB file.
      1.3 When the child is done writing the new RDB file, it replaces the old one.
      具体可以看这里:http://redis.io/topics/persistence

      2.redis是一个内存数据库,当然会在内存中加载所有数据。这是Redis最早的功能,后来作者开发了一些disk store的东西。但是现在已经确定这些不会再开发下去,Redis会一直是一个内存数据库。详情可以看这里:http://blog.nosqlfan.com/html/1678.html

  4. Pingback: zz Redis资料汇总 | 回眸

  5. Pingback: Redis资料汇总专题 | 岭南六少 - 一朵在LAMP架构下挣扎的云

  6. Pingback: Redis资料汇总专题(转) | XYZ'S WORLD

  7. Pingback: ReiDai 's blog » redis-2.4.5 安装&配置

  8. Pingback: Redis学习资料整理 - 广州小强技术博客

  9. Pingback: redis网络资料汇总 | architecture4

  10. Pingback: 大数据处理 » Redis资料汇总专题

  11. Pingback: Redis资料汇总 – 撒旦2号's Blog

  12. Pingback: Redis资料汇总专题 – 农夫庄园