您好,登錄后才能下訂單哦!
公司近期上線了一個新應用,底層數據庫采用了國產的分布式數據庫 – SequoiaDB。
因為需要將 SequoiaDB 集群納入到公司的整個監控體系中,所以需要對 SequoiaDB 的狀態、性能指標等信息收集起來,然后提供監控系統使用。
SequoiaDB 數據庫本身提供了一個圖形化的監控界面 – SAC,但是里面的監控項,和我們公司過去常用的指標有很大出入。所以在咨詢了 SequoiaDB 的相關人員后,決定自己開發一套監控程序。
在 SequoiaDB 數據庫,存在兩個大的體系,一個是計算層,像我們就是使用了 MySQL 實例,另外一個就是 SequoiaDB 的分布式存儲層,也是整個數據庫對性能影響最大的部分。
關于 MySQL 的監控,公司本來就已經存在一整套完備的監控程序,所以這塊就不需要再額外的開發了。但是對于 SequoiaDB 底層的分布式,還是非常有必要將相關指標收集起來的。
SequoiaDB 在監控體系上,其實做得還是比較完整的,只是在展現方式上,還需要再打磨一下。SequoiaDB 底層分布式的所有運行信息,用戶都可以通過snapshot,或者是list 命令獲取。
我從 SequoiaDB 的技術人員中了解到,其實像 SAC,或者 sdbtop 等這種 SequoiaDB 官方提供的監控工具,實際上也是基于 snapshot 和 list 命令開發。大家可以通過查閱官網信息中心了解更多的方法說明,snapshot 方法介紹 和 list 方法介紹。
在 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 驅動使用那么便利,但是它勝在脫離語言與環境的要求,我可以在任何地方調用它,并且獲得的結果都是一樣的。
為了給大家演示,我基于 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 nam
監控 SequoiaDB 某張表的效果如下:
整理來看,SequoiaDB 所提供的接口還是很豐富的,但是在可視化監控界面上,還需要多多努力,能夠直接提供對接目前市面上大部分的監控系統,那樣就更加完美了。但是不管怎么說,能夠做出一款屬于國人自己的分布式數據庫,還是非常值得大家敬佩和學習的。
共勉之!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。