mongodb 複本集

來源:互聯網
上載者:User

標籤:mongodb 複本集 replset rs.status()

系統:centos6.5


IP:10.19.21.244 主節點

10.19.21.245 備節點

10.19.21.248 仲裁點


不只是主節點、副本節點、仲裁節點,還有Secondary-Only、Hidden、Delayed、Non-Voting。

Secondary-Only:不能成為primary節點,只能作為secondary副本節點,防止一些效能不高的節點成為主節點。

Hidden:這類節點是不能夠被用戶端制定IP引用,也不能被設定為主節點,但是可以投票,一般用於備份資料。

Delayed:可以指定一個時間延遲從primary節點同步資料。主要用於備份資料,如果即時同步,誤刪除資料馬上同步到從節點,恢複又恢複不了。

Non-Voting:沒有選舉權的secondary節點,純粹的備份資料節點。



三台主機安裝mongodb

下載mongodbwget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.9.tgz解壓到目錄tar xf mongodb-linux-x86_64-2.6.9.tgz -C /usr/local/src更改名mv mongodb-linux-x86_64-2.6.9 /usr/local/mongodbcd /usr/local/mongodb/建立資料目錄和日誌目錄mkdir -p data log建立使用者useradd mongodb -s /sbin/nologin更改目錄屬主屬組chown mongod:mongodb /usr/local/mongodb -R更改環境變數vim ~/.bash_profilePATH=$PATH:/usr/local/mongodb/binsource ~/.bash_profile
設定檔vim /etc/mongodb.confport = 27017fork = truelogpath = /usr/local/mongodb/log/mongodb.logdbpath =/usr/local/mongodb/data/journal = true#以目錄的形式存資料,如果已經存在,修改此配置會導致未經處理資料消失(注釋次參數會回來),除非遷移現有資料檔案到directoryperdb所產生的資料目錄中。directoryperdb=true#日誌增加形式寫入logappend=true#配置複本集,指定副本名稱作為參數,所有主機都必須有相同名稱作為同一個複本集replSet=testrs#使用預分配方式來保證寫入效能的穩定,預分配在後台進行,並且每個預分配的檔案都用0進行填充。這會讓MongoDB始終保持額外的空間和空餘的資料檔案,從而避免了資料增長過快而帶來的分配磁碟空間引起的阻塞。設定noprealloc= true來禁用預分配的資料檔案,會縮短啟動時間,但在正常操作過程中,可能會導致效能顯著下降。noprealloc=true
啟動服務mongod -f /etc/mongodb.conf
首先串連主節點mongo> use admin> conf = {_id:"testrs",members:[{_id:0,host:"10.19.21.244:27017",priority:2},{_id:1,host:"10.19.21.245:27017",priority:1},{_id:2,host:"10.19.21.248:27017",arbiterOnly:true}]};{"_id" : "testrs","version" : 1,"members" : [{"_id" : 0,"host" : "10.19.21.244:27017","priority" : 2},{"_id" : 1,"host" : "10.19.21.245:27017"},{"_id" : 2,"host" : "10.19.21.248:27017","arbiterOnly" : true}]}注意最初的_id的值就是我們設定檔中設定的replSet的值,arbiterOnly是大寫的O,配置完成後進行初始化:> rs.initiate(conf){"info" : "Config now saved locally.  Should come online in about a minute.","ok" : 1}此步驟必須備節點和仲裁節點的mongo啟動,不然無法執行此步驟。
> rs.status(){"set" : "testrs","date" : ISODate("2015-05-07T11:55:17Z"),"myState" : 1,"members" : [{"_id" : 0,"name" : "10.19.21.244:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 5737,"optime" : Timestamp(1430995665, 1),"optimeDate" : ISODate("2015-05-07T10:47:45Z"),"electionTime" : Timestamp(1430993992, 1),"electionDate" : ISODate("2015-05-07T10:19:52Z"),"self" : true},{"_id" : 1,"name" : "10.19.21.245:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 3077,"optime" : Timestamp(1430995665, 1),"optimeDate" : ISODate("2015-05-07T10:47:45Z"),"lastHeartbeat" : ISODate("2015-05-07T11:55:17Z"),"lastHeartbeatRecv" : ISODate("2015-05-07T11:55:17Z"),"pingMs" : 0,"syncingTo" : "10.19.21.244:27017"},{"_id" : 2,"name" : "10.19.21.248:27017","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 5735,"lastHeartbeat" : ISODate("2015-05-07T11:55:17Z"),"lastHeartbeatRecv" : ISODate("2015-05-07T11:55:17Z"),"pingMs" : 0}],"ok" : 1}
> use test插入資料> db.testdb.insert({"tset1":"i‘m master"})
然後到備份節點查看資料是否有mongo 10.19.21.245testrs:SECONDARY> use testswitched to db testtestrs:SECONDARY> show tables;2015-05-07T19:57:29.670+0800 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:131需要進行配置testrs:SECONDARY> db.setSlaveOk()testrs:SECONDARY> show tables;system.indexestestdbtestrs:SECONDARY> db.testdb.find(){ "_id" : ObjectId("554a4ee4eb804a0f1b6ec347"), "test1" : "i‘m master" }
停止主節點,查看整個叢集狀態testrs:PRIMARY> rs.status(){"set" : "testrs","date" : ISODate("2015-05-07T11:59:42Z"),"myState" : 1,"members" : [{"_id" : 0,"name" : "10.19.21.244:27017","health" : 0,"state" : 8,"stateStr" : "(not reachable/healthy)","uptime" : 0,"optime" : Timestamp(1430995665, 1),"optimeDate" : ISODate("2015-05-07T10:47:45Z"),"lastHeartbeat" : ISODate("2015-05-07T11:59:40Z"),"lastHeartbeatRecv" : ISODate("2015-05-07T11:59:32Z"),"pingMs" : 0},{"_id" : 1,"name" : "10.19.21.245:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 3342,"optime" : Timestamp(1430995665, 1),"optimeDate" : ISODate("2015-05-07T10:47:45Z"),"electionTime" : Timestamp(1430999976, 1),"electionDate" : ISODate("2015-05-07T11:59:36Z"),"self" : true},{"_id" : 2,"name" : "10.19.21.248:27017","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 3340,"lastHeartbeat" : ISODate("2015-05-07T11:59:42Z"),"lastHeartbeatRecv" : ISODate("2015-05-07T11:59:41Z"),"pingMs" : 0}],"ok" : 1}
主節點已切換過來,此時備節點已經變成了主節點。再插入一條資料testrs:PRIMARY> db.testdb.insert({"test2":"i‘m new master"})testrs:PRIMARY> db.testdb.find();{ "_id" : ObjectId("554a4ee4eb804a0f1b6ec347"), "test1" : "i‘m master" }{ "_id" : ObjectId("554a505d494f70c600422b41"), "test2" : "i‘m new master" }
重啟原來的主節點查看狀態testrs:SECONDARY> rs.status(){"set" : "testrs","date" : ISODate("2015-05-07T14:00:33Z"),"myState" : 1,"members" : [{"_id" : 0,"name" : "10.19.21.244:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 15,"optime" : Timestamp(1430995665, 1),"optimeDate" : ISODate("2015-05-07T10:47:45Z"),"electionTime" : Timestamp(1431007222, 1),"electionDate" : ISODate("2015-05-07T14:00:22Z"),"self" : true},{"_id" : 1,"name" : "10.19.21.245:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 13,"optime" : Timestamp(1430995665, 1),"optimeDate" : ISODate("2015-05-07T10:47:45Z"),"lastHeartbeat" : ISODate("2015-05-07T14:00:32Z"),"lastHeartbeatRecv" : ISODate("2015-05-07T14:00:33Z"),"pingMs" : 0,"lastHeartbeatMessage" : "syncing to: 10.19.21.244:27017","syncingTo" : "10.19.21.244:27017"},{"_id" : 2,"name" : "10.19.21.248:27017","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 13,"lastHeartbeat" : ISODate("2015-05-07T14:00:32Z"),"lastHeartbeatRecv" : ISODate("2015-05-07T14:00:33Z"),"pingMs" : 0}],"ok" : 1}
查看資料是否同步過來testrs:PRIMARY> use testswitched to db testtestrs:PRIMARY> db.testdb.find(){ "_id" : ObjectId("554a4ee4eb804a0f1b6ec347"), "test1" : "i‘m master" }{ "_id" : ObjectId("554a505d494f70c600422b41"), "test2" : "i‘m new master" }
向叢集中增加節點cfg = rs.conf()cfg.members[3] = {_id:3,host:"10.19.21.246:27017",priority:0.5}rs.reconfig(cfg)如果備份節點無法讀取資料,需要設定db.setSlaveOK()。如果備份節點可讀但不可寫,修改優先順序cfg = rs.conf()cfg.members[0].priority = 0.5cfg.members[1].priority = 2cfg.members[2].priority = 2rs.reconfig(cfg)需要 reconfig後配置才會生效。
php與mongodb串連<?php$options = array(        ‘replicaSet‘ => ‘testrs‘,        ‘readPreference‘ => ‘secondaryPreferred‘,);$m = new MongoClient("mongodb://10.19.21.244:27017,10.19.21.245:27017/", $options);foreach ( $m->getConnections() as $c ){    echo $c[‘hash‘], ":\n",    " - {$c[‘connection‘][‘connection_type_desc‘]}, ",    "{$c[‘connection‘][‘ping_ms‘]} ms\n";}?>

primary:預設參數,只從主節點上進行讀取操作;

primaryPreferred:大部分從主節點上讀取資料,只有主節點不可用時從secondary節點讀取資料。

secondary:只從secondary節點上進行讀取操作,存在的問題是secondary節點的資料會比primary節點資料“舊”。

secondaryPreferred:優先從secondary節點進行讀取操作,secondary節點不可用時從主節點讀取資料;

nearest:不管是主節點、secondary節點,從網路延遲最低的節點上讀取資料。


本文出自 “charlie_cen” 部落格,請務必保留此出處http://charlie928.blog.51cto.com/3741218/1643841

mongodb 複本集

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.