Redis内存数据监控实战

众所周知Redis是基于内存的数据库,其所有的数据都在内存中,而内存又是属于成本较高且容量有上限的硬件资源,因此需要时刻关注Redis内存的情况 。特别是在生产环境,Redis内存占用过高会带来很多风险,甚至是灾难性的后果:

  • 庞大的数据导致持久化时间冗长,期间大量消耗主机资源,服务器压力陡升
  • Redis启动过程变慢,主从全量同步耗时增加,需要较长时间才能达到可用状态
  • 一旦达到Redis内存上限,轻则无法写入数据,重则直接宕机,且宕机后无法立即恢复,除非丢弃所有数据 。
  为了避免这种情况的发生,需要增加Redis内存数据分布的监控,如果发现内存异常持续升高,可以通过监控来排查是谁占用了内存并及时处理 。特来电云平台为此做了两种监控方案:
  1.  内存数据分布准实时监控
  2. 数据写入流量实时监控
一、内存数据分布准实时监控
Redis为了避免进程退出导致内存数据的永久丢失,可以定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下次Redis重启时,利用持久化文件实现数据恢复 。Redis持久化分为RDB持久化和AOF持久化:
  • RDB(Redis DataBase)持久化:将当前内存中的Redis完整数据保存到硬盘
  • AOF(AppendOnly File)持久化:将写操作命令追加的保存到硬盘
数据分析可以选择使用RDB持久化生成的数据镜像文件 。由于特来电云平台采用多数据中心多服务单元的部署架构,每个数据中心的服务单元都有一个或多个Redis集群,因此需要将各个集群的Redis数据镜像文件进行归集,然后进行统一分析,并将分析结果上报至特来电监控预警平台 。这种做法还有一个好处是可以把归集的镜像文件当作数据备份,以备不时之需 。
 
Redis内存数据监控实战


分析工具选择使用redis-rdb-tools + sqlite + 自研工具 。redis-rdb-tools是一款开源的以python语言开发的解析redis的rdb文件的工具,它可以生成内存报告、转储文件到JSON以及对两个rdb文件进行比较 。这里主要用它生成csv格式的内存报告,执行命令:
/redis-rdb-tools-rdbtools-0.1.14/build/lib/rdbtools/cli/rdb.py-c memory /redis/rdb/dump-main1.rdb > /redis/rdb/report-main1.csv生成的报告内容如下:
Redis内存数据监控实战


其中:
Database:key所在的数据库编号Type:key的数据结构key:key的名称size_in_bytes:value的大小encoding:底层存储的编码类型num_elements:包含的元素数量,例如string里有多少字符、hash里面有多少项、set里面有多少元素len_largest_element:包含的所有元素中的最大长度expiry:key的过期时间接下来可以对这份报告进行统计,由于csv文件不方便进行各类统计查询,可以将其导入数据库 。这里选择最轻量级的sqlite:
sqlite3/redis/sqlite/main1-memory.dbcreatetable memory(database int,type varchar(128),key varchar(128),size_in_bytesint,encoding varchar(128),num_elements int,len_largest_elementvarchar(128),expiry varchar(128));.modecsv memory.import/redis/rdb/report-main1.csv memory      之后就可以进行下一步操作:统计数据并上报监控预警平台 。在开发设计阶段对redis的key命名时,都会增加一个业务缩写前缀,例如:User:xxxxxx、Bill:xxxx,这样可以方便进行统计查询,能够快速得知每一块业务的key的数量和大小 。因为所有的操作均在linux上,所以需要开发一个.netcore的统计上报工具部署在服务器上,进行统计和上报每一块业务的数据量 。工具核心统计代码如下:

推荐阅读