天天看點

MongoDB叢集建構

 最近做的項目,拿出來分享交流。

六台主機

hostname分别為wens012~017

IP:10.50.9.12~10.50.9.17

下面為部署方案

MongoDB叢集建構

六個server,每個server上跑四個程序。

程序一共分三類:

shard server:啟動守護程序mongod加上參數shardsvr即可。當然還有一些其他的配置。

config server:啟動守護程序mongod加上參數configsvr即可。

route server:啟動路由程序mongos。

部署方案中shard與rep都是shard server程序,每3個組成一個複制集,複制集中如果某個程序down掉了,會有另外一個程序成為主節點。

例如:shard11,rep12,rep13為一個複制集。

程序端口配置設定:

主機

ip

程序端口

Server1

10.50.9.12

Mongod shard11 : 27017

Mongod rep32  : 27018

Mongod rep33  : 27019

Mongod conf1  : 20000

Server2

10.50.9.13

Mongod shard21 : 27017

Mongod rep12  : 27018

Mongod rep13  : 27019

Mongos       : 30000

Server3

10.50.9.14

Mongod shard31 : 27017

Mongod rep22  : 27018

Mongod rep23  : 27019

Mongod conf2  : 20000

Server4

10.50.9.15

Mongod shard41 : 27017

Mongod rep62  : 27018

Mongod rep63  : 27019

Server5

10.50.9.16

Mongod shard51 : 27017

Mongod rep42  : 27018

Mongod rep43  : 27019

Mongod conf3  : 20000

Server6

10.50.9.17

Mongod shard61 : 27017

Mongod rep52  : 27018

Mongod rep53  : 27019

Mongds       : 30000

檔案目錄:

我的是下載下傳壓縮檔案解壓出來的mongodb,放在/erpfs/mongoDB/ 中。

加壓出來後mongodb的所有執行檔案都放在/erpfs/mongoDB/bin/ 中。

建立檔案夾/erpfs/mongoDB/data/ 用于存放資料檔案

每個server按照所需運作的mongod程序建資料目錄。

例如:

server1:

mkdir -p /erpfs/mongoDB/data/shard11

mkdir -p /erpfs/mongoDB/data/rep32

mkdir -p /erpfs/mongoDB/data/rep33

mkdir -p /erpfs/mongoDB/data/config1

server2:

mkdir -p /erpfs/mongoDB/data/shard21

mkdir -p /erpfs/mongoDB/data/rep12

mkdir -p /erpfs/mongoDB/data/rep13

route server不需要資料目錄

該項目還有一個需求,在server1隻需執行一個啟動腳本則整個叢集都啟動完畢,并且所有分片都加到叢集中。

為了達到目的,我使用ssh。但是這樣執行啟動腳本之後,每當連接配接到另外一台server的時候都需要輸入root密碼,非常繁瑣,需要有自動完成登入的功能。我們可以利用公鑰和私鑰來完成。

在server1中執行:ssh-keygen -t rsa

按回車,提示輸入檔案名,我用id_rsa_wens012命名

随後提示使用的加密方式,直接按回車兩次,使用預設的即可。

這樣會生成私鑰和公鑰檔案id_rsa_wens12和id_rsa_wens12.pub

将私鑰和公鑰檔案都放到/root/.ssh/中

将id_rsa_wens12.pub放到server2~6的/root/.ssh/中,并且重命名為authorized_keys(如果這個檔案已存在,則id_rsa_wens12.pub的内容加到檔案末尾)

這部分可以在寫完所有腳本之後再補上,不過能在一開始就完成也很好。

然後開始寫配置檔案

還是以sever1為例:

conf檔案有四個,每個程序一個。

#shard11.conf

shardsvr = true

replSet = shard1

dbpath = /erpfs/mongoDB/data/shard11

logpath = /erpfs/mongoDB/data/shard11.log

logappend = true

fork = true

port = 27017

journal = true

smallfiles = true

#rep32.conf

replSet = shard3

dbpath = /erpfs/mongoDB/data/rep32

logpath = /erpfs/mongoDB/data/rep32.log

port = 27018

#rep33.conf

dbpath = /erpfs/mongoDB/data/rep33

logpath = /erpfs/mongoDB/data/rep33.log

port = 27019

#config1.conf

configsvr = true

dbpath = /erpfs/mongoDB/data/config1

logpath = /erpfs/mongoDB/data/config1.log

port = 20000

其他server類似配置,改改名字就差不多。

server2中的mongos配置檔案

#mongos

configdb = 10.50.9.12:20000,10.50.9.14:20000,10.50.9.16:20000

logpath = /erpfs/mongoDB/data/mongos.log

port = 30000

chunkSize = 100

然後是啟動腳本檔案

先寫好每個server的啟動腳本

在每個server中都有一個serverX_start.sh(X表示1~6),用來啟動該機器上的程序。

server2、4、6還有一個serverX_start_mongos.sh腳本,因為route server需要等到所有config server啟動了之後才能啟動。因為找不到config server 的話route server就不知道從哪裡讀取叢集配置了。

以server1為例:

#server1_start.sh

#!/bin/bash

/erpfs/mongoDB/bin/mongod -f /erpfs/mongoDB/config1.conf

/erpfs/mongoDB/bin/mongod -f /erpfs/mongoDB/shard11.conf

/erpfs/mongoDB/bin/mongod -f /erpfs/mongoDB/rep32.conf

/erpfs/mongoDB/bin/mongod -f /erpfs/mongoDB/rep33.conf

選項-f(或--config)代表執行配置檔案内容。

server2中用mongos的啟動腳本,其實就是一句。

#server2_start_mongos.sh

/erpfs/mongoDB/bin/mongos -f /erpfs/mongoDB/mongos.conf

程序都啟動之後,route server已經跟config server連接配接上,但是所有的shard server都還是處于遊離狀态。我們要将他們加入到叢集中,在加入叢集之前還有一件事情,就是初始化複制集。

任意一台server上使用bin目錄下的mongo連接配接到某一複制集的其中一個shard server上。

例如:/erpfs/mongoDB/bin/mongo 10.50.9.12:27017

就連接配接上了shard11了

執行初始化複制集代碼

看到 'OK':1字樣則初始化成功。

然後exit退出。

接着重複上述步驟初始化複制集shard2~6

初始化複制集完成之後就是将每個複制集加入到叢集當中。

使用bin目錄下的mongo連接配接到任意一個route server,進入admin資料庫(指令:use admin)

然後執行下列代碼增加分片的複制集

執行指令db.runCommand({enablesharding:'test'})

這樣test資料庫就可以分片了,MongodDB預設連接配接上的是test資料庫。

如果想要使資料庫中的某個集合可以分片存儲,例如test集合,可以使用db.runCommand({shardcollection:'test.test',key:{_id:1}})

key是片鍵,是分片的依據,這裡使用_id字段作為片鍵。

所謂片鍵,例如某個片鍵的值的範圍是a~z,則可能某一分片存儲a~h,某一分片存儲i~n,某一分片存儲o~z。

為了不用每次啟動MongoDB的時候都人為執行上述初始化複制集和加入分片的操作,可以将上述指令寫成js腳本,MongoDB可以執行js腳本。

隻要啟動bin目錄下的mongo時加入參數

mongo [ip][:port] [*.js]

然後将所有執行js腳本的指令寫入shell腳本

這樣隻要一執行啟動腳本,就自動完成啟動server程序,初始化複制集,加入分片的操作。

停止MongoDB

要停止MongoDB的方法有幾種,隻要MongoDB接受到結束信号就會迅速停止。

可以使用 kill -2來停止MongoDB

記住,如果使用kill -9的話MongoDB會馬上停止,一些停止前的操作尚未執行就停止了,這樣下次啟動的時候MongDB就會查詢日志,進行修複,啟動時間就會變得很慢。

當然,這是在使用了journal參數設為true的情況下,才會有恢複操作,如果沒有将journal設定為true,就麻煩了。

還有一點,journal在64位的機器上是預設為true的,在32位的機器上預設為false的。

言歸正傳,要停止MongoDB可以就是将正在運作的mongo程序号找出來然後kill -2掉。

以上作為serverX_stop.sh腳本放在每個server上,寫一個stop.sh腳本,通過ssh執行每個server上的serverX_stop.sh腳本即可。