Mongo副本集的配置以及php node.js鏈接使用副本集

最近弄了下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);
    });
});
相關文章
相關標籤/搜索