摘要: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>")
關掉