首页 > > > MyRocks状态监控参考手册
对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状态信息的来源主要有3个。如下所示:
1、show engine rocksdb status\G
与InnoDB一样,MySQL也为RocksDB提供了引擎层统计信息的汇总,信息量非常丰富。包括:
STATISTICS(全局状态统计):状态值较多,与“show global status like "rocksdb%"”重合度较高。详见后续小节的描述。
DBSTATS(DB级别的状态统计)

这是实例级别的CF Compaction汇总信息。Cumulative 是到现在为止累加的统计,Interval 则是从上一次统计到现在的变更数据。每个大项里面的各小项含义:
Uptime:从启动到现在的时间
writes:
WAL:
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_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 层输出结果。
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)
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中获取)
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 |
读操作未命中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 |
因为达到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 https://www.jianshu.com/p/ddf652aa4882
原文作者:;如有侵权,请联系管理员删除。