1. 程式人生 > 實用技巧 >SequoiaDB監控與開發實踐分析

SequoiaDB監控與開發實踐分析

使用背景

公司近期上線了一個新應用,底層資料庫採用了國產的分散式資料庫 – SequoiaDB

因為需要將 SequoiaDB 叢集納入到公司的整個監控體系中,所以需要對 SequoiaDB 的狀態、效能指標等資訊收集起來,然後提供監控系統使用。

SequoiaDB 資料庫本身提供了一個圖形化的監控介面 – SAC,但是裡面的監控項,和我們公司過去常用的指標有很大出入。所以在諮詢了 SequoiaDB 的相關人員後,決定自己開發一套監控程式。

SequoiaDB 儲存引擎的監控

在 SequoiaDB 資料庫,存在兩個大的體系,一個是計算層,像我們就是使用了 MySQL 例項,另外一個就是 SequoiaDB 的分散式儲存層,也是整個資料庫對效能影響最大的部分。

關於 MySQL 的監控,公司本來就已經存在一整套完備的監控程式,所以這塊就不需要再額外的開發了。但是對於 SequoiaDB 底層的分散式,還是非常有必要將相關指標收集起來的。

SequoiaDB 在監控體系上,其實做得還是比較完整的,只是在展現方式上,還需要再打磨一下。SequoiaDB 底層分散式的所有執行資訊,使用者都可以通過snapshot,或者是list 命令獲取。

我從 SequoiaDB 的技術人員中瞭解到,其實像 SAC,或者 sdbtop 等這種 SequoiaDB 官方提供的監控工具,實際上也是基於 snapshot 和 list 命令開發。大家可以通過查閱官網資訊中心瞭解更多的方法說明,snapshot 方法介紹和 list 方法介紹。

2.1SequoiaDB 的快照說明

在 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.2SequoiaDB 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所提供的介面還是很豐富的,但是在視覺化監控介面上,還需要多多努力,能夠直接提供對接目前市面上大部分的監控系統,那樣就更加完美了。但是不管怎麼說,能夠做出一款屬於國人自己的分散式資料庫,還是非常值得大家敬佩和學習的。

共勉之!