自己是在一臺window機(jī)器部署整套,包含了一個(gè)分片Shard,分片包含了三個(gè)復(fù)制集(1個(gè)primary,2個(gè)secondary),一個(gè)路由server,兩個(gè)配置server,最終架構(gòu)圖如下:?
從圖中可以看到,集群包括幾個(gè)部分:?
分片服務(wù)器:存儲數(shù)據(jù)的地方,可以有多個(gè)分片,每個(gè)分片又可以有多個(gè)復(fù)制集?
配置服務(wù)器:保存分片數(shù)據(jù)與服務(wù)器映射等數(shù)據(jù),可以配置成復(fù)制集,避免單點(diǎn)故障?
路由服務(wù)器:與client打交道,先查詢配置服務(wù)器,找到數(shù)據(jù)所屬的分片再獲取數(shù)據(jù)返回給client?
client:客戶端應(yīng)用程序,不關(guān)心mongo是否使用了分片與復(fù)制集,只需與路由服務(wù)器交互
首先安裝好MongoDB,我的安裝目錄為:D:\software\MongoDB\Server\3.4\bin?
安裝之前,先創(chuàng)建好所需的目錄,由于我只部署了一個(gè)分片(rs-a),分片包含三個(gè)復(fù)制集,2個(gè)配置服務(wù)器復(fù)制集、一個(gè)路由服務(wù)器,因此對應(yīng)的數(shù)據(jù)目錄如下:?
同時(shí)創(chuàng)建log日志目錄:
D:\software\MongoDB\data\log
下面開始部署?
1. 配置分片復(fù)制集
- 創(chuàng)建實(shí)例?
命令行窗口進(jìn)入bin目錄下,使用如下命令(三個(gè)命令行窗口)
mongod --port 3000 --shardsvr --replSet rs-a --dbpath "D:\software\MongoDB\data\data\rs-a-0" --logpath "D:\software\MongoDB\data\log\rs-a-0.log"mongod --port 3001 --shardsvr --replSet rs-a --dbpath "D:\software\MongoDB\data\data\rs-a-0" --logpath "D:\software\MongoDB\data\log\rs-a-1.log"mongod --port 3002 --shardsvr --replSet rs-a --dbpath "D:\software\MongoDB\data\data\rs-a-0" --logpath "D:\software\MongoDB\data\log\rs-a-2.log"
這里?--shardsvr要求使用分片,--replSet要是使用復(fù)制集,復(fù)制集名稱為?rs-a,這是我們便創(chuàng)建了包含三個(gè)復(fù)制集的一個(gè)分片,注意復(fù)制集名字要一致,同時(shí)?--logpath的參數(shù)要求是一個(gè)文件而不是目錄?
上面只是創(chuàng)建了三個(gè)可以分片和使用復(fù)制集的服務(wù)器,我們需要對其初始化設(shè)置復(fù)制集中的primary和secondary
- 初始化,配置Primary和Secondary復(fù)制集?
接著再開一個(gè)窗口,連接其中的一個(gè)服務(wù)器,使用命令:mongo --port 3000,連接后使用命令?rs.initiate()?初始化,過一會兒,此實(shí)例便成為了Primary,可以使用?rs.isMaster()和rs.status()查看對應(yīng)情況,如下:?
查看對應(yīng)情況?
此時(shí),我們還需要把另外兩個(gè)加入進(jìn)來,成為Secondary,使用命令rs.add("host:port"),我的電腦名為 “HIH-D-11698”
此時(shí),帶有分片的復(fù)制集便建立完成,同樣可以使用rs.status()查看信息?
注意,MongDB默認(rèn)Secondary是不支持讀寫操作的,要使Secondary能支持讀,需要連接到Secondary的mongod,使用db.getMongo().setSlaveOk()?將其設(shè)為從服務(wù)器,但此時(shí)他還是不支持寫操作
2. 配置Config Server 復(fù)制集?
這里需要將Config Server配置為復(fù)制集,即使復(fù)制集只包含一個(gè)mongo實(shí)例,如果你采用mongod --configsvr --port 27010?命令將配置服務(wù)器作為standalone mongod process,當(dāng)你配置路由服務(wù)器Mongos的時(shí)候mongos --configdb localhost:27010 --port 27011就會報(bào)錯(cuò)
BadValue: configdb supports only replicasetconnectionstring
1
這是因?yàn)镸ongo3.4及以上要求Config Server為復(fù)制集,具體問題可見https://stackoverflow.com/questions/42392923/unable-to-launch-mongos?
因此我這里將Config Server配置為包含2個(gè)實(shí)例的復(fù)制集,開兩個(gè)窗口,運(yùn)行如下命令:
mongod --port 27019 --configsvr --replSet rs-conf --dbpath "D:\software\MongoDB\data\data\config0" --logpath "D:\software\MongoDB\data\log\config0.log"mongod --port 27020 --configsvr --replSet rs-conf --dbpath "D:\software\MongoDB\data\data\config1" --logpath "D:\software\MongoDB\data\log\config1.log"
這里,復(fù)制集名稱為rs-conf,同樣我們需要按照前述配置分片復(fù)制集那樣使用?rs.initiate()等命令進(jìn)行配置,這里就省略了
3. 配置路由服務(wù)器 router server?
一開始當(dāng)我使用?mongos --configdb HIH-D-11698:27019,HIH-D-11698:27020 --port 27018,報(bào)錯(cuò),--configdb后面表示的是配置服務(wù)器地址,--port表示mongos的端口,但是這樣報(bào)錯(cuò)
FailedToParse:invalid url [HIH-D-11698:27019,HIH-D-11698:27020]
原來,mongos 要求config server是復(fù)制集并且在前面加上復(fù)制集的名稱,參見https://stackoverflow.com/questions/38467269/mongodb-query-router-setup-issue-with-config-file?
因此按如下方式啟動(dòng)mongos?
我之前配置的config server的復(fù)制集名稱為?rs-conf
4. 添加創(chuàng)建的分片?
將我們前面創(chuàng)建的分片添加進(jìn)去,使用命令?mongos --port 27018登錄mongos,使用sh.addShard添加分片?
使用sh.status()查看分片信息
5. 開啟數(shù)據(jù)庫的分片?
為了在數(shù)據(jù)庫中使用分片,我們要使用sh.enableSharding()開啟數(shù)據(jù)庫的分片?
可以看到數(shù)據(jù)庫test開啟了分片