IT技术博客大学习 共学习 共进步

redis 运维实际经验纪录之一

互联网,请记住我 2010-05-26 09:44:55 浏览 7,582 次

    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的内存了;

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

    处于设想中的想法:

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

建议继续学习

  1. redis源代码分析 - persistence (阅读 32,101)
  2. Redis消息队列的若干实现方式 (阅读 11,922)
  3. 基于Redis构建系统的经验和教训 (阅读 10,380)
  4. 浅谈redis数据库的键值设计 (阅读 9,220)
  5. redis运维的一些知识点 (阅读 8,520)
  6. redis在大数据量下的压测表现 (阅读 8,200)
  7. Redis和Memcached的区别 (阅读 7,940)
  8. Redis作者谈Redis应用场景 (阅读 7,540)
  9. 记Redis那坑人的HGETALL (阅读 7,320)
  10. 让Redis使用TCMalloc,实现高性能NOSql服务器 (阅读 7,200)