微信运维监控 —— 海量监控数据上报及存储设计实践

2020-02-27 189浏览

  • 1.微信运维监控 —— 海量监控数据上报及存储设计实践 微信运维中心 陈晓鹏
  • 2.如果运维监控数据处理太慢…
  • 3.微信后台系统现状 60000 40000 20000 0 2011 2012 2013 2014 2015 2016 2015 2016 服务器 6000 4000 2000 0 2011 2012 2013 2014 模块
  • 4.微信监控日志上报量 —— 1万亿/min 14000 12000 10000 8000 6000 4000 2000 0 2011 2012 2013 2014 亿/min 2015 2016
  • 5.l 存储容量不够 l 统计延迟严重 每分钟万亿级监控数据,如何上报、汇总?
  • 6.微信监控数据存储量 —— 2亿/min 2.5 2 1.5 1 0.5 0 2011 2012 2013 2014 亿/min 2015 2016
  • 7.l 如何进一步提高TSDB的读性能? 每分钟亿级时间序列数据,如何实现存储, 如何保证N年跨度的数据读取性能?
  • 8.微信轻量监控数据上报框架
  • 9.常见监控数据上报/汇总方案 日志上报 网络压力 hdfs 存储空间 分布式计算 统计延迟
  • 10.常见监控数据上报/汇总方案 日志上报 hdfs 本地统计 日志格式多样 统计消耗 放弃日志这种上报形式! 分布式计算
  • 11.微信后台轻量数据上报框架 l 数据分类 业务数据 —— 复杂、高延迟 监控数据 —— 简单、低延迟 l 简化监控数据 统一数据格式 简化计算规则 —— 累加、平均
  • 12.统一数据格式 l ID  Key  Value: • ID: 0  ~  128k-1 • Key: 0  ~  127 • Value: uint32_t
  • 13.轻量上报/汇总框架 共享内存 • type  __sync_fetch_and_add (type  *ptr,  type  value)   • bool __sync_bool_compare_and_swap (type  *ptr,  type  oldval,  type  newval) • 支持计算规则:累加、设置新值、设置最大值
  • 14.轻量上报/汇总框架 l CPU消耗极小 l 可实现秒级、实时数据采集 l 可简化数据存储、汇总
  • 15.微信高性能监控数据存储
  • 16.监控数据(时间序列)特点 l 数据格式: Key  +  Time  +  Value l 数据量大: 1天 =  1440min, 2亿/min  =  2880亿/天 l 大量读取历史数据
  • 17.时序数据库设计思路 原始数据 (分钟级) 内存缓存 小时级/天 级数据 Key映射 关系数据库 历史数据 缓存 KV存储 l 历史数据查询性能不足 l 数据缓存命中率不高 l 复杂关系数据查询效率低
  • 18.多维度Key的作用 1 4 6 5 7 2 3 l 当4失败总数上升时,如何定位故障机器、接口? 调用数 A模块 A1机器 à B模块 B2机器 X1接口 失败数 耗时
  • 19.提高历史数据查询性能 l 定制能快速查找历史数据的index: • 分表、按时间分区 • 每个分区独立生成index
  • 20.旧版微信监控数据存储 CREATE  TABLE  `idkey_0`  ( 分表 `time`  int(10)  unsigned  NOT  NULL, `key1`  int(10)  unsigned  NOT  NULL, Key  *  n `key2`  int(10)  unsigned  NOT  NULL, `key3`  int(10)  unsigned  NOT  NULL, `v0`  bigint(20)  unsigned  DEFAULT  '0', `v1`  bigint(20)  unsigned  DEFAULT  '0', Value  *  720 ... `v718`  bigint(20)  unsigned  DEFAULT  '0', `v719`  bigint(20)  unsigned  DEFAULT  '0', PRIMARY  K EY  (`key1`,`key2`,`key3`,`time`), KEY  (`key3`,`key2`,`key1`,`time`) )  ENGINE=MyISAM 多index,支持全匹 配、前置匹配 PARTITION  BY  RANGE  (time) 分区 (PARTITION  P20150327  VALUES  LESS  THAN  (1427414400)  ENGINE   =  MyISAM, PARTITION  P20150330  VALUES  LESS  THAN  (1427673600)  ENGINE  =  MyISAM, ... );   写200w/min,读100w/min
  • 21.微信新版存储方案 原始数据 实时写入 小时分区 (mmap) 优化写入结构 每小时批量flush 日分区index 日分区data 每天离线压缩 压缩日分区index 压缩日分区data 定制简化的index  +  data文件结构, 提供高性能的全匹配、前置匹配查询
  • 22.小时分区(mmap)结构 l 1个meta文件 +  N个data文件组成 l 每个data文件大小固定,使用mmap映射 不同key同一分钟 的数据相邻,减少 单次flush数据量。
  • 23.日分区(压缩/未压缩)文件结构 l 1个meta  +  1个index  +  1个data文件 index文件 Index  1 Index  .. Index  N Key都是整形, 可以简化index 处理 data文件 Key  1  +  Data  1 Key  2  +  Data  2 Key  N  +  Data  N 简化读写处理
  • 24.index算法 —— 折中查找 l 全匹配查询: 11 12 13 21 22 23 31 32 33 2* 2* 3* 3* 3* l 前置匹配查询: 1* 1* 1* 2*
  • 25.原始数据 实时写入 小时分区 (mmap) 每分钟更新 每小时批量flush 日分区index 日分区data 每天离线压缩 压缩日分区index 压缩日分区data
  • 26.数据读取流程 data缓存 index缓存 读请求 压缩/未压缩日分区 index 压缩/未压缩日分区 data 小时分区 (mmap) sum/group 计算
  • 27.单机性能 l 写性能: 小时分区(mmap): 1kw/s    (6亿/min) 未压缩日分区: 35w/s    (12.6亿/hour) l 读性能(单分区100w条记录): 未压缩data性能: 30w/s 压缩data性能: 110w/s
  • 28.