MongoDB高可用複製集分片集羣搭建

1     邏輯架構

1.1     邏輯架構圖linux

 

 

1.2     組件說明

1、mongos(query routers):查詢路由,負責client的鏈接,並把任務分給shards,而後收集結果。一個集羣能夠有多個query routers(replica sets),以分擔客戶端請求(負載均衡)。 mongodb

2、config server:配置服務器。保存了集羣的元數據(好比數據放在哪一個shards上),query router經過config server中的配置信息決定把任務分配到哪一個shards上。從版本3.2開始,config servers能夠作成replica sets。 數據庫

3、shards:分片,即數據結點,存儲數據和執行計算。爲了保證高可用和數據一致性,生產環境中shards 應該作成replicasets(防止丟失數據)。服務器

2     服務器規劃

2.1     IP及端口規劃架構

 

 

2.2     linux目錄規劃app

 

 

3     集羣搭建

3.1     準備工做

一、  根據服務器系統版本,來下載最新版MongoDB(3.2.x),下載地址:https://www.mongodb.com/download-center?jmp=nav#community負載均衡

二、  根據2.2節的目錄規劃,在6臺機器中的任意一臺上建好相應目錄,並將下載好的MongoDB解壓到/data01/項目名/mongodb/下;tcp

三、  執行如下指令建立keyfile:測試

a)        openssl rand -base64 741 > /data01/項目名/mongodb/keyfile/keyfilecode

b)       chmod 300 /data01/項目名/mongodb/keyfile/keyfile

四、  根據2.1節的端口規劃,在6臺機器上依次執行以下指令,以開放相應端口:

vi /etc/sysconfig/iptables 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 17017 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 27017 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 37017 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 47017 -j ACCEPT

 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 57017 -j ACCEPT

3.2     參數配置

3.2.1       configServer配置

新建2.2節中的configsvr.conf文件,文件內容以下:

dbpath =/data01/項目名/mongodb/data/configsvr

configsvr = true

port = 27017 

logpath =/data01/項目名/mongodb/logs/configsvr.log

logappend = true

fork = true 

replSet=configRS

keyFile =/data01/項目名/mongodb/keyfile/keyfile

3.2.2       routeServer配置

新建2.2節中的mongos.conf文件,文件內容以下:

configdb =C1:27017,C2:27017,C3:27017

port = 17017

chunkSize = 5 

logpath =/data01/項目名/mongodb/logs/mongos.log

logappend = true

fork = true 

keyFile =/data01/項目名/mongodb/keyfile/keyfile

3.2.3       Shard配置

新建2.2節中的shard1.conf、shard2.conf、shard3.conf文件,文件內容以下:

shard1.conf

dbpath = /data01/項目名/mongodb/data/shard1

shardsvr = true

replSet = shard1 

port = 37017

oplogSize = 100 

logpath = /data01/項目名/mongodb/logs/shard1.log

logappend = true

fork = true 

keyFile =/data01/項目名/mongodb/keyfile/keyfile

shard2.conf

dbpath = /data01/項目名/mongodb/data/shard2

shardsvr = true

replSet = shard2 

port = 47017

oplogSize = 100 

logpath = /data01/項目名/mongodb/logs/shard2.log

logappend = true

fork = true 

keyFile =/data01/項目名/mongodb/keyfile/keyfile

shard3.conf

dbpath = /data01/項目名/mongodb/data/shard3

shardsvr = true

replSet = shard3 

port = 57017

oplogSize = 100 

logpath = /data01/項目名/mongodb/logs/shard3.log

logappend = true

fork = true 

keyFile =/data01/項目名/mongodb/keyfile/keyfile

到此,全部配置文件都已經建好,經過scp指令將整個/data01/項目名/mongodb目錄拷貝到其他5臺機器。

3.2.4        建立用戶

分別在C一、C二、C3上運行如下命令:

/data01/項目名/mongodb/bin/mongod -f /data01/項目名/mongodb/config/configsvr.conf

再在C1上運行:/data01/項目名/mongodb/bin/mongo --port 27017

配置config server爲replica sets

>use admin

>rs.initiate( {_id: "configRS",configsvr: true,members: [{ _id: 0, host: "C1:27017" },{ _id: 1, host: "C2:27017" },{ _id: 2, host: "C3:27017" }]})

>rs.status()

建立用戶

  1. 啓動routeServer。分別在C一、C二、C3上運行如下命令:

/data01/項目名/mongodb/bin/mongos -f /data01/項目名/mongodb/config/mongos.conf

  1. 在C1上執行:

/data01/項目名/mongodb/bin/mongo --port 17017

mongos> use admin

mongos>db.createUser( {user: "xxx", pwd:  "xxx",  roles:  [ { role: "root",  db: "admin" } ] })

mongos>db.auth(「xxx」,」xxx」)

 

      mongos>exit

3.2.5  配置Shard

採用如下命令啓動S一、S2和S3上的shard一、shard二、shard3: 

備註:先依次啓動S1的shard1、S2的shard2、S3的shard3,再啓動其他的。

/data01/項目名/mongodb/bin/mongod -f /data01/項目名/mongodb/config/shard1.conf

/data01/項目名/mongodb/bin/mongod -f /data01/項目名/mongodb/config/shard2.conf

/data01/項目名/mongodb/bin/mongod -f /data01/項目名/mongodb/config/shard3.conf

查看是否正常啓動:netstat -lnpt

啓動後鏈接到shard一、shard二、shard3的任意一臺機器,來配置每一個shard爲replica sets,如下是具體配置過程:

Shard1

/data01/項目名/mongodb/bin/mongo --port 37017

>use admin

 >config = {「_id」:"shard1", members: [                            {「_id」: 0,」host」:"S1:37017"},                           {「_id」: 1, 「host」:"S2:37017"},                           {「_id」: 2, 「host」:"S3:37017"}]            } 

>rs.initiate(config)

>exit

Shard2

/data01/項目名/mongodb/bin/mongo --port 47017

>use admin

 >config = {「_id」:"shard2", members: [                            {「_id」: 0,」host」:"S1:47017"},                           {「_id」: 1, 「host」:"S2:47017"},                           {「_id」: 2, 「host」:"S3:47017"}]            } 

>rs.initiate(config)

>exit

Shard3

/data01/項目名/mongodb/bin/mongo --port 57017

>use admin

 >config = {「_id」:"shard3", members: [                            {「_id」: 0,」host」:"S1:57017"},                           {「_id」: 1, 「host」:"S2:57017"},                           {「_id」: 2, 「host」:"S3:57017"}]            } 

>rs.initiate(config)

>exit

3.2.6       配置分片

配置分片只需在一臺機器上操做便可,這裏選擇在C1上執行:

/data01/項目名/mongodb/bin/mongo --port 17017

mongos> use admin

mongos>db.auth("xxx","xxx")(3.2.4中建立的用戶)

mongos>db.runCommand({addshard:"shard1/S1:37017,S2:37017,S3:37017",name:"shard1", maxsize:20480} )

mongos>db.runCommand({addshard:"shard2/S1:47017,S2:47017,S3:47017",name:"shard2", maxsize:20480} )

mongos>db.runCommand({addshard:"shard3/S1:57017,S2:57017,S3:57017",name:"shard3", maxsize:20480} )

 驗證分片。繼續在C1執行:

db.runCommand({listShards:1})

激活分片配置。使用

sh.enableSharding("庫名");

新增庫並進行分片。

使用

sh.shardCollection("庫名.集合名",{"_id":"hashed"});

建立對應的表(collection)並進行hash分片。

使用

sh.shardCollection("庫名.集合名",{"_id":1});

建立對應的表(collection)並進行並按_id區間分片。

例子:

sh.shardCollection("records.people", { "zipcode": 1, "name": 1 } ) 
sh.shardCollection("people.addresses", { "state": 1, "_id": 1 } ) 
sh.shardCollection("assets.chairs", { "type": 1, "_id": 1 } ) 
db.alerts.ensureIndex( { _id : "hashed" } ) 
sh.shardCollection("events.alerts", { "_id": "hashed" } )
這些分片操做按順序依次表示爲:
數據庫records 中的People集合使用了片鍵{ 「zipcode」 : 1, 「name」 : 1 }
這個片鍵經過字段zipcode的值進行數據分配。若是這個有大量相同的值,則會根據name字段的值對塊進行分裂。
數據庫people的addresses集合使用了片鍵{ 「state」 : 1, 「_id」 : 1 }
這個片鍵經過字段state的值進行數據分配。若是這個有大量相同的值,則會根據_id字段的值對塊進行分裂。
數據庫assets的chairs集合使用了片鍵{ 「type」 : 1, 「_id」 : 1 }
這個片鍵經過字段type的值進行數據分配。若是這個有大量相同的值,則會根據_id字段的值對塊進行分裂。
數據庫events的alerts集合使用了片鍵{ 「_id」 : 「hashed」 }
在版本2.4中最新出現的。
這個片鍵經過字段_id的散列值進行數據分配。MongoDB計算_id字段的散列值做爲散列索引,它將提供集羣中文檔的均勻分佈。

使用 use 庫名 切換到新建的庫

使用

db.createUser({user:"xxx",pwd:"xxx",roles:[{role:"dbOwner", db:"庫名"}]});

建立對應用戶。

驗證路由

一、  use 庫名(上面新建的庫);

二、  插入一批測試數據:for(var i=0;i<10;i++){db.集合名.insert({name:"jeff"+i});}

三、  驗證:db.集合名.stats()

相關文章
相關標籤/搜索