MongoDB集群搭建

自己是在一臺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開啟了分片

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

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

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