SequoiaDB监控与开发实践分析

Stella981
• 阅读 508

使用背景

公司近期上线了一个新应用,底层数据库采用了国产的分布式数据库 – **SequoiaDB**。

因为需要将 SequoiaDB 集群纳入到公司的整个监控体系中,所以需要对 SequoiaDB 的状态、性能指标等信息收集起来,然后提供监控系统使用。

SequoiaDB 数据库本身提供了一个图形化的监控界面 – SAC,但是里面的监控项,和我们公司过去常用的指标有很大出入。所以在咨询了 SequoiaDB 的相关人员后,决定自己开发一套监控程序。

SequoiaDB 存储引擎的监控

在 SequoiaDB 数据库,存在两个大的体系,一个是计算层,像我们就是使用了 MySQL 实例,另外一个就是 SequoiaDB 的分布式存储层,也是整个数据库对性能影响最大的部分。

SequoiaDB监控与开发实践分析

关于 MySQL 的监控,公司本来就已经存在一整套完备的监控程序,所以这块就不需要再额外的开发了。但是对于 SequoiaDB 底层的分布式,还是非常有必要将相关指标收集起来的。

SequoiaDB 在监控体系上,其实做得还是比较完整的,只是在展现方式上,还需要再打磨一下。SequoiaDB 底层分布式的所有运行信息,用户都可以通过snapshot,或者是list 命令获取。

我从 SequoiaDB 的技术人员中了解到,其实像 SAC,或者 sdbtop 等这种 SequoiaDB 官方提供的监控工具,实际上也是基于 snapshot 和 list 命令开发。大家可以通过查阅官网信息中心了解更多的方法说明,snapshot 方法介绍 和 list 方法介绍。

2.1 SequoiaDB 的快照说明

在 SequoiaDB 存储引擎中,如果你要查看运行状况,可以通过快照来获取信息。

SequoiaDB 的快照命令非常简答,如果使用它提供的 sdb 客户端,可以这么来执行,例如查看整个集群中,每个 table 的使用情况:

> db.snapshot(SDB_SNAP_COLLECTIONS) { "Name": "foo.bar", "UniqueID": 4294967297, "Details": [ { "GroupName": "group1", "Group": [ { "ID": 0, "LogicalID": 0, "Sequence": 1, "Indexes": 1, "Status": "Normal", "TotalRecords": 1, "TotalDataPages": 1, "TotalIndexPages": 2, "TotalLobPages": 0, "TotalDataFreeSpace": 65432, "TotalIndexFreeSpace": 65486, "TotalDataRead": 1, "TotalIndexRead": 0, "TotalDataWrite": 1, "TotalIndexWrite": 1, "TotalUpdate": 0, "TotalDelete": 0, "TotalInsert": 1, "TotalSelect": 1, "TotalRead": 1, "TotalWrite": 1, "TotalTbScan": 1, "TotalIxScan": 0, "ResetTimestamp": "2020-05-26-13.42.20.163109", "NodeName": "datanode:11820" } ] } ] }

大家从返回的结果就能够了解,首先 SequoiaDB 的分布式存储引擎,在获取快照时,它返回的结果格式为 JSON ,这个和我们过去使用 Oracle 或者 MySQL 数据非常的不同,可能有一些朋友在开始时不大适应。但是当你习惯了JSON 的灵活结构后,你会打开一片新的大陆 。

我给大家演示的例子中,是查询整个集群表级的快照信息。它能够让大家清晰地了解每个table 在各个 group 上的分布,以及它对应的数据读,索引读这类关键信息的瞬时绝对值。当然,如果大家直接这么查看信息,估计大家眼睛都要看瞎,所以在后续的工具跟进上,SequoiaDB 数据库还需要多多努力的。

2.2 SequoiaDB SQL 快速处理

如果大家已经在使用SequoiaDB 存储引擎提供的 snapshot 和 list 功能了,那么你是否也发现了一个问题,sdb 客户端提供的 api 命令,执行起来的计算能力实在太弱了,例如我要关联把 SDB_SNAP_SESSIONS 快照(http://doc.sequoiadb.com/cn/sequoiadb-cat\_id-1479173713-edition\_id-304)和 SDB_SNAP_TRANSACTIONS 快照(http://doc.sequoiadb.com/cn/sequoiadb-cat\_id-1479173720-edition\_id-304) 关联起来,查看当前 SequoiaDB 存储引擎中,到底有哪些事务在等待锁。这个时候,单纯使用 api 就会痛苦万分,因为要自己手工编写一个关联程序。我相信大部分的 DBA 朋友都会怀念那些单纯使用 SQL 命令的时光。

通过自己不断的努力(翻官网信息中心),终于找到了一种优雅的方式来解决,就是 sql 语法的监控视图 (http://doc.sequoiadb.com/cn/sequoiadb-cat_id-1559546719-edition_id-304)

例如刚才的提出的问题,就可以通过这个 sql 命令获取信息:

> db.exec("select trans.NodeName as node, session.LastOpType as lastOpType, session.LastOpInfo as lastOpInfo from $SNAPSHOT_TRANS as trans inner join $SNAPSHOT_SESSION as session on trans.RelatedID = session.RelatedID where trans.WaitLock.CSID is not null ") { "node": "datanode:11820", "lastOpType": "GETMORE", "lastOpInfo": "ContextID:297, NumToRead:-1" } { "node": "datanode:11820", "lastOpType": "UPDATE", "lastOpInfo": "" }

SequoiaDB 存储引擎中这个简易版的 SQL 语法解析,对于日常的操作和运维监控来说,已经达到了事半功倍的效果了。

2.3 开发语言选择

SequoiaDB 存储引擎,支持多种开发语言获取引擎的监控信息,包括常见的:Java、PHP、Python、C++、C等等。大家在开发时,可以在 SequoiaDB 官网中下载对应的驱动包,在开发和编译时,将 SequoiaDB 的驱动包加入到 ClassPath 就可以了。

对于我个人来说,虽然 Java 很香,但是我还是选择了 REST 接口作为我的程序与 SequoiaDB 引擎的交互方式。REST 接口虽然不像 Driver 驱动使用那么便利,但是它胜在脱离语言与环境的要求,我可以在任何地方调用它,并且获得的结果都是一样的。

引玉抛砖引玉的Demo程序

为了给大家演示,我基于 SequoiaDB 提供的 REST 接口,使用 Python 语言做了一个能够实时监控 SequoiaDB 中某张表的数据读、写情况的小程序,算是回馈 SequoiaDB 社区的小贡献。

程序的源码可以从:

https://github.com/yuki0703/Demo

Github项目中获取。

程序的逻辑非常简单,就是通过 SequoiaDB 提供的 REST 接口,通过 SequoiaDB 的 SQL 语法中的监控视图方法,获取某张表的快照信息,然后通过计算1秒以内的数值差距,得出该表每秒钟所执行数据操作。

程序的 help 信息如下:

SequoiaDB Monitor

optional arguments: -h, --help show this help message and exit --host HOST coord host -u USERNAME username -p PASSWORD password -t TABLE table name

监控 SequoiaDB 某张表的效果如下:

后记

整理来看,SequoiaDB 所提供的接口还是很丰富的,但是在可视化监控界面上,还需要多多努力,能够直接提供对接目前市面上大部分的监控系统,那样就更加完美了。但是不管怎么说,能够做出一款属于国人自己的分布式数据库,还是非常值得大家敬佩和学习的。

共勉之!

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这