1. 程式人生 > >windows下 mongo副本集配置 一主一從一仲裁

windows下 mongo副本集配置 一主一從一仲裁

好記性不如爛部落格,記錄一下,以後需要了直接用就可以了。

本文配置的三個mongodb在同一臺機器,按理來說應該放三臺機器的,不過資源有限,一臺機器將就用,配置副本集總比不配置的好。

本文配置使用資料庫版本:3.2.6    64位版

1、拷貝三分mongodb到伺服器下,目錄依次為:

mongo_master    //  192.168.1.11 27311 主庫   實際在資料庫執行時,哪個例項是主庫是不一定的,但為了區分資料夾,暫且如此起名了
mongo_slaver     //  192.168.1.11 27321 從庫
mongo_arbiter    //  192.168.1.11 27331 仲裁伺服器


2、主庫配置
2.1、開啟cmd,進入mater\bin目錄下:
cd E:\mongo\mongo_master\bin


2.2、執行以下命令,建立資料庫服務:
mongod --replSet shard1 --port 27311 --logpath "E:\mongo\mongo_master\data\log\MongoDB.log" --logappend --dbpath "E:\mongo\mongo_master\data\db" --serviceName "mongo_master" --serviceDisplayName "mongo_master" --install


3、從庫配置
3.1、進入mongo-slaver\bin目錄下:
cd E:\mongo\mongo_slaver\bin


3.2、執行以下命令、建立資料庫服務:
mongod --replSet shard1 --port 27321 --logpath "E:\mongo\mongo_slaver\data\log\MongoDB.log" --logappend --dbpath "E:\mongo\mongo_slaver\data\db" --serviceName "mongo_slaver" --serviceDisplayName "mongo_slaver" --install

4、仲裁伺服器配置
4.1、進入mongo_arbiter\bin目錄下:
cd E:\mongo\mongo_arbiter\bin


4.2、執行以下命令、建立資料庫服務:
mongod --replSet shard1 --port 27331 --logpath "E:\mongo\mongo_arbiter\data\log\MongoDB.log" --logappend --dbpath "E:\mongo\mongo_arbiter\data\db" --serviceName "mongo_arbiter" --serviceDisplayName "mongo_arbiter" --install


5、啟動資料庫,配置主庫、從庫、仲裁庫:
config={_id:'shard1',members:[{_id:0,host:'192.168.1.11:27311'},{_id:1,host:'192.168.1.11:27321'},{_id:3,host:'192.168.1.11:27331', arbiterOnly:true}]}
rs.initiate(config)

5.1、說明:_id的值“shard1”是配置名稱,多處使用,需統一。members下就是各mongo例項,第三個成員中的arbiterOnly:true表明改成員是仲裁伺服器。rs.initiate(config)啟用本配置。


5.2、檢視副本集配置情況:rs.status()
5.3、改變副本集配置:
var config = rs.config();
config.members[0].host = '120.27.194.222:27311'
rs.reconfig(config)
5.4、如果出現“not master and slaveok=false”的提示錯誤,請輸入一下命令:
rs.slaveOk()


6、在主庫中配置使用者:

6.1、為admin資料庫新增admin使用者

use admin

db.createUser({user: "admin",pwd: "admin",roles:[{ role:"clusterAdmin", db: "admin"},{role:"dbAdminAnyDatabase", db: "admin"},{role:"userAdminAnyDatabase",db: "admin"},{role:"readWriteAnyDatabase", db:"admin" } ]})


6.2、為mydb資料庫新增sa使用者

use mydb

db.createUser({user: "sa", pwd: "sa",roles:[{  role: "dbOwner", db: "mydb"} ]})


7、建立keyFile檔案
7.1、在 E:\mongo\mongo_master建立資料夾key,在資料夾中建立檔案key,內容要求如下:
(1)至少6個字元,小於1024位元組
(2)認證時候不考慮檔案中空白字元
(3)連線到副本集的成員和mongos進成的keyfile檔案內容必須一樣
(4)必須是base64編碼,但是不能有等號
(5)檔案許可權必須是x00,也就是說,不能分配任何許可權給group成員和other成員

windows下可以建一個txt檔案,拷貝一段base64編碼的內容,刪除檔案字尾名。將key資料夾連同key檔案拷貝至三個mongo目錄下即可。

8、修改主庫、從庫以認證方式啟動:
8.1、停止主庫服務,修改主庫啟動服務(新增啟動引數--auth):
cd E:\mongo\mongo_master\bin
mongod --replSet shard1 --port 27311 --auth --keyFile "E:\mongo\mongo_master\key\key" --logpath "E:\mongo\mongo_master\data\log\MongoDB.log" --logappend --dbpath "E:\mongo\mongo_master\data\db" --serviceName "mongo_master" --serviceDisplayName "mongo_master" --reinstall

8.2、停止從庫服務,修改從庫啟動服務
cd E:\mongo\mongo_slaver\bin
mongod --replSet shard1 --port 27321 --auth --keyFile "E:\mongo\mongo_master\key\key" --logpath "E:\mongo\mongo_slaver\data\log\MongoDB.log" --logappend --dbpath "E:\mongo\mongo_slaver\data\db" --serviceName "mongo_slaver" --serviceDisplayName "mongo_slaver" --reinstall


8.3、停止仲裁庫服務,修改仲裁庫啟動服務
cd E:\mongo\mongo_arbiter\bin

mongod --replSet shard1 --port 27331 --auth --keyFile "E:\mongo\mongo_master\key\key" --logpath "E:\mongo\mongo_arbiter\data\log\MongoDB.log" --logappend --dbpath "E:\mongo\mongo_arbiter\data\db" --serviceName "mongo_arbiter" --serviceDisplayName "mongo_arbiter" --reinstall

9、java中連線資料庫:

import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoCollection;

ServerAddress master = new ServerAddress("192.168.1.11", 27311);
ServerAddress slaver = new ServerAddress("192.168.1.11", 27321);
List<ServerAddress> sends = new ArrayList<ServerAddress>();
sends.add(master);
sends.add(slaver);

MongoCredential c = MongoCredential.createCredential("sa", "mydb", "
sa".toCharArray());
MongoClient mc = new MongoClient(sends, Arrays.asList(c));

MongoCollection<Document> test = mc.getDatabase("mydb").getCollection("test");

Document doc = new Document();

doc.put("name", "test");

mcoll.insertOne(doc)