最近弄了下mongodb的副本集,php
首先說下沒有認證狀況的副本集,相對比較簡單,由於環境有限,我在同一臺服務器上作了模擬。node
--rest參數是打開web監控頁面,好比咱們這裏監聽37017端口,則打開http://192.168.75.132:38017/(mongod端口加上1000)就能夠看到這個mongodb數據庫進程的信息,若是是副本集就能查看整個副本集的相關信息。web
啓動三個mongo節點,這個是最簡單的副本集的結構,兩個節點是不能起到副本集的做用的。 ./bin/mongod --fork --dbpath data/rs0-0/ --logpath log/rs0-0/rs0-0.log --rest --replSet rs0 --port 37017 ./bin/mongod --fork --dbpath data/rs0-1/ --logpath log/rs0-1/rs0-1.log --rest --replSet rs0 --port 37018 ./bin/mongod --fork --dbpath data/rs0-2/ --logpath log/rs0-2/rs0-2.log --rest --replSet rs0 --port 37019 進入做爲主節點的mongo ./bin/mongo -port 37017 use admin #初始化一個Replica set,建立一個副本集配置對象 rsconf={ "_id" : "rs0", "members" : [ { "_id" : 0, "host" : "192.168.75.132:37017" } ] } rs.initiate(rsconf) 添加另外兩個從節點 rs.add("192.168.75.132:37018") rs.add("192.168.75.132:37019") rs.conf()能夠查看集羣的配置狀況,還可使用此來修改節點的屬性,還能夠設置 priority,hidden, slaveDelay, cfg=rs.conf()
{
"_id" : <num>,
"host" : <hostname:port>,
"priority" : 0, //設置爲0後則不會經過投票變爲主節點
"slaveDelay" : <seconds>, // 延遲同步時間
"hidden" : true // 隱藏節點,則客戶端不能鏈接,可是能夠投票
}mongodb
cfg.members[2].priority = 2 rs.reconfig(cfg, {'force':true}) 執行rs.reconfig()命令會強制整個副本集集羣進行一次election,這樣priority較高的37019節點便成了primary節點 整個election過程須要一點時間,在這之間整個集羣的全部節點都是secondary。election的策略不單單就是根據priority值來,會綜合不少其餘的因素。通過測試,就算是priority值高,但若是是出現問題,剛剛啓動,通常不會成爲primary節點,而是變爲secondary節點。 添加仲裁者: mkdir –p data/rs0-arb;mkdir –p log/rs0-arb ./bin/mongod --fork --dbpath data/rs0-arb/ --logpath log/rs0-arb/rs0-arb.log --rest --replSet rs0 --port 40000 而後進入primary節點執行下面命令添加arbiter: rs.addArb("192.168.75.132:40000") 移除成員: 移除一個成員使用rs.remove()命令: rs.remove("192.168.75.132:37019")
下面說下帶認證的副本集的配置,說明下,下面的是3.*版本的環境下的,2.*版本的會有不同的地方,不過建議使用3.*版本的。數據庫
副本集搭建有認證狀況 在此咱們須要配置三個mong單節點,而後將其結合組成副本集, 安裝路徑/usr/local/mongd 三個mongdb分別佔用端口27017 27018 27019 在/usr/local/mongd下面建立四個數據目錄和一個配置目錄以及一個日誌目錄 mkdir /usr/local/mongd/data{1..4} mkdir /usr/local/mongd/log mkdir /usr/local/mongd/etc 三個mongodb的配置文件分別以下所示:配置文件的路徑: /usr/local/mongd/etc/ 添加三個配置文件,內容以下: mongodb_primary.conf port=27017 dbpath=/usr/local/mongod/data1/ logpath=/usr/local/mongod/log/mongodb.log pidfilepath=/usr/local/mongod//mongod.pid fork=true logappend=true shardsvr=true directoryperdb=true #auth=true #replSet=rs0 #oplogSize=100 #keyFile=/usr/local/mongod/etc/mongo.pass ###這個文件後邊須要手動生成,路徑和文件名都是自定義的 mongodb_slave1.conf port=27018 dbpath=/usr/local/mongod/data2/ logpath=/usr/local/mongod/log/mongodb.log pidfilepath=/usr/local/mongod//mongod.pid fork=true logappend=true shardsvr=true directoryperdb=true #auth=true replSet=rs0 oplogSize=100 keyFile=/usr/local/mongod/etc/mongo.pass ###三個配置文件中這個文件須要一致 mongodb_slave2.conf port=27019 dbpath=/usr/local/mongod/data3/ logpath=/usr/local/mongod/log/mongodb3.log pidfilepath=/usr/local/mongod//mongod3.pid fork=true logappend=true shardsvr=true directoryperdb=true #auth=true replSet=rs0 oplogSize=100 keyFile=/usr/local/mongod/etc/mongo.pass ###三個配置文件中這個文件須要一致 ###還能夠添加一個仲裁的配置文件 mongodb_arb.conf port=27019 dbpath=/usr/local/mongod/data_arb/ logpath=/usr/local/mongod/log/mongodb_arb.log pidfilepath=/usr/local/mongod//mongod_arb.pid fork=true logappend=true shardsvr=true directoryperdb=true #auth=true replSet=rs0 oplogSize=100 keyFile=/usr/local/mongod/etc/mongo.pass ###三個配置文件中這個文件須要一致 首先啓動一個節點,即先啓動第一個mongodb,27017端口的那個,由於在此我想用其作primary節點 mongod -f /usr/local/mongod/etc/mongodb_primary.conf 啓動後,鏈接節點,在裏面添加用戶,在此 我添加了一個root角色的用戶(權限最高的用戶了), 添加用的方法以下: use admin db.createUser({user:"admin",pwd:"123456",roles:[{role:"root",db:"admin"}]}) 用戶添加完成後,關閉mongodb,而後修改mongodb的配置文件,只修改第一個的配置文件就行,由於在此,咱們就啓動了第一個mongodb數據庫, 修改的配置以下所示: port=27017 dbpath=/usr/local/mongod/data1/ logpath=/usr/local/mongod/log/mongodb.log pidfilepath=/usr/local/mongod//mongod.pid fork=true logappend=true shardsvr=true directoryperdb=true auth=true ###去掉註釋 replSet=rs0 ###去掉註釋 oplogSize=100 ###去掉註釋 keyFile=/usr/local/mongod/etc/mongo.pass ###去掉註釋 而後生成一個keyFile,副本集之間經過此文件來進行驗證, openssl rand -base64 521 > /usr/local/mongod/etc/mongo.pass ###這個名字隨意定義,可是配置文件中也須要制定這個文件的,在此個人是同一臺機器,因此,路徑相同,若是是不一樣機器之間的作副本集,則須要將此文件複製到不一樣的機器上去 建立完成後,還須要修改此文件的權限爲600,只有擁有者有權限,其他的組和其餘用戶沒有任何的權限 chmod 600 /usr/local/mongod/etc/mongo.pass 修改完成後,啓動mongdb數據庫便可 此次須要三個數據都啓動, 而後登錄數據庫進行操做就行,可是,切記須要先驗證帳號和密碼才能夠 use admin; db.auth('admin', '123456'); 接下來就能夠配置副本集了 #初始化一個Replica set,建立一個副本集配置對象 rsconf={ "_id" : "rs0", "members" : [ { "_id" : 0, "host" : "192.168.75.132:37017" } ] } rs.initiate(rsconf) #添加兩個從的副本集節點 rs.add("192.168.75.132:37018"); rs.add("192.168.75.132:37019"); rs.addArb("192.168.75.132:40000"); 而後就是添加用戶和建庫 這些都要在primary節點執行, use robo; db.createUser({user:'robo',pwd:'robo',roles:[{role:'readWrite',db:'robo'}]});//經測試,使用Robomongo鏈接,選擇兩種認證(MONGODB-CR,SCRAM-HAS-1)均可以聯通
php的代碼調用以下 :服務器
$server = "192.168.75.132:27017,192.168.75.132:27018,192.168.75.132:27019";// 能夠只有一部分,如兩臺的信息 $server = "192.168.75.132:27018,192.168.75.132:27019"; $options = [ 'readPreference' => MongoClient::RP_SECONDARY_PREFERRED, 'replicaSet' => 'rs',//要鏈接的集羣名稱 ]; $user = 'wayne'; $passwd = 'wayne'; $dbname = 'wayne_com'; $collectName = 'test_list'; $dsn = "mongodb://$user:$passwd@{$server}/{$dbname}"; $mongo = new MongoClient($dsn, $options); $mongo->selectDB($dbname); $coll = $mongo->selectCollection($dbname, $collectName); $where = ['name'=>'tong']; $cursor = $coll->find([])->limit(5); if ($cursor) { foreach ($cursor as $doc) { var_dump($doc); } } else { echo 'empty data'; }
今天測試了下node.js 調用副本集的腳本,測試經過。記錄下來。 app
var MongoClient = require('mongodb').MongoClient; // mongodb://user:password@server:port/dbname?replicaSet=replicaSetName 鏈接的完整格式,副本集不須要寫出全部的服務器的列表,只寫一部分也是可使用的,但若是寫入部分的服務器出問題了,是否會出現失敗,待之後確認 var url = 'mongodb://wayne:wayne@192.168.75.132:27018,192.168.75.132:27019/wayne_com?replicaSet=rs'; MongoClient.connect(url, function (err, db) { console.log('error', 'db connect is ok'); var collection = db.collection('test_list'); console.log('error', 'collection is ok'); collection.find({}).toArray(function (err, result) { console.log(err, result); }); });