mongodb分佈式之數據複製

在之前的《MongoDB分佈式部署》中已經提到,同一組數據庫服務器上的數據是支持複製的。mongodb支持兩種方式的數據複製,簡單的主從配置和互爲主從的配置。

MongoDB分佈式部署之分片配置可見http://hi.baidu.com/lzpsky/blog/item/644e083d6bbd920cbaa16793.html

   一、主從配置(Master Slave)

主從數據庫需要兩個數據庫節點即可,一主一從(並不一定非得兩***立的服務器,可使用--dbpath參數指定數據庫目錄)。
$ bin/mongod --master [--dbpath /data/masterdb/]   

於是,主服務器進程就會創建一個local.oplog.$main數據集,即"transaction log",以記錄從服務器需要的操作隊列信息。

配置一個從數據庫節點:

$ bin/mongod --slave --source <masterhostname>[:<port>] [--dbpath /data/slavedb/]

主節點的信息會存放在從節點的 local.sources數據集中,也可以不指定--source參數,而是往local.sources中增加一條包含主節點信息的記錄。

$ bin/mongo <slavehostname>/local 
> db.sources.find();      // confirms the collection is empty. then:
> db.sources.insert( { host: <masterhostname> } ); 
host:<masterhostname> 主節點的ip地址或域名全稱,可跟上:port指定端口。

如果指定了only: databasename (optional) ,表示只有指定的數據庫才複製,注:v1.2.1+修復了only的一個bug。

一個從節點可以有多個主節點,這種情況下,local.sources中會有多條配置信息。

  一臺服務器可以同時即爲主也爲從。如果一臺從節點與主節點不同步,比如從節點的數據更新遠遠跟不上主節點或者從節點中斷之後重啓但主節點中相關的數據更新日誌卻不可用了。這種情況下,複製操作將會終止,需要管理者的介入,看是否默認需要重啓複製操作。管理者可以使用{resync:1} 命令重啓複製操作,可選命令行參數 --autoresync可使從節點在不同步情況發生10秒鐘之後,自動重啓複製操作。如果指定了--autoresync參數,從節點在10分鐘以內自動重新同步數據的操作只會執行一次。

--oplogSize命令行參數(與--master一同使用)配置用於存儲給從節點可用的更新信息佔用的磁盤空間(M爲單位),如果不指定這個參數,默認大小爲當前可用磁盤空間的5%(64位機器最小值爲1G,32位機器爲50M)。

安全性方面:

$ dbshell <slavehostname>/admin -u <existingadminusername> -p<adminpassword>
> use local 
> db.addUser('repl', <replpassword>);
^c 
$ dbshell <masterhostname>/admin -u <existingadminusername> -p<adminpassword> 
> use local 
> db.addUser('repl', <replpassword>); 
   
二、互爲主從(Replica Pairs

數據庫自動協調某個時間點上的主從關係。開始的時候,數據庫會判斷哪個是從哪個是主,一旦主服務器負載過高,另一臺就會自動成爲主服務器。

$ ./mongod --pairwith <remoteserver> --arbiter <arbiterserver>

remoteserver組中的其他服務器host,可加:port指定端口。
arbiterserver 仲裁(arbiter )的host,也可指定端口。仲裁是一臺mongodb服務器,用於協助判斷某個時間點上的數據庫主從關係。如果同組服務器在同一個交換機或相同的ec2可用區域內,就沒必要使用仲裁了。如果同組服務器之間不能通信,可是使用運行在第三方機器上的仲裁,使用“搶七”方式有效地敲定主服務器,也可不使用仲裁,這樣所有的服務器都假定是主服務器狀態,可通過命令人工檢測當前哪臺數據庫是主數據庫:

$ ./mongo 
> db.$cmd.findOne({ismaster:1});
{ "ismaster" : 0.0 , "remote" : "192.168.58.1:30001" , "ok" : 1.0 } 

一致性:故障轉移機制只能夠保障組中的數據庫上的數據的最終一致性。如果機器L是主服務器,然後掛了,那麼發生在它身上的最後幾秒鐘的操作信息就到達不了機器R,那麼機器R在機器L恢復之前是不能執行這些操作的。

安全性:同主從的操作相同。

數據庫服務器替換。當一臺服務器失敗了,系統能自動在線恢復。但當一臺機器徹底掛了,就需要替換機器,而替換機器一開始是沒有數據的,怎麼辦?以下會解釋如何替換一組服務器中的一臺機器。

假設nodes(n1,n2)中的n2掛了,需要變成nodes(n1,n3)。
1、假設n2徹底掛了下線了,不能在線恢復。
2、需要告訴n1,你的搭檔已經不是n2了而是n3。可使用replacepeer 命令,檢測該操作的返回值以確保操作成功。

n1> ./mongo n1/admin
> db.$cmd.findOne({replacepeer:1});
{
"info" : "adjust local.sources hostname; db restart now required" 
"ok" : 1.0


3、使用以下命令重啓n1。
n1> ./mongod --pairwith n3 --arbiter <arbiterserver> 

4、啓動n3。
n3> ./mongod --pairwith n1 --arbiter <arbiterserver> 

注意的是,n3在與n1數據完全同步之前不能接收作爲主節點的任何操作。
如果從節點設置了ok標誌(db.getMongo().setSlaveOk() ),就可以查詢從節點了。

三、配置案例

《MongoDB分佈式部署之分片配置》的第六個模塊——案例部分,有詳解。

四、java案例

1、鏈接mongodb:
ServerAddress right = new ServerAddress("10.13.127.212", 18020);
ServerAddress left = new ServerAddress("10.13.127.211", 18020);
Mongo mongo = new Mongo(right, left);

DB db = mongo.getDB("test");
db.authenticate("test", "test".toCharArray());
2、插入:
BasicDBObject dbObject = new BasicDBObject();
dbObject.put("id", i);
dbObject.put("time", System.currentTimeMillis());

coll.insert(dbObject);
3、更新
coll.update(new BasicDBObject("_id", id),  getDBObjectByLabel(mongoLabel));
4、查詢,查詢條件的表達式文檔
BasicDBObject dbObject = new BasicDBObject();
dbObject.put("id", 1);    //增加查詢條件
BasicDBObject sortObject = new BasicDBObject(LabelConstant.ORDER_BY,LabelConstant.ORDER_DESC);

DBCursor dbCursor = coll.find(dbObject);  //不分頁不排序
//cursor = coll.find(doc).skip((pageNo - 1) * pageSize).limit(pageSize).sort(sortObject);  //分頁排序
DBObject result = dbCursor.next();  //取數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章