关键字:
KWR、人大金仓、KingbaseES
KWR 是KingbaseES提供的用于检测性能的工具
- KWR原理概述
- KWR插件会创建一系列KWR表,这些KWR表存储了KWR快照采集到的所有信息,以下就是KWR表之间的关系图
- 在一系列的KWR表中,kwr_snotshots会记录快照id,其它所有表都会将自己的快照id列作为外键引用kwr_snapshots表的快照id。
- 生成kwr快照的方式就是从共享内存中收集本次的统计信息,用本次的统计信息与上一次记录的统计信息做差,得到的差值就是本次的KWR快照。
- 这个过程主要涉及到两种类型的表,一种表就是普通的kwr_snapshots表另一种表则是kwr_last_snapshos表,其中kwr_last_snapshots表具有特殊要求,它只会存储当前时刻上一次的快照的结果,也就是说该表在常规状态下仅存在一条记录。
- 但是在生成快照时会以kwr_last_snapshots表作为跳板,将本次收集到的统计信息以及生成的快照id一同存入kwr_last_snapshots表中,也就是说现在kwr_last_snapshot表会存在两条记录,其中一条是上一次的kwr快照,而另一条则是收集到的统计信息以及新的kwr快照id组成的元组,下一步会使用新收集到的kwr统计信息与该表原本存储的上一条记录做差,将得到的差值存入到kwr_snapshots表中作为新的kwr快照,最后要从kwr_last_snapshots表中删除上一时刻的快照信息,继续保证kwr_last_snapshots表仍仅存在一条数据,值得注意的是在获取上一条快记录时会对该条记录上锁,也就是说仅允许一个进程获取上一条快照记录,同时鉴于last表中仅存在一条记录,因此可以认为在同一时刻仅允许一个进程造快照,多个多进程同时造快照时只能成功一个其它的进程都必须失败。
- 因此总结提炼一下KWR快照的生成流程就是:
- 以上是生成快照的常规做法,但是通过观察kwr的表关系图,不难发现snap_stat_statement不存在last表,这是因为该表的统计信息来自于pg_stat_statment视图,而每次造快照时都会调用reset函数清这个视图的全部数据,因此可以认为每次读到的统计信息就是差值,所以该表不存在last表,这是唯一的一例特殊情况。
- kwr生成快照的方式已经讲完了,接下里就是出kwr报告的方式,当集群中存在复数个kwr快照时,就可以调用report接口返回kwr报告了,报告可以选择txt以及html格式的报告,出kwr报告的report函数它接受两个变量一个是开始快照的快照id另一个是结束快照的快照id,出报告的方式很简单,kwr插件会遍历开始快照和结束快照之间的所有快照,并把每一个快照的值拿出来累加处理,累加的最终结果将作为kwr报告呈现给用户。
- kwr插件它还支持自动创建kwr快照的功能,具体流程就是存在一个KWR Collector进程,该进程进程会判断是否创建了kwr插件,如果没创建就用SPI接口造一个,否则就定时执行SPI接口创建kwr快照。