MongoDB分片集群搭建
最近搭建了一個Mongodb的分片集群,這裏將整個過程做個記錄。
一、規劃
MongoDB的分片集群,由mongos路由進程、配置服務器、分片集合組成。其中,mongos和配置服務器都是輕量級進程,不會保存數據,配置服務器只保存分片的一些狀態信息;而分片集合通常使用復制集(Replica Set)而不是單實例,這樣能有效保證不會因某個實例失效而導致整個集群失效。
在本例中,整個分片集群搭建在三臺物理服務器(IP分別為192.168.64.161/162/163,簡稱為w1, w2, w3,均為Windows Server 2012)上。相應地,集群由一個mongos進程、三個config server
註意:端口分配規則:master一律為27017,slave一律為27018,arbiter一律為27019,config server一律為30001,mongos為30000。
二、前期準備
l 安裝mongodb
在每臺物理服務器上安裝
有些可能還需安裝VC redist(64位或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
註意:按目前規劃,w1上rs2目錄其實用不到,因為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, slave1和arbiter1:
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
按照上一步驟將另兩個分片集rs2和rs3也配置好,註意目錄名、文件名、IP、端口、副本集名與規劃保持一致。
此步驟完成後,w1上有master1, slave3和arbiter2三個mongod實例,w2上有master2, arbiter3和slave1三個mongod實例,而w3上有master3, arbiter1和slave2三個mongod實例。
五、 配置config server及mongos
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
在w2和w3上的操作類似,註意區分文件名就可以了。
註意:自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 應用程序連接串
在將原來的單個副本集群改為分片集群後,需將連接串中的host和port改為mongos的IP和端口。
MongoDB的分片集群,由mongos路由進程、配置服務器、分片集合組成。其中,mongos和配置服務器都是輕量級進程,不會保存數據,配置服務器只保存分片的一些狀態信息;而分片集合通常使用復制集(Replica Set)而不是單實例,這樣能有效保證不會因某個實例失效而導致整個集群失效。
在本例中,整個分片集群搭建在三臺物理服務器(IP分別為192.168.64.161/162/163,簡稱為w1, w2, w3,均為Windows Server 2012)上。相應地,集群由一個mongos進程、三個config server進程、三個分片集合(分別名為rs1, rs2和rs3,每個集合都包括一個Master、一個Slave、一個Arbiter進程)構成,除mongos外其它進程均為一個mongod進程實例。每個物理服務器上都運行一個master、一個slave、一個arbiter、一個config server(另外輕量級的mongos運行在w1上)進程,以此均勻承擔壓力。如下圖所示:
註意:端口分配規則:master一律為27017,slave一律為27018,arbiter一律為27019,config server一律為30001,mongos為30000。
MongoDB分片集群搭建