1. 程式人生 > >為何要對開源mongodb資料庫核心做二次開發

為何要對開源mongodb資料庫核心做二次開發

  0. 手把手教你做中介軟體、高效能伺服器、分散式儲存技術交流群

        手把手教你做中介軟體、高效能伺服器、分散式儲存等(redis、memcache、nginx、大容量redis pika、rocksdb、mongodb、wiredtiger儲存引擎、高效能代理中介軟體),git地址如下:   https://github.com/y123456yz/middleware_development_learning

 

       Mongodb資料庫版本包含企業版本和社群版本,他們的區別是企業版本相比有更多功能,使用企業版本必須購買付費,所以mongodb部分核心功能沒有開源。為了增強mongodb叢集穩定性,企業需要對開源版本核心進行二次開發,主要包括以下功能模組的開發(增加以下功能後,會有很好的收益):

  1. 各種操作時延統計。
  2. Mongos代理慢日誌記錄。
  3. 普通使用者許可權細化控制,危險操作過濾。
  4. 危險操作日誌審計。
  5. 所有增刪改操作sql非同步日誌記錄。
  6. mongodb增加熱備功能。

1. 各種操作時延統計

    開發背景:mongodb社群版本沒有各種時延統計功能,例如想看insert、update、delete、find操作的各種詳細時延統計,開源版本沒有該功能。

    解決辦法:給各種增、刪、查、改操作增加詳細的平均時延、最大時延等統計。

    收益:1. 避免扯皮(例如之前線上某個業務線有一次估值,客戶端時延提升了數倍,業務方抖動厲害,但是業務方時延監控包括了呼叫mongodb的時延及其他業務邏輯,這時候就區分不出來是mongodb抖動引起還是其他業務邏輯抖動引起)。2. 主動發現mongodb抖動問題,沒有該功能前,mongodb抖動完全只能靠業務方發現,或者通過mongodb慢日誌發現,但是mongodb慢日誌記錄得是100ms以上的操作,不能精確的反映各種時延問題。

 

2. mongos慢日誌記錄

    開發背景: 由於mongos代理後端可以由多個sharding分片,例如mongos後端有50個sharding分片,如果我要分析整個mongodb叢集的慢日誌資訊,那麼就必現去分析後端50個sharding的慢日誌,由於慢日誌在每個sharding的主、從上都可能產生,如果每個sharding分片是一主兩從架構,那麼久必現分析3*50個mongo資料庫例項。分析過程複雜繁瑣。

    解決辦法: 由於代理預設部署就3個例項,直接在mongos代理攔截所有流量,記錄下和後端sharding的詳細慢日誌即可。

    收益:簡化了慢日誌收集分析過程,可以更快速的發現不合理的查詢、寫入等引起的慢日誌。

 

3. 普通使用者許可權細化控制、危險操作過濾

      開發背景: mongodb普通使用者許可權預設擁有所有操作許可權(包括刪庫、刪表、建索引等),除非在建立賬號的時候通過privileges來指定actions,如果通過privileges來指定actions會非常麻煩,因為mongodb有數百個不同actions操作。此外,業務方還得根據自己實際情況來梳理程式碼使用的action操作,如果想增加某種action,還得提各種申請新增,限制了業務方使用靈活性。

       解決辦法: mongodb中增加普通使用者許可權控制並對各種危險操作進行過濾,只要是普通使用者訪問mongodb資料庫,就禁止其刪庫、刪表、建庫、建表、建索引等危險操作。

       收益: 通過在mongodb中增加普通使用者許可權控制、危險操作過濾,增強了mongodb許可權控制及穩定性功能,同時也使得業務方可以隨意使用各種不同的action,使用也更加靈活。

 

4. 危險操作日誌審計

      開發背景: 資料庫管理人員具有資料庫root許可權,擁有刪庫、刪表等危險操作許可權,如果誤操作,將會帶來巨大損失。如果某個庫被惡意刪除,怎麼確定是由那個使用者刪除的?通過那臺客戶端登入的,什麼時候做了該操作?

       解決辦法: 增加危險操作日誌審計功能,記錄這些危險操作的詳細資訊,包括使用者、IP地址、key資訊等。

       收益: 快速定位是由哪位管理員惡意操作引起。此外,如果是業務方使用了刪庫、刪表的操作,同樣會記錄下整個詳細操作資訊。

 

5. 所有增刪改操作sql非同步日誌記錄

      開發背景:  場景1. 業務方感覺某個資料丟了,懷疑是資料庫丟資料了。但是mongodb管理員覺得mongodb很穩定,不存在丟資料的情況,管理員覺得是客戶端自己刪除了,究竟是業務方自己刪的還是mongodb丟資料呢? 場景2. 業務方在某個時間段做了幾個誤操作,誤刪除了一些資料,想找出在這個時間段內誤刪除的具體資料。

       解決辦法: 把所有的增、刪、改操作過程詳細記錄下來。

       收益: 1. 避免扯皮。2.業務方想要的任意時間段的操作資料都可以獲取出來,便於他們進行問題分析排查。

 

6. 給mongodb增加熱備功能

      開發背景: mongodb社群版本沒有熱備功能,如果需要備份資料庫資料,需要對某個Mongod例項下線進行冷備。或者通過mongodump工具進行主從資料備份(該工具就是模擬mongodb的slave先做全量資料同步,然後拉取Oplog進行增量同步)。如果是冷備,需要停機某個副本,等cp拷貝整個mongodb資料完成後,然後在繼續上線,這種備份方式需要下線例項對業務影響比較大。如果是通過mongodump方式模擬slave來拉取資料,在全量資料拉取過程中,會佔用較大頻寬,業務方時延會有較大抖動。此外,通過mongodump工具拉取資料非常慢,線上拉取400G資料需要10個小時左右,如果需要增加一個slave,通過這種方式完全不可接受。

    解決辦法: 藉助wiredtiger儲存引擎機制,增加熱備功能。

    收益: 1. 熱備期間對業務影響較小。2. 備份資料時間降低百倍數量級,例如400G資料通過mongodump方式需要10小時,但是通過熱備方式只需要幾分鐘即可。

 

   如果對mongodb資料庫和wiredtiger儲存引擎原始碼感興趣,可以參考如下注釋:

https://github.com/y123456yz/reading-and-annot