ITPub博客

首页 > > > MyRocks状态监控参考手册

MyRocks状态监控参考手册

作者:u_ea6ef15d346a 时间:2018-09-29 15:15:41 0 删除 编辑

对MySQL进行监控包括2大维度,一是MySQL Server层监控,包括连接、查询和复制等维度;二是存储引擎层监控,包括引擎层的增删改查、内存占用、数据大小和读写统计等等。应该说MySQL的监控项已经非常丰富,但最近越来越流行的MyRocks还不够完善,本文承接上文(MyRocks及其使用场景分析),主要对MyRocks特有的状态统计进行介绍并整理分析哪些状态应该重点监控。

对线上数据库进行状态监控和报警是数据库运维的日常操作。通过有效的监控,可以随时了解数据库的状态,及时发现潜在问题,防范以未然。MySQL是目前在业界占统治地位的开源关系数据库,尤其在互联网领域,非常流行。MyRocks是经过存储空间和写性能优化的MySQL数据库,本文基于MyRocks暴露的RocksDB统计项,整理了不同模块需监控的指标,可作为DBA和MyRocks云服务参考依据。文中包括2大部分,一是整理我们可以获取的RocksDB途径,介绍下大家在使用MyRocks时都可以通过哪些操作获取RocksDB状态信息。二是,在此基础上中拆解出具体哪些指标是需要特别关注的,包括内存监控、存储大小与Schema个数监控、用户DML和查询监控、缓存命中率监控、物理IO及命中分布监控和Write Stall监控。

RocksDB状态信息

RocksDB状态信息的来源主要有3个。如下所示:

1、show engine rocksdb status\G

与InnoDB一样,MySQL也为RocksDB提供了引擎层统计信息的汇总,信息量非常丰富。包括:

STATISTICS(全局状态统计):状态值较多,与“show global status like "rocksdb%"”重合度较高。详见后续小节的描述。

DBSTATS(DB级别的状态统计)

这是实例级别的CF Compaction汇总信息。Cumulative 是到现在为止累加的统计,Interval 则是从上一次统计到现在的变更数据。每个大项里面的各小项含义:

Uptime:从启动到现在的时间

writes:

  • writes - 总的写入次数
  • keys - 总的写入 key 的数量
  • commit groups - 总的 group 提交的数量
  • writes per commit group - 每个 group 提交包含的写入次数
  • ingest - 直接 ingest 到 DB 的数量
  • MB/s - 写入的速度

WAL:

  • writes - 总的写入次数
  • syncs - 强制 sync 的次数
  • writes - 每次 sync 有多少次写入
  • written - 总的写入数据量
  • MB/s - 写入的速度

stall:

  • H:M:S - 总的 stall 的时间
  • percent - stall 的时间在总时间的比例

CF_COMPACTION(每个列族Column Family状态统计,信息非常丰富):详见ROCKSDB_COMPACTION_STATS系统表小节描述。

MEMORY_STATS(MemTable和Cache占用情况):包括MemTable所占总内存,未刷新的内存。Block Cache所占总内存等。

BG_THREADS(后台线程个数和状态,包括FlushJob和CompactionJob等)

空闲状态如下,thread_type分为High Pri和Low Pri。

将MemTable刷到sst文件上时如下,operation_type为Flush:

sst文件Compaction时如下,operation_type为Compaction:

2、show global status like "rocksdb%";

一共有103个与RocksDB相关的状态信息,其中绝大部分与“show engine rocksdb status”的STATISTICS重合;其中的大部分指标应该纳入数据库的日常监控,详见后续监控小节描述。

3、information_schema下的RocksDB系统表

show tables like "ROCKSDB%";

+-----------------------------------------+

| Tables_in_information_schema (ROCKSDB%) |

+-----------------------------------------+

| ROCKSDB_GLOBAL_INFO |

| ROCKSDB_PERF_CONTEXT_GLOBAL |

| ROCKSDB_CFSTATS |

| ROCKSDB_TRX |

| ROCKSDB_CF_OPTIONS |

| ROCKSDB_COMPACTION_STATS |

| ROCKSDB_DBSTATS |

| ROCKSDB_DEADLOCK |

| ROCKSDB_INDEX_FILE_MAP |

| ROCKSDB_PERF_CONTEXT |

| ROCKSDB_LOCKS |

| ROCKSDB_DDL |

+-----------------------------------------+

12 rows in set (0.00 sec)

该部分一共有12个RocksDB系统表。ROCKSDB_DEADLOCK 展示了RocksDB引擎当前的死锁信息。ROCKSDB_PERF_CONTEXT_GLOBAL、ROCKSDB_PERF_CONTEXT和性能调试相关,默认不开启。下面对其他9个系统表进行一一介绍。

RocksDB系统表

ROCKSDB_TRX 、ROCKSDB_LOCKS

展示当前事务和事务持锁信息,举例如下:

ROCKSDB_GLOBAL_INFO

展示实例的列族信息

如上所示,系统存在4个列族,分别为系统列族_system_,默认列族default,自建的cf_b和cf_c列族。

ROCKSDB_DBSTATS

显示实例的快照个数和时间信息,block cache使用情况

ROCKSDB_CFSTATS

展示每个列族的内存占用情况等信息,这个非常有用的系统表,信息如下所示:

NUM_IMMUTABLE_MEM_TABLE表示当前Immutable MemTable数量;MEM_TABLE_FLUSH_PENDING表示等待被Flush的MemTable数量;COMPACTION_PENDING表示该列族当前等待Compaction的次数;CUR_SIZE_ACTIVE_MEM_TABLE表示当前活跃MemTable的内存大小;CUR_SIZE_ALL_MEM_TABLES表示当前MemTable的总内存大小。

ROCKSDB_CF_OPTIONS

展示了每个列族的配置参数信息,一共有65个配置项。可通过rocksdb_default_cf_options选项在配置文件中配置,可通过rocksdb_update_cf_options进行在线调整。

可通过select * from ROCKSDB_CF_OPTIONS where CF_NAME = 'default';逐一查看。

ROCKSDB_COMPACTION_STATS

展示了每个列族的Compaction状态,展示了每层(Level)以及总(Sum)的Compaction情况,每层均包括如下统计项:

ROCKSDB_COMPACTION_STATS展示的信息与“show engine rocksdb status”中CF_COMPACTION是对应的。

Compaction Stats 就是在 level N 和 N + 1 层做 Compaction的统计,在 N + 1 层输出结果。

  • Level:也就是 LSM 的 level,Sum 表示的是所有 level 的总和,而 Int 则表示从上一次 stats 到现在的数据。
  • Files:有两个值 a/b,a 用来表示当前 level 有多少文件,而 b 则用来表示当前用多少个线程正在对这层 level 做 compaction。
  • Size(MB}:当前 level 总共多大,用 MB 表示。
  • Score:除开 level 0,其他几层的 score 都是通过 (current level size) / (max level size) 来计算,通常 0 和 1 是正常的,但如果大于 1 了,表明这层 level 就需要做 compaction 了。对于 level 0,我们通过 (current number of files) / (file number compaction trigger) 来计算。
  • Read(GB}:对 level N 和 N + 1 做 compaction 的时候总的读取数据量
  • Rn(GB}:对 level N 和 N + 1 做 compaction 的时候从 level N 读取的数据量
  • Rnp1(GB}:对 level N 和 N + 1 做 compaction 的时候从 level N + 1读取的数据量
  • Write(GB}:对 level N 和 N + 1 做 compaction 的时候总的写入数据量
  • Wnew(GB}:新写入 level N + 1 的数据量,使用 (total bytes written to N+1) - (bytes read from N+1 during compaction with level N)
  • Moved(GB}:直接移动到 level N + 1 的数据量。这里仅仅只会更新 manifest,并没有其他 IO 操作,表明之前在 level X 的文件现在在 level Y 了。
  • W-Amp:从 level N 到 N + 1 的写放大,使用 (total bytes written to level N+1) / (total bytes read from level N) 计算。
  • Rd(MB/s}:在 level N 到 N + 1 做 compaction 的时候读取速度。使用 Read(GB) * 1024 / duration 计算,duration 就是从 N 到 N + 1 compaction 的时间。
  • Wr(MB/s}:在 level N 到 N + 1 做 compaction 的时候写入速度,类似 Rd(MB/s)。
  • Comp(sec}:在 level N 到 N + 1 做 compaction 的总的时间。
  • Comp(cnt}:在 level N 到 N + 1 做 compaction 的总的次数。
  • Avg(sec}:在 level N 到 N + 1 做 compaction 平均时间。
  • KeyIn:在 level N 到 N + 1 做 compaction 的时候比较的 record 的数量
  • KeyDrop:在 level N 到 N + 1 做 compaction 的时候直接丢弃的 record 的数量

ROCKSDB_DDL

展示了实例中每个索引所属的数据库(TABLE_SCHEMA)、表(TABLE_NAME),索引的名称(INDEX_NAME)、类型(INDEX_TYPE)、标志(INDEX_FLAGS)、是否为TTL(TTL_DURATION)和索引ID(INDEX_NUMBER),以及索引所在的列族(CF)等。通过查看该表能够全面了解RocksDB存储引擎的Schema信息。

ROCKSDB_INDEX_FILE_MAP

展示了实例的每个SST文件对应哪个索引,哪个列族。举例如下:

如上所示,SST_NAME对应的各个SST文件,均属于ID为0的列族,即default列族。INDEX_NUMBER表示各文件所属的索引ID,比如066531,sst属于ID为570的索引,也就是sbrocks.sbtest8的主键索引。NUM_ROWS表示该文件包括的记录数,DATA_SIZE表示该文件未压缩前的大小。除此之外,还有其他几列信息,在此不一一解析。


上面对MyRocks上我们所能获取的RocksDB统计信息进行了较全面的描述。如果要更加详细的了解RocksDB的实时状态,还可以查看RocksDB数据目录下的LOG文件,它记录了RocksDB的后台操作,在此不展开。下面我们分为内存监控、存储大小与Schema个数监控、用户DML和查询监控、缓存命中率监控、物理IO及命中分布监控和Write Stall监控


内存监控

memtable总大小

slave>show global status like "rocksdb_memtable_total";

+------------------------+-------------+

| Variable_name | Value |

+------------------------+-------------+

| rocksdb_memtable_total | 17550248856 |

+------------------------+-------------+

1 row in set (0.00 sec)

未刷新memtable大小

slave>show global status like "rocksdb_memtable_unflushed";

+------------------------+-------------+

| Variable_name | Value |

+------------------------+-------------+

| rocksdb_memtable_unflushed | 1755024886 |

+------------------------+-------------+

1 row in set (0.00 sec)

block cache大小

slave>select * from information_schema.ROCKSDB_DBSTATS where STAT_TYPE = 'DB_BLOCK_CACHE_USAGE';

+----------------------+-------------+

| STAT_TYPE | VALUE |

+----------------------+-------------+

| DB_BLOCK_CACHE_USAGE | 85898777880 |

+----------------------+-------------+

1 row in set (0.00 sec)

存储与Schema

column family个数

slave>select count(*) from information_schema.ROCKSDB_DDL;

+----------+

| count(*) |

+----------+

| 21 |

+----------+

1 row in set (0.00 sec)

索引个数

slave>select count(*) from information_schema.ROCKSDB_DDL;

+----------+

| count(*) |

+----------+

| 21 |

+----------+

1 row in set (0.00 sec)

表个数

slave>select count(*) from information_schema.ROCKSDB_DDL where INDEX_NAME='primary';

+----------+

| count(*) |

+----------+

| 6 |

+----------+

1 row in set (0.00 sec)

db个数

slave>select count(distinct(TABLE_SCHEMA)) as db_count from information_schema.ROCKSDB_DDL;

+----------+

| db_count |

+----------+

| 5 |

+----------+

1 row in set (0.00 sec)

总数据量

slave>select sum(DATA_SIZE) from information_schema.ROCKSDB_INDEX_FILE_MAP;

+----------------+

| sum(DATA_SIZE) |

+----------------+

| 846431223279 |

+----------------+

1 row in set (0.06 sec)

压缩后总数据量

ddb@db-music18:~/mysql/node-1/.rocksdb$ ls -lh | grep total

total 276G

对路径为$datadir/.rocksdb执行 ls -lh | grep total,统计结果包含WAL日志的大小。不包含WAL日志的统计方法如下:

slave>select count(*) from information_schema.ROCKSDB_INDEX_FILE_MAP where DATA_SIZE > 20000000;

+----------+

| count(*) |

+----------+

| 8949 |

+----------+

1 row in set (0.05 sec)

获得的数值乘于所设置的sst文件大小(即ROCKSDB_CF_OPTIONS系统表中的TARGET_FILE_SIZE_BASE配置项)即为总的不包括WAL的数据量,约为268GB。可以发现跟上述的包括WAL日志的差不大。为了方便,也可以直接拿上面的作为压缩后数据量统计指标。


(以下的统计均从global status中获取)

用户DML和查询操作统计

rocksdb的增删改查过期统计

| rocksdb_rows_deleted | 0 |

| rocksdb_rows_inserted | 23446051 |

| rocksdb_rows_read | 101156487 |

| rocksdb_rows_updated | 101156487 |

| rocksdb_rows_expired | 0 |

点查和范围查询统计

| rocksdb_queries_point | 0 |

| rocksdb_queries_range | 23446050 |

索引覆盖查询统计

| rocksdb_covered_secondary_key_lookups | 0 |

缓存命中率统计

block cache中数据块data block的命中和未命中次数,可以计算百分比

| rocksdb_block_cache_data_hit | 129191964 |

| rocksdb_block_cache_data_miss | 37937609 |

block cache中bloom filter布隆过滤器信息的命中和未命中次数,可以计算百分比

| rocksdb_block_cache_filter_hit | 188767744 |

| rocksdb_block_cache_filter_miss | 985366 |

block cache中布隆过滤器信息的命中和未命中次数,可以计算百分比

| rocksdb_block_cache_index_hit | 169187436 |

| rocksdb_block_cache_index_miss | 16132 |

block cache总命中和未命中次数,可以计算百分比

| rocksdb_block_cache_hit | 487147144 |

| rocksdb_block_cache_miss | 38939107 |

命中和不命中memtable的次数,可计算百分比,具体含义还需要进一步确认

| rocksdb_memtable_hit | 28516553 |

| rocksdb_memtable_miss | 96087125 |

物理IO及命中率统计

读操作未命中cache时,从l0,l1和l2及以上sst文件中读取的次数

| rocksdb_get_hit_l0 | 8855981 |

| rocksdb_get_hit_l1 | 0 |

| rocksdb_get_hit_l2_and_up | 63784572 |

rocksdb用户读写bytes数统计

| rocksdb_bytes_read | 3488808043 |

| rocksdb_bytes_written | 54788451029 |

rocksdb compaction操作读写bytes数统计

| rocksdb_compact_read_bytes | 103158244484 |

| rocksdb_compact_write_bytes | 113094313727 |

Write Stall情况统计

因为达到memtable个数限制而写停止或变慢的次数

| rocksdb_stall_memtable_limit_stops | 0 |

| rocksdb_stall_memtable_limit_slowdowns | 0 |

因为达到l0 sst文件个数限制而写停止或变慢的次数

| rocksdb_stall_l0_file_count_limit_slowdowns | 0 |

| rocksdb_stall_l0_file_count_limit_stops | 13 |

因为达到l0 sst文件个数限制且l0在compaction而写停止或变慢的次数

| rocksdb_stall_locked_l0_file_count_limit_slowdowns | 0 |

| rocksdb_stall_locked_l0_file_count_limit_stops | 13 |

因为达到pending compaction个数限制而写停止或变慢的次数

| rocksdb_stall_pending_compaction_limit_stops | 0 |

| rocksdb_stall_pending_compaction_limit_slowdowns | 2123 |

写停止或变慢的总次数

| rocksdb_stall_total_stops | 13 |

| rocksdb_stall_total_slowdowns | 2123 |

写停止或变慢的总时间

| rocksdb_stall_micros | 28342398809 |


参考资料:

1、Tuning RocksDB - Statistics jianshu.com/p/ddf652aa4

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2019-12-12

  • 博文量
    120
  • 访问量
    483