1.1 邏輯架構圖linux
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.1 IP及端口規劃架構
2.2 linux目錄規劃app
一、 根據服務器系統版本,來下載最新版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
新建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
新建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
新建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臺機器。
分別在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()
建立用戶
/data01/項目名/mongodb/bin/mongos -f /data01/項目名/mongodb/config/mongos.conf
/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
採用如下命令啓動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
配置分片只需在一臺機器上操做便可,這裏選擇在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區間分片。
例子:
使用 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()