一、單機(jī)版
# systemctl? status mongod

# cat? /etc/mongod.conf

在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)建其他用戶

# 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
三、分片集




應(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