支撐百億級訪問的MongoDB線上實踐指南-鏈接篇

 

 

Hello!很久不見~~ MongoDB實踐指南又如期而至啦!此係列文章是 360DBA 團隊在平常運維中積累的一些 MongoDB 使用注意事項,還有一些業務所在線上使用中遇到的問題以及解決方案。php

 

MongoDB讀寫策略讀優先策略讀優先策略種類以下:1RP_PRIMARY2RP_PRIMARY_PREFERRED3RP_SECONDARY4RP_SECONDARY_PREFERRED5RP_NEAREST1根據業務需求和場景,選擇合適的讀優先策略,原則以下:1.若是讀寫一致性要求很高,建議讀優先策略選擇主庫優先或者只讀主庫2.若是寫請求很高,建議讀優先策略選擇從庫優先 通常場景,能夠不設置讀優先策略,默認爲就近優先使用讀優先策略:【示例1】  // Options Description -
 // http://www.php.net/manual/zh/mongoclient.construct.php  $options = array(     'replicaSet' => $replicaSet, //    'username' => $username,       'password' => $password,    'readPreference' =>     MongoClient::RP_SECONDARY   //  );2寫策略:默認狀況下,類 MongoClient 寫策略爲 w=1,類 mongo 寫策略爲 w=0 這種狀況寫性能很低,安全性很高 通常狀況下,建議選擇 mongoclient ,默認是w=1,不須要人爲設置;若是要求寫性能很高,安全性要求不高,能夠選擇 mongo 類,或者使用 mongoclient, 手動設置 w=01. w=1 確認主庫上寫入數據成功,能夠保證數據(確實)寫入到了磁盤2. w=0 不須要確認主從節點數據已經寫入,寫性能最高,可是,寶能保證數據寫入磁盤,安全性低3. w=N 須要確認N個數據節點寫入到了磁盤MongoDB用戶驗證爲了保證咱們 MongoDB 數據庫的安全性,目前強制開啓驗證 目前,咱們的用戶權限是管理權限(受權db是admin) 程序和命令行使用方式略有不一樣1命令行:$mongo -uusername -ppassword ip:port/adminusername,password,ip,port 替換爲具體的值2程序以 php 爲例,程序訪問 MongoDB,是經過驅動的。驅動中,已經默認受權 db 是 admin 了因此,驅動中不須要配置受權 dbMongoDB集羣號設置1若是 MongoDB 架構是副本集(咱們默認的結構),須要在程序配置中加上replicaSet 參數,DBA 會給出該參數取值集羣參數設置,若是不設置該參數,會出現報錯,影響業務訪問【案例2】以前不少業務,訪問mongodb副本集,不設置replicaset參數,致使程序出現相似「not master...」的報錯。緣由是: mongodb的驅動根據mongodb的架構不一樣,返回鏈接的邏輯不一樣。 所以,驅動返回給業務的ip有多是主庫也有多是從庫;當寫操做時,遇到從庫,就會報錯了。 寫請求落到主庫上,業務不報錯,因此,此時,問題表現爲時而正常,時而報錯。2若是 MongoDB 是單點或者 MongoS 架構, 程序配置中不要設置 replicaset參數MongoDB數據庫鏈接1以 php 爲例:不要濫用 new MongoClient,比較高效的作法是:執行一個 new MongoClient, 而後執行多個讀寫操做,這樣避免由於 lvs 沒法複用鏈接致使性能降低【案例3】有幾個業務,讀寫請求量很高,程序經過lvs訪問mongodb服務,致使出現大量超時,甚至鏈接數達到上限 簡單來講,是由於php經過lvs訪問mongodb,沒法複用鏈接,致使每次都須要創建新鏈接,(嚴重)影響了讀寫性能當第一次執行new MongoClient時,鏈接管理器manager會根據ip,port等信息創建hash;初始化函數會調用 mongo_get_connection_single()函數,由於是第一次鏈接,因此,該函數返回爲null;而後,調用mongo_connection_create()函數,建立鏈接,同時,把該鏈接註冊到鏈接管理器中,接下來,調用mongo_discover_topology()函數,該函數會吧mongodb集羣中各個數據節點創建的鏈接註冊到鏈接管理器中, 同時校驗鏈接管理器中的各個鏈接;由於lvs ip不是mongodb的ip,此時,將從鏈接管理器中銷燬掉以lvs ip創建的鏈接; 第二次乃至後面的訪問,每次從庫鏈接管理器中,都沒法匹配到鏈接,因此,每次道須要從新創建鏈接,致使性能開銷很大, 讀寫請求處理能力降低,尤爲是讀寫請求量很高的場景,該問題顯得更加突出。mongodb

 

END數據庫

 

 

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

相關文章
相關標籤/搜索