【mongoDB】mongoDB的正確的連接方式

一、單機(jī)版


# systemctl? status mongod

# cat? /etc/mongod.conf


未開(kāi)啟認(rèn)證


在admin庫(kù)創(chuàng)建數(shù)據(jù)庫(kù)超管用戶

# echo -e "use admin;\ndb.createUser({user:\"root\",pwd:\"Root@123\",roles:[ { role:\"userAdminAnyDatabase\",db:\"admin\"}]})" |? mongo? --host 127.0.0.1? --port? 27017


開(kāi)啟認(rèn)證,用超管用戶創(chuàng)建其他用戶

開(kāi)啟認(rèn)證


# systemctl? restart mongod


# mongo? --host 127.0.0.1 -u root -p "Root@123"? --authenticationDatabase? admin


# echo -e "use admin;\n show tables;" |? mongo? --host 127.0.0.1 -u root -p "Root@123" --authenticationDatabase admin



二、復(fù)制集


獲取集合(實(shí)例)名

$ echo -e "rs.status()['set']" |? /path/to/mongo --quiet "mongodb://${username}:${password}@${ip}:${port}"

$ echo -e "rs.status()['set'];" |? /path/to/mongo --quiet "mongodb://${username}:${password}@${ip}:${port}"

$ echo -e "rs.status()['set'];\n" |? /path/to/mongo --quiet "mongodb://${username}:${password}@${ip}:${port}"

${ip}:${port} 可以是主節(jié)點(diǎn)的IP和端口,也可以是從節(jié)點(diǎn)的IP和端口

注: --quiet? 參數(shù)可以去掉相關(guān)數(shù)據(jù)庫(kù)的連接信息輸出

連接mongoDB復(fù)制集


$ echo -e "rs.status()"? |? /path/to/mongo? --quiet? "mongodb://${username}:${password}@${primary_ip}:${port}/?replicaSet=${set_name}"


$ echo -e "rs.status()"? |? /path/to/mongo? --quiet? "mongodb://${username}:${password}@${primary_ip}:${port},${secondary_ip}:${port}/?replicaSet=${set_name}"


$ echo -e "rs.status()"? |? /path/to/mongo? --quiet? "mongodb://${username}:${password}@${primary_ip}:${port},${secondary01_ip}:${port},${secondary02_ip}:${port}/?replicaSet=${set_name}"


注:

1. 主動(dòng)仲裁,寫(xiě)主從 ip port,用逗號(hào)隔開(kāi)

2. 主從從,寫(xiě)主從從? ip port,用逗號(hào)隔開(kāi)

3. set_name 為mongoDB 實(shí)例名


針對(duì)副本集mongoDB命令行登陸的2種方式:


方式一:如果要做數(shù)據(jù)變更操作,需要提前找到誰(shuí)是主節(jié)點(diǎn),再登陸主節(jié)點(diǎn)

mongo --host? 192.168.1.101? --port? 27018 -u "user" -p "passwd"? --authenticationDatabase? admin


方式二:通過(guò)mongo連接字符串登陸,會(huì)自動(dòng)登陸主節(jié)點(diǎn)

1. 登錄,不指定庫(kù),走admin庫(kù)認(rèn)證

mongo? "mongodb://${user}:${paswd}@192.168.1.101:27018,192.168.1.102:27018/?replicaSet=${instance}&authSource=admin"


2. 登錄,指定庫(kù)名,走admin認(rèn)證

mongo? "mongodb://${user}:${paswd}@192.168.1.101:27018,192.168.1.102:27018/${db_name}?replicaSet=${instance}&authSource=admin"


3. 登錄,指定庫(kù)名,并且在指定庫(kù)名做認(rèn)證

mongo? "mongodb://${user}:${paswd}@192.168.1.101:27018,192.168.1.102:27018/${db_name}?replicaSet=${instance}&authSource=${db_name}"


注:replicaSet 為 mongoDB的實(shí)例名

mongo shell 的連接字符串跟 應(yīng)用客戶端的連接字符串還有點(diǎn)不一樣:


mongo shell 連接副本集,必須指定replicaSet名稱,庫(kù)名指定是可選的,可指定,可不指定;

應(yīng)用(如java應(yīng)用)中jdbc連接mongoDB的字符串中一定要指定庫(kù)名,如果是replicaSet只需要填寫(xiě)所有主從的地址,而不是填寫(xiě)replicaSet名稱


如果登陸是從節(jié)點(diǎn),那么無(wú)法做數(shù)據(jù)變更操作,因?yàn)閙ongoDB默認(rèn)只有主節(jié)點(diǎn)可寫(xiě)

mongo --host? 192.168.1.102? --port? 27018 -u "user" -p "passwd"? --authenticationDatabase? admin

> rs.slaveOk()

注意:對(duì)于從mongo shell登陸從節(jié)點(diǎn),需要先執(zhí)行 rs.slaveOk() 后才能執(zhí)行相關(guān)查詢操作,對(duì)客戶端應(yīng)用則沒(méi)有這個(gè)限制,默認(rèn)可以讀從,可以實(shí)現(xiàn)讀寫(xiě)分離。






當(dāng)客戶端連接副本集時(shí),如果以primary地址連接實(shí)例,當(dāng)發(fā)生上述情況時(shí),P節(jié)點(diǎn)降級(jí)為Secondary節(jié)點(diǎn),客戶端將無(wú)法繼續(xù)執(zhí)行寫(xiě)操作。

為了解決這一問(wèn)題,連接線上數(shù)據(jù)時(shí),最好是使用副本集方式連接副本集。


正確連接副本集,可以參考官網(wǎng):? https://docs.mongodb.com/manual/reference/connection-string

該文檔描述了官方MongoDB drivers連接MongoDB實(shí)例的URI格式。

URI形如:

mongodb://[username:password@]host1[:port1][,...hostN[:portN]]][/[database][?options]]


options都怎么寫(xiě)?

參考官方 https://docs.mongodb.com/manual/reference/connection-string/#connections-connection-options


mongo shell 連接常見(jiàn)報(bào)錯(cuò):FailedToParse: Password must be URL Encoded for mongod

#? mongo? ? "mongodb://root:Root@123@192.168.1.21:27017,192.168.1.22:27017/test?authSource=admin&replicaSet=8e08b0f0-7db1-49aa-8274-05c3bca10e67&readPreference=secondaryPreferred"

FailedToParse: Password must be URL Encoded for mongodb:// URL: mongodb://root:Root@123@192.168.1.21:27017,192.168.1.22:27017/test?authSource=admin&replicaSet=8e08b0f0-7db1-49aa-8274-05c3bca10e67&readPreference=secondaryPreferredtry'mongo --help'formoreinformation


密碼必須經(jīng)過(guò)URL編碼


如果用戶名或密碼包含at符號(hào)@,冒號(hào):,斜杠/或百分號(hào)%字符,請(qǐng)使用百分比編碼

參考 https://docs.mongodb.com/manual/reference/connection-string/#examples


在線轉(zhuǎn)換工具:https://www.url-encode-decode.com


常用的options:


authSource= //認(rèn)證用的數(shù)據(jù)庫(kù)

replicaSet=//副本集名稱

readPreference=secondaryPreferred //實(shí)現(xiàn)讀寫(xiě)分離

tls=true //啟用TLS加密傳輸(從MongoDB 4.2開(kāi)始可用)

connectTimeoutMS? //超時(shí)之前嘗試連接的時(shí)間(以毫秒為單位)。默認(rèn)值是永不超時(shí),盡管不同的驅(qū)動(dòng)程序可能有所不同,請(qǐng)參閱驅(qū)動(dòng)程序 文檔。

socketTimeoutMS //嘗試超時(shí)之前在套接字上嘗試發(fā)送或接收的時(shí)間(以毫秒為單位)。默認(rèn)值是永不超時(shí),盡管不同的驅(qū)動(dòng)程序可能有所不同。請(qǐng)參閱 驅(qū)動(dòng)程序文檔。


連接池選項(xiàng)

maxPoolSize //連接池中的最大連接數(shù)。默認(rèn)值為100。

minPoolSize //連接池中的最小連接數(shù)。默認(rèn)值為0。 (注意minPoolSize并非所有驅(qū)動(dòng)程序都支持該選項(xiàng)。有關(guān)驅(qū)動(dòng)程序的信息,請(qǐng)參閱驅(qū)動(dòng)程序文檔。)

maxIdleTimeMS //在刪除和關(guān)閉連接之前,連接在池中可以保持空閑狀態(tài)的最大毫秒數(shù)。 (并非所有驅(qū)動(dòng)程序都支持此選項(xiàng)。)

waitQueueMultiple //驅(qū)動(dòng)程序?qū)?a target="_blank">maxPoolSize 值乘以的數(shù)字,以提供允許最大數(shù)量的線程從池中等待可用連接。有關(guān)默認(rèn)值,請(qǐng)參見(jiàn)/ drivers 文檔。


驅(qū)動(dòng)程序: https://docs.mongodb.com/drivers


寫(xiě)選項(xiàng)

wtimeoutMS? // wtimeoutMS指定寫(xiě)關(guān)注的時(shí)間限制(以毫秒為單位)。如果wtimeoutMS是0(默認(rèn)),寫(xiě)操作永遠(yuǎn)不會(huì)超時(shí)。有關(guān)更多信息,請(qǐng)參見(jiàn)wtimeout。



連接字符串


主從仲裁:

mongo.url=mongodb://${user}:${passwd}@192.168.1.101:27017,192.168.1.102:27017/${db_name}?authSource=${db_name}&maxpoolsize=200&waitqueuetimeoutms=10000&sockettimeoutms=5000&connecttimeoutms=5000&readPreference=secondaryPreferred


主從從:

mongo.url=mongodb://${user}:${passwd}@172.16.218.26:27017,172.16.218.27:27017,172.16.218.28:27017/${db_name}?authSource=${db_name}&maxpoolsize=200&waitqueuetimeoutms=10000&sockettimeoutms=5000&connecttimeoutms=5000&readPreference=secondaryPreferred



三、分片集


寫(xiě)

應(yīng)用客戶端通過(guò)連接mongos到分片

mongodb://${user}:${passwd}@192.168.1.101:12345,192.168.1.102:12345192.168.1.103:123456/${db_name}&authSource=${db_name}


用 mongo shell 連接分片1

mongodb://172.17.0.8:27018,172.17.0.11:27018,172.17.0.12:27018/test?replicaSet=rs_shardsvr0&authSource=${db_name}

用mongo shell 連接分片2

mongodb://172.17.0.13:27018172.17.0.14:27018,172.17.0.15:27018/test?replicaSet=rs_shardsvr1&authSource=${db_name}


用mongo shell,通過(guò)mongos登陸分片集群

# mongo? --host? xx.xx.xx.xx? ? --port=12345? ? --username='user'? --password='passwd'? --authenticationDatabase=admin


使用分片集群時(shí)你需要知道:

1. 用戶訪問(wèn) mongos 跟訪問(wèn)單個(gè) mongod 類似

2. 所有 mongos 是對(duì)等關(guān)系,用戶訪問(wèn)分片集群可通過(guò)任意一個(gè)或多個(gè)mongos

3. mongos 本身是無(wú)狀態(tài)的,可任意擴(kuò)展,集群的服務(wù)能力為『Shard服務(wù)能力之和』與『mongos服務(wù)能力之和』的最小值。

4. 訪問(wèn)分片集群時(shí),最好將應(yīng)用負(fù)載均勻的分散到多個(gè) mongos 上

通過(guò)上述方式連接分片集群時(shí),客戶端會(huì)自動(dòng)將請(qǐng)求分散到多個(gè)mongos 上,以實(shí)現(xiàn)負(fù)載均衡;同時(shí),當(dāng)URI 里 mongos 數(shù)量在2個(gè)及以上時(shí),當(dāng)有mongos故障時(shí),客戶端能自動(dòng)進(jìn)行 failover,將請(qǐng)求都分散到狀態(tài)正常的 mongos 上。

當(dāng) mongos 數(shù)量很多時(shí),還可以按應(yīng)用來(lái)將 mongos 進(jìn)行分組,比如有2個(gè)應(yīng)用A、B、有4個(gè)mongos,可以讓?xiě)?yīng)用A 訪問(wèn) mongos 1-2(URI里只指定mongos 1-2 的地址), 應(yīng)用B 來(lái)訪問(wèn) mongos 3-4(URI里只指定mongos 3-4 的地址),根據(jù)這種方法來(lái)實(shí)現(xiàn)應(yīng)用間的訪問(wèn)隔離(應(yīng)用訪問(wèn)的mongos彼此隔離,但后端 Shard 仍然是共享的)。



四、參考


全面剖析 MongoDB 高可用架構(gòu)

https://mp.weixin.qq.com/s/jLsviuQ0wCcsmkskXSFdEQ


副本集正確的連接方式

https://www.cnblogs.com/zhangmingda/p/13183812.html


MongoDB Manual/Write Concern

https://docs.mongodb.com/manual/reference/write-concern/#write-concern


MongoDB連接標(biāo)準(zhǔn)格式

https://www.cnblogs.com/AlvinLee/p/6062167.html


MongoDB Driver使用正確的姿勢(shì)連接復(fù)制集

https://blog.csdn.net/weixin_34258078/article/details/93186333


MongoDB 開(kāi)發(fā):使用正確的姿勢(shì)連接分片集群

https://blog.csdn.net/weixin_30569153/article/details/94783916


MongoDB的連接字符串

https://www.cnblogs.com/imeiba/p/5702298.html


MongoDB的連接字符串

http://www.studyofnet.com/news/337.html


mongoDB集群和分片

https://www.freesion.com/article/7807126996


副本集狀態(tài)參考

https://mongodb-documentation.readthedocs.io/en/latest/reference/replica-status.html


Connection String URI Format

https://www.bookstack.cn/read/mongodb-4.2-manual/68e775d51debcb2c.md

https://mongoing.com/docs/reference/connection-string.html


深入淺出MongoDB復(fù)制

https://mongoing.com/archives/5200


mongodb集群狀態(tài)

https://blog.csdn.net/ZhongGuoZhiChuang/article/details/46646091


MongoDB Replica Set 安裝部署

https://blog.51cto.com/hsbxxl/2149531


How to edit Mongo connection string?

https://stackoverflow.com/questions/59019193/how-to-edit-mongo-connection-string


MongoDB Manual/Security Reference

https://docs.mongodb.com/upcoming/reference/security/#security-methods-in-the-mongo-shell

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容