mongodb时间范围查询少8个小时_为何要对开源mongodb数据库内核做二次开发
關于作者
前滴滴出行技術專家,現任OPPO文檔數據庫mongodb負責人,負責oppo千萬級峰值TPS/十萬億級數據量文檔數據庫mongodb內核研發及運維工作,一直專注于分布式緩存、高性能服務端、數據庫、中間件等相關研發。后續持續分享《MongoDB內核源碼設計、性能優化、最佳運維實踐》,Github賬號地址:https://github.com/y123456yz
Mongodb數據庫版本包含企業版本和社區版本,他們的區別是企業版本相比有更多功能,使用企業版本必須購買付費,所以mongodb部分核心功能沒有開源。為了增強mongodb集群穩定性,企業需要對開源版本內核進行二次開發,主要包括以下功能模塊的開發(增加以下功能后,會有很好的收益):
1. 各種操作時延統計
開發背景:mongodb社區版本只有mongod有讀寫時延統計,沒有各種詳細時延統計功能,同時mongos沒有時延統計,例如想看insert、update、delete、find操作的各種詳細時延統計,開源版本沒有該功能。
解決辦法:給各種增、刪、查、改操作增加詳細的平均時延、最大時延、P99、P95等統計。
收益:1. 避免扯皮(例如之前線上某個業務線有一次故障,客戶端時延提升了數倍,業務方抖動厲害,但是業務方時延監控包括了調用mongodb的時延及其他業務邏輯,這時候就區分不出來是mongodb抖動引起還是其他業務邏輯抖動引起)。2. 主動發現mongodb抖動問題,沒有該功能前,mongodb抖動完全只能靠業務方發現,或者通過mongodb慢日志發現,但是mongodb慢日志記錄得是100ms以上的操作,不能精確的反映各種時延問題。
2. mongos慢日志記錄
開發背景: 由于mongos代理后端可以由多個sharding分片,例如mongos后端有50個sharding分片,如果我要分析整個mongodb集群的慢日志信息,那么就必現去分析后端50個sharding的慢日志,由于慢日志在每個sharding的主、從上都可能產生,如果每個sharding分片是一主兩從架構,那么久必現分析3*50個mongo數據庫實例。分析過程復雜繁瑣。如果是分片模式,mongod記錄的慢日志少了代理mongos到mongod這一段的時延。
解決辦法: 由于代理默認部署就3個實例,直接在mongos代理攔截所有流量,記錄下和后端sharding的詳細慢日志即可。
收益:簡化了慢日志收集分析過程,可以更快速的發現不合理的查詢、寫入等引起的慢日志。
3. 普通用戶權限細化控制、危險操作過濾
開發背景: mongodb普通用戶權限默認擁有所有操作權限(包括刪庫、刪表、建索引等),除非在創建賬號的時候通過privileges來指定actions,如果通過privileges來指定actions會非常麻煩,因為mongodb有數百個不同actions操作。此外,業務方還得根據自己實際情況來梳理代碼使用的action操作,如果想增加某種action,還得提各種申請添加,限制了業務方使用靈活性。
解決辦法: mongodb中增加普通用戶權限控制并對各種危險操作進行過濾,只要是普通用戶訪問mongodb數據庫,就禁止其刪庫、刪表、建庫、建表、建索引等危險操作。
收益: 通過在mongodb中增加普通用戶權限控制、危險操作過濾,增強了mongodb權限控制及穩定性功能,同時也使得業務方可以隨意使用各種不同的action,使用也更加靈活。
4. 危險操作日志審計
開發背景: 數據庫管理人員具有數據庫root權限,擁有刪庫、刪表等危險操作權限,如果誤操作,將會帶來巨大損失。如果某個庫被惡意刪除,怎么確定是由那個用戶刪除的?通過那臺客戶端登錄的,什么時候做了該操作?
解決辦法: 增加危險操作日志審計功能,記錄這些危險操作的詳細信息,包括用戶、IP地址、key信息等。
收益: 快速定位是由哪位管理員惡意操作引起。此外,如果是業務方使用了刪庫、刪表的操作,同樣會記錄下整個詳細操作信息。
5. 所有增刪改操作異步日志記錄
開發背景: 場景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方式需要數小時,但是通過熱備方式只需要幾分鐘即可。
7. 鏈接耗光,無法登陸mongod和mongos實例
可以新增特定端口或者特定IP放開最大鏈接數限制
8. 其他
總結
以上是生活随笔為你收集整理的mongodb时间范围查询少8个小时_为何要对开源mongodb数据库内核做二次开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2440 万波兰兹罗提,《幽灵行者 2》
- 下一篇: 用人之“道”