MongoDB高可用復制集分片集群搭建


1     邏輯架構

1.1     邏輯架構圖

 

 

1.2     組件說明

一、mongos(query routers):查詢路由,負責client的連接,並把任務分給shards,然后收集結果。一個集群可以有多個query routers(replica sets),以分擔客戶端請求(負載均衡)。 

二、config server:配置服務器。保存了集群的元數據(比如數據放在哪個shards上),query router通過config server中的配置信息決定把任務分配到哪個shards上。從版本3.2開始,config servers可以做成replica sets。 

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

2     服務器規划

2.1     IP及端口規划

 

 

2.2     linux目錄規划

 

 

3     集群搭建

3.1     准備工作

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

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

3、  執行以下指令創建keyfile:

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

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

4、  根據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        創建用戶

分別在C1、C2、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。分別在C1、C2、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

采用以下命令啟動S1、S2和S3上的shard1、shard2、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

啟動后連接到shard1、shard2、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:"庫名"}]});

創建對應用戶。

驗證路由

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM