MongoDB Replset + Sharding + Auth

摘要:MongoDB Replset + Sharding + Auth

試了快三天,才試出這種架構,能做讀寫分開(複製組)、分片(分割)分散式資料庫、及對這種架構使用認證模式(使用帳號密碼登入才可使用,不開放未認證存取)

而這架構的認證模式,與單臺的認證方式不一樣,單臺的話,使用--auth就可啟用認證方式,

但多臺時,要使用--keyFile 認證,在config,sharding ,replset,router都要放同樣的keyfile

而且使用的keyfile檔,必須設權限為600

打以下指令變更keyfile檔

sudo chmod 600 keyfile

 

產生 keyfile 可以使用openssl 建立一個比較複雜性非常高的私鑰檔

openssl rand -base64 753

 

否則就會得到,你的keyfile too open的log訊息,而使mongodb沒有被啟動。

在要啟用認證模式前,需先做好sharding及addUser的動作。從mongos 下指令新增user

 

現在讓我們從頭開始

假設我有兩臺做為Sharding ,稱為S1與S2

在S1設以下mongod

mongod --fork --nohttpinterface --shardsvr --port 10001 --replSet S1 --dbpath /var/mongodb/database/r0 --logpath /var/mongodb/log/r0 --keyFile /var/mongodb/key/r0

mongod --fork --nohttpinterface --shardsvr --port 10002 --replSet S2 --dbpath /var/mongodb/database/r1 --logpath /var/mongodb/log/r1 --keyFile /var/mongodb/key/r1

mongod --fork --nohttpinterface --shardsvr --port 10003 --replSet S2 --dbpath /var/mongodb/database/r2 --logpath /var/mongodb/log/r2 --keyFile /var/mongodb/key/r2

在S2設以下mongod

mongod --fork --nohttpinterface --shardsvr --port 10001 --replSet S2 --dbpath /var/mongodb/database/r0 --logpath /var/mongodb/log/r0 --keyFile /var/mongodb/key/r0

mongod --fork --nohttpinterface --shardsvr --port 10002 --replSet S1 --dbpath /var/mongodb/database/r1 --logpath /var/mongodb/log/r1 --keyFile /var/mongodb/key/r1

mongod --fork --nohttpinterface --shardsvr --port 10003 --replSet S1 --dbpath /var/mongodb/database/r2 --logpath /var/mongodb/log/r2 --keyFile /var/mongodb/key/r2

 

其中-keyFile,等到需要啟動認證時再加入(就是做完sharding及設完user再加進去)

然後本機啟用mongo

./mongo --port 10001

啟動後輸入指令,設定Replset,複製組相關資訊(設定config),使他們知道彼此,一個設為主要,一個設為次要,一個設為仲裁(不然就是另一個次要,如果要省硬碟,就設為仲裁,不然一組必須是三個)

>use admin

>config = {_id:'S1',members:[{_id:0,host:'S1:10001',priority:1},{_id:1,host:'S2:10002'},{_id:2,host:'S2:10003',arbiterOnly:true}]}

>rs.initiate(config)

>rs.status()

 

另外對所有節點都輸入指令

>db.getMongo().setSlaveOk();

使得可使所有節點,都可分擔讀取的負載。

 

接著設Config,一樣keyFile等做好sharding及加入使用者再加這個參數進去

mongod --nohttpinterface -fork --configsvr --dbpath /var/mongodb/database/config1 --port 20001 --logpath /var/mongodb/log/config1 --rest --keyFile /var/mongodb/key/config1
mongod --nohttpinterface -fork --configsvr --dbpath /var/mongodb/database/config2 --port 20002 --logpath /var/mongodb/log/config2 --rest --keyFile /var/mongodb/key/config2
mongod --nohttpinterface -fork --configsvr --dbpath /var/mongodb/database/config3 --port 20003 --logpath /var/mongodb/log/config3 --rest --keyFile /var/mongodb/key/config3

 

接著設Router,一樣keyFile等做好sharding及加入使用者再加這個參數進去

mongos -fork --logpath /var/mongodb/log/routeServer --configdb ConfigServer:20001,ConfigServer:20002,ConfigServer:20003 --port 27017 -chunkSize 1 --keyFile /var/mongodb/key/router

 

然後,做sharding

use admin
db.runCommand({addShard:"S1/S1:10001,S2:10002,S2:10003"})
db.runCommand({addShard:"S2/S2:10001,S1:10002,S1:10003"})
db.runCommand({enablesharding:"testdb"})
db.printShardingStatus()

db.runCommand({shardcollection:"testdb.collection_test",key:{_id:1}})

然後,加user

use admin

db.addUser("<user>","<password>")

db.auth("<user>","<password>")

 

關掉

 

sudo kill $(ps aux | grep 'mongod' | awk '{print $2}')
sudo kill $(ps aux | grep 'mongos' | awk '{print $2}')
or
sudo killall mongod
sudo killall mongos