重要的内容
MongoDB 的主備節點在運作過程中是不固定的,執行個體重新開機、更新、節點故障等都有可能導緻主備切換,在生産環境應該使用副本集的方式來正确連接配接MongoDB 來實作高可用。
連接配接問題
使用者可通過 DMS 或 mongo shell 連接配接 MongoDB 雲資料庫,以下場景都基于使用者使用 mongo shell 連接配接資料庫。
Q: 連接配接執行個體提示網絡逾時?

通過 telnet 來确認是否是網絡不通導緻的,例如
telnet dds-uf69ba5cf6e123442.mongodb.rds.aliyuncs.com 3717
網絡不通可能的原因:
1. ECS 跟 MongoDB 節點不在同一個可用區
2. ECS 跟 MongoDB 節點不在同一個 vpc 環境
Q: 連接配接執行個體提示鑒權失敗?
可能的原因
1. 密碼錯誤,可在控制台重置 root 密碼
2. 連接配接的使用者跟資料庫不比對,比如 root 使用者是 admin 資料庫下的使用者,則使用 root 連接配接時,必須指定鑒權資料庫為 admin3. 用戶端版本過低,mongo shell 版本必須是 3.0+,其他語言用戶端的版本要求參考 Driver 相容性文檔
Q: 連接配接 Secondary 執行執行指令時,提示 slaveOk=false 錯誤?
預設情況下,MongoDB 的讀寫請求都必須到 Primary 節點,Secondary 預設是
不可讀的,除非用戶端顯式的指定 Secondary 節點可讀(通過設定
readPreference)。
mongoshell 連接配接時,可以執行 rs.slaveOk()來指定備可讀
如果想 mongo shell 一直連接配接到 Priamry 節點,可通過如下方式連接配接
mongo --host 副本集名稱/節點 1,節點 2 --authenticationDatabase admin -u
system -p xxx
例如
mongo --host
mg-100101/dds-uf69ba5cf6e123442.mongodb.rds.aliyuncs.com:3717,dds-uf6
9ba5cf6e123441.mongodb.rds.aliyuncs.com:3717 --authenticationDatabase
admin -u system -p xxx
注意:MongoDB 的主備節點在運作過程中是不固定的,執行個體重新開機、更新、節點故障等都有可能導緻主備切換,在生産環境應該使用副本集的方式來正确連接配接MongoDB 來實作高可用。
Q: 連接配接時提示
上述錯誤通常是執行個體的連接配接數已經達到上限,無法再建立更多的網絡連接配接,可在控制台檢視執行個體連接配接數的使用情況确認。使用者使用執行個體時應該合理的規劃并控制執行個體的連接配接數,避免因為連接配接數耗盡而無法連接配接執行個體,如果業務上的
确需要更多的網絡連接配接,則需要更新執行個體的規格。連接配接數的管理請參考下面『連
接數問題』部分。
連接配接數問題
Q: 如何檢視目前連接配接
1. 登入阿裡雲控制台檢視
2. 使用 mongo shell 連接配接執行個體,執行如下指令,其中 current 代表目前已建立連接配接數,available 代表目前可用連接配接數,internal*的連接配接用于内部管理,使用者可忽略。
Q: 如何檢視目前連接配接主要來自哪些 ECS 機器?
mongoshell 或 DMS(如果連接配接數已滿,則隻能通過 DMS 來登入檢視)連接配接執行個體,執行db.runCommand({currentOp: 1, $all: true}),就能輸出所有跟該執行個體建立的所有連接配接情況,其中 client 字段包含了 ECS 的 ip 位址資訊。
有了上述結果,使用者就可以根據來源 ip 做進一步的分析,得出各個 ECS 跟執行個體分别建立了多少連接配接等資訊。
Q: 生産環境連接配接數快滿了,如何限制每個 ECS 到執行個體的連接配接數量?
MongoDB 基本所有的 driver 都支援通過 Connection String URI 來連接配接執行個體,雲資料庫的連接配接 URI 已為使用者在控制上生成好,加上密碼資訊就能直接使用。
如果采用 URI 來連接配接執行個體的,在 URI 末尾加上&maxPoolSize=xx 來限制到執行個體的連接配接數即可,比如你有 10 台 ECS 并發通路執行個體,執行個體的最大連接配接數為 1000,那麼每個 ECS 上的連接配接池的數量要控制在 100 以内。
不同語言的用戶端可能封裝了不通的連接配接方式,但也一定有方法指定連接配接池的數量限制,具體參考各語言用戶端的 api 文檔。
附在高問題
用率很高,想看看執行個體正在執行什麼
Q:CPU使用率很高,想看看執行個體正在執行什麼操作?
造成執行個體負載高的典型 case
1. 并發請求的量太大,超出目前規格的服務能力
2. 查詢集合時,沒有合理的建索引,導緻全表掃描或排序
3. 正在跑一些計算量很大的 mapreduce 或者 aggregation 任務
正在執行的操作都包含一個 opid 字段,使用者可以根據 opid 字段直接 kill 掉對應的操作
mongo-test:PRIMARY> db.killOp(opid)
仍然無法解決問題
請檢視 FAQ 文檔,或送出工單。 負載高問題
以上内容來自于《雲資料庫運維實戰手冊》,可點選
https://developer.aliyun.com/topic/download?id=8198下載下傳完整版