监控应用系统的实时TPS(每秒交易笔数)和成功率是运维的基础工作,有了业务的实时监控才能第一时间发现问题,所以说第一时间发现问题是一方面,第一时间能解决问题又是另外一方面,发现问题在前,所以这里先分享下怎样对于基于分布式数据库系统去展示它的实时TPS及成功率。
先看下一种简单情况,应用系统只使用一个数据库,这个时候实时TPS及成功率该怎么统计。这里有2种方法:
(1)在数据库中采集一段时间内的成功交易笔数及交易总笔数,将总笔数除以时间就是TPS,将这段时间内的成功交易笔数除以总笔数就是成功率。执行sql语句:
select sum(case when ‘成功条件’ then 1 else 0 end ) as succ,count(*) as total from table where time >’CURRENT_TIMESTAMP-$loop’ and time
计算TPS:total/$loop
计算成功率:succ*100/total%
(2)按时间戳精确到秒来列出统计情况,执行sql语句:
select substr(time,,精确到秒,) as time ,sum(case when ‘成功条件’ then 1 else 0 end) as succ,count(*) from table where time>CURRENT_TIMESTAMP - $loop and time
展示效果:
HH:MM:SS1:成功笔数1总笔数1
HH:MM:SS2:成功笔数2总笔数2
HH:MM:SS3:成功笔数3总笔数3
如果是分布式数据库的情况呢?也就是说一个应用系统使用了不止一个数据库,现在常见的大型业务系统多数是使用分布式数据库来提高性能,类似这样的系统架构:
对于这样的架构部署,一笔交易会按照一定的分库规则写入分布式库中的一个,若仍使用采用上述的方法(1)则显得太过粗略,某一秒在各个数据库中的交易各不相同,直接取平均值容易导致较大的误差,这里须采用方法(2),但是采用方法(2)时,分布式数据库会同时返回各个库的结果,这里需要我们对返回结果再做一次“精加工”。
具体的步骤如下:
1、按时间戳精确到秒来列出统计情况,执行sql语句:
select substr(time,,精确到秒,) as time ,sum(case when ‘成功条件’ then 1 else 0 end) as succ,count(*) from table where time>CURRENT_TIMESTAMP - $loop and time
去除标题头后得到类似如下结果:
这里我们可以看到,不同于单一数据库,sql给我们返回了各个库的查询结果。
2、求成功率,合并计算第二列(这里用到了awk的数组方法):
3、求TPS,合并计算第三列:
4、将得到的两个文件按第一列时间戳进行合并:
5、根据结果文件,我们可以得到时间戳、TPS、成功笔数:
6、最后我们进行成功率的计算及展示:
执行效果:
领取专属 10元无门槛券
私享最新 技术干货