1. 程式人生 > >MongoDB分片集群搭建

MongoDB分片集群搭建

src strong onf 保存 仲裁 size runtime 提高 adding

最近搭建了一個Mongodb的分片集群,這裏將整個過程做個記錄。

一、規劃

MongoDB的分片集群,由mongos路由進程、配置服務器、分片集合組成。其中,mongos和配置服務器都是輕量級進程,不會保存數據,配置服務器只保存分片的一些狀態信息;而分片集合通常使用復制集(Replica Set)而不是單實例,這樣能有效保證不會因某個實例失效而導致整個集群失效。

在本例中,整個分片集群搭建在三臺物理服務器(IP分別為192.168.64.161/162/163,簡稱為w1, w2, w3,均為Windows Server 2012)上。相應地,集群由一個mongos進程、三個config server

進程、三個分片集合(分別名為rs1, rs2rs3,每個集合都包括一個Master、一個Slave、一個Arbiter進程)構成,除mongos外其它進程均為一個mongod進程實例。每個物理服務器上都運行一個master、一個slave、一個arbiter、一個config server(另外輕量級的mongos運行在w1上)進程,以此均勻承擔壓力。如下圖所示:

技術分享圖片

註意:端口分配規則:master一律為27017slave一律為27018arbiter一律為27019config server一律為30001mongos30000

二、前期準備

l 安裝mongodb

在每臺物理服務器上安裝

MongoDB,強烈建議使用相同版本的安裝程序(本例中為3.4.10),安裝在D:\MongoDB\3.4目錄(可以不相同)。詳略。

有些可能還需安裝VC redist64位或32位,依服務器操作系統而定),否則將來啟動時可能報“api-ms-win-crt-runtimel1-1-0.dll缺失”的錯誤。

l 創建目錄

在每臺物理服務器上創建配置目錄(可共用一個)、數據目錄(每分片集一個)、日誌目錄(建議每分片集一個)。以w1為例:

mkdir D:\mongodata\conf\db

mkdir D:\mongodata\conf\log

mkdir D:\mongodata\rs1\db

mkdir D:\mongodata\rs2\db

mkdir D:\mongodata\rs3\db

mkdir D:\mongodata\rs1\log

mkdir D:\mongodata\rs2\log

mkdir D:\mongodata\rs3\log

另外在w1,再為mongos創建日誌目錄:

mkdir D:\mongodata\mongos\log

註意:按目前規劃,w1rs2目錄其實用不到,因為arbiter2進程對數據無影響;此處為統一而保留。

l 修改防火墻

修改每臺服務器的防火墻,開放27017, 27018, 27019, 30000, 30001端口。詳略。

三、配置第一個分片集rs1

l w1上配置master1的配置文件,假設為master1.conf,目錄為D:\mongodata\conf

port = 27017

bind_ip=0.0.0.0

pidfilepath = D:\mongodata\conf\master1.pid

logpath = D:\mongodata\rs1\log\master1.log

dbpath = D:\mongodata\rs1\db

journal = true

nohttpinterface = true

directoryperdb = true

logappend = true

replSet =rs1

l w2上配置slave1的配置文件,假設為slave1.conf,目錄為D:\mongodata\conf

port = 27018

bind_ip=0.0.0.0

pidfilepath = D:\mongodata\conf\slave1.pid

logpath = D:\mongodata\rs1\log\slave1.log

dbpath = D:\mongodata\rs1\db

journal = true

nohttpinterface = true

directoryperdb = true

logappend = true

replSet =rs1

l w3上配置arbiter1的配置文件,假設為arbiter1.conf,目錄為D:\mongodata\conf

port = 27019

bind_ip=0.0.0.0

pidfilepath = D:\mongodata\conf\arbiter1.pid

logpath = D:\mongodata\rs1\log\arbiter1.log

dbpath = D:\mongodata\rs1\db

journal = true

nohttpinterface = true

directoryperdb = true

logappend = true

replSet =rs1

l 啟動分片集rs1

在三臺服務器分別啟動master1, slave1arbiter1

D:\> mongod.exe -f D:\mongodata\conf\master1.cfg

D:\> mongod.exe -f D:\mongodata\conf\slave1.cfg

D:\> mongod.exe -f D:\mongodata\conf\arbiter1.cfg

再用MongoDB shell連接master所在服務器:

D:\mongo 192.168.64.161:27017

> use admin

> config = { _id:"rs1", members:

[ {_id:0,host:‘192.168.64.161:27017‘},

{_id:1,host:‘192.168.64.162:27018‘},

{_id:2,host:‘192.168.64.163:27019‘,arbiterOnly:true}] };

執行副本集初始化:

> rs.initiate(config)

成功(出現提示"OK":1)後,可檢查集群的狀態:

> rs.status()

四、配置另兩個分片集rs2和rs3

按照上一步驟將另兩個分片集rs2rs3也配置好,註意目錄名、文件名、IP、端口、副本集名與規劃保持一致。

此步驟完成後,w1上有master1, slave3arbiter2三個mongod實例,w2上有master2, arbiter3slave1三個mongod實例,而w3上有master3, arbiter1slave2三個mongod實例。

五、 配置config servermongos

l config server的配置文件

在三臺服務器各配置一個config server

w1為例,其配置文件名為configsvr1.conf,目錄為D:\mongodata\conf

port = 30001

bind_ip=0.0.0.0

logpath = D:\mongodata\conf\log\configsvr1.log

dbpath = D:\mongodata\conf\db

configsvr = true

replSet = cfgReplSet

w2w3上的操作類似,註意區分文件名就可以了。

註意:3.4版起,congig server必須設置replSet項,否則無法初始化。

l mongos的配置文件

只在w1上進行,文件名為mongos.conf,目錄為D:\mongodata\conf

logpath = D:\mongodata\mongos\log\mongos.log

port = 30000

bind_ip=0.0.0.0

configdb=cfgReplSet/192.168.64.161:30001, 192.168.64.162:30001, 192.168.64.163:30001

l 啟動config server

在三臺服務器啟動config server

D:\> mongod.exe -f D:\mongodata\conf\configsvr1.cfg

D:\> mongod.exe -f D:\mongodata\conf\configsvr2.cfg

D:\> mongod.exe -f D:\mongodata\conf\configsvr3.cfg

再用MongoDB shell連接w1

D:\mongo 192.168.64.161:30001

> use admin

> config = { _id:"rs1", members:

[ {_id:0,host:‘192.168.64.161:30001‘},

{_id:1,host:‘192.168.64.162:30001‘},

{_id:2,host:‘192.168.64.163:30001‘}] };

config server的副本集初始化與檢查狀態命令與其它副本集一樣:

> rs.initiate(config)

> rs.status()

註意:config server可以不需要仲裁角色(arbiter)。

w1上啟動mongos

D:\> mongod.exe -f D:\mongodata\conf\mongos.cfg

l 增加各分片副本集至集群

登錄mongos

D:\mongo 192.168.64.161:30000

此時的命令提示符與之前的不同,為“mongos>”。依次添加三個副本集:

mongos > sh.addShard("rs1/192.168.64.161:27017")

mongos > sh.addShard("rs2/192.168.64.162:27017")

mongos > sh.addShard("rs3/192.168.64.163:27017")

成功後,可以檢查整個集群的狀態:

mongos > sh.status()

檢查分片的情況:

mongos > use admin

mongos > runCommand({listShards:1})

六、其它事項

l mongos實例

本例中mongos為單實例,為進一步提高可靠性,可將mongos也配置為多實例。方法很簡單,在每臺服務器都運行一個mongos並添加分片副本集。

l 應用程序連接串

在將原來的單個副本集群改為分片集群後,需將連接串中的hostport改為mongosIP和端口。

MongoDB的分片集群,由mongos路由進程、配置服務器、分片集合組成。其中,mongos和配置服務器都是輕量級進程,不會保存數據,配置服務器只保存分片的一些狀態信息;而分片集合通常使用復制集(Replica Set)而不是單實例,這樣能有效保證不會因某個實例失效而導致整個集群失效。

在本例中,整個分片集群搭建在三臺物理服務器(IP分別為192.168.64.161/162/163,簡稱為w1, w2, w3,均為Windows Server 2012)上。相應地,集群由一個mongos進程、三個config server進程、三個分片集合(分別名為rs1, rs2rs3,每個集合都包括一個Master、一個Slave、一個Arbiter進程)構成,除mongos外其它進程均為一個mongod進程實例。每個物理服務器上都運行一個master、一個slave、一個arbiter、一個config server(另外輕量級的mongos運行在w1上)進程,以此均勻承擔壓力。如下圖所示:

技術分享圖片

註意:端口分配規則:master一律為27017slave一律為27018arbiter一律為27019config server一律為30001mongos30000

MongoDB分片集群搭建