MongoDB復制集技術

為什么使用MongogDB復制集技術?

mysql中:一主一從,一主多從結構存在的問題
1、    fileover(故障轉移)a)    選主投票b)    切換
2、    是否對就用透明化
3、    數據補償的問題a)    兩階段數據補償
4、    解決方法 mysql中使用MHA+VIP + binlogserver

? mongodb通過復制集技術解決以上所有問題,不需要第三方軟件,自已原生支持

??MongoDB復制集簡介

一組Mongodb復制集,就是一組mongod進程,這些進程維護同一個數據集合。復制集提供了數據冗余和高等級的可靠性,這是生產部署的基礎。
保證數據在生產部署時的冗余和可靠性,通過在不同的機器上保存副本來保證數據的不會因為單點損壞而丟失。能夠隨時應對數據丟失、機器損壞帶來的風險,牛逼到不行。換一句話來說,還能提高讀取能力,用戶的讀取服務器和寫入服務器在不同的地方,而且,由不同的服務器為不同的用戶提供服務,提高整個系統的負載,簡直就是云存儲的翻版...一組復制集就是一組mongod實例掌管同一個數據集,實例可以在不同的機器上面。實例中包含一個主導,接受客戶端所有的寫入操作,其他都是副本實例,從主服務器上獲得數據并保持同步。
主服務器很重要,包含了所有的改變操作(寫)的日志。但是副本服務器集群包含有所有的主服務器數據,因此當主服務器掛掉了,就會在副本服務器上重新選取一個成為主服務器。每個復制集還有一個仲裁者,仲裁者不存儲數據,只是負責通過心跳包來確
認集群中集合的數量,并在主服務器選舉的時候作為仲裁決定結果。

?

?復制的基本架構

一個包含3個mongod的復制集架構如下所示

如果主服務器失效,會變成:

如果加上可選的仲裁者:

?

如果主服務器失效:

復制集技術實現

搭建三節點MongoDB復制集

#創建多mongodb多實例
mkdir
-p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/log mkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/log mkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/log mkdir -p /mongodb/28020/conf /mongodb/28020/data /mongodb/28020/log #創建mongodb多 vim /mongodb/28017/conf/mongod.conf systemLog:destination: filepath: /mongodb/28017/log/mongodb.loglogAppend: true storage:journal:enabled: truedbPath: /mongodb/28017/datadirectoryPerDB: true#engine: wiredTigerwiredTiger:engineConfig:cacheSizeGB: 1directoryForIndexes: truecollectionConfig:blockCompressor: zlibindexConfig:prefixCompression: true processManagement:fork: true net:port: 28017 replication:oplogSizeMB: 2048replSetName: my_repl\cp /mongodb/28017/conf/mongod.conf /mongodb/28018/conf/ \cp /mongodb/28017/conf/mongod.conf /mongodb/28019/conf/ \cp /mongodb/28017/conf/mongod.conf /mongodb/28020/conf/ sed 's#28017#28018#g' /mongodb/28018/conf/mongod.conf -i sed 's#28017#28019#g' /mongodb/28019/conf/mongod.conf -i sed 's#28017#28020#g' /mongodb/28020/conf/mongod.conf -ichown -R mongod:mongod /mongodb/su - mongod mongod -f /mongodb/28017/conf/mongod.conf mongod -f /mongodb/28018/conf/mongod.conf mongod -f /mongodb/28019/conf/mongod.conf mongod -f /mongodb/28020/conf/mongod.conf

?

登錄

?

mongo --port=28017
use admin
config = {_id: 'my_repl', members: [{_id: 0, host: '10.0.0.134:28017'},{_id: 1, host: '10.0.0.134:28018'},{_id: 2, host: '10.0.0.134:28019'}]}
rs.initiate(config)
use test;
db.movies.insert([ { "title" : "Jaws", "year" : 1975, "imdb_rating" : 8.1 },{ "title" : "Batman", "year" : 1989, "imdb_rating" : 7.6 },
] );

?

?

#復制集狀態查詢 在哪個節點都可以看

[mongod@mongo ~]$ mongo --port=28017
MongoDB shell version: 3.2.8
connecting to: 127.0.0.1:28017/test
my_repl:PRIMARY> rs.status();
{"set" : "my_repl","date" : ISODate("2018-01-04T09:06:52.951Z"),"myState" : 1,"term" : NumberLong(1),"heartbeatIntervalMillis" : NumberLong(2000),"members" : [{"_id" : 0,"name" : "10.0.0.134:28017", #ip port"health" : 1,"state" : 1,"stateStr" : "PRIMARY", "PRIMARY" 主節點"uptime" : 772,"optime" : {"ts" : Timestamp(1515056188, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2018-01-04T08:56:28Z"),"electionTime" : Timestamp(1515056187, 1),"electionDate" : ISODate("2018-01-04T08:56:27Z"),"configVersion" : 1,"self" : true},{"_id" : 1,"name" : "10.0.0.134:28018", #ip port"health" : 1,"state" : 2,"stateStr" : "SECONDARY", #從節點"uptime" : 635,"optime" : {"ts" : Timestamp(1515056188, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2018-01-04T08:56:28Z"),"lastHeartbeat" : ISODate("2018-01-04T09:06:52.289Z"),"lastHeartbeatRecv" : ISODate("2018-01-04T09:06:51.722Z"),"pingMs" : NumberLong(0),"syncingTo" : "10.0.0.134:28017","configVersion" : 1},{"_id" : 2,"name" : "10.0.0.134:28019", #ip port"health" : 1,"state" : 2,"stateStr" : "SECONDARY", #從節點"uptime" : 635,"optime" : {"ts" : Timestamp(1515056188, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2018-01-04T08:56:28Z"),"lastHeartbeat" : ISODate("2018-01-04T09:06:52.289Z"),"lastHeartbeatRecv" : ISODate("2018-01-04T09:06:51.601Z"),"pingMs" : NumberLong(0),"syncingTo" : "10.0.0.134:28017","configVersion" : 1}],"ok" : 1
}

?

?

?

#查看當前是否為主節點

?

?

#主節點檢測
my_repl:PRIMARY>  rs.isMaster();
{"hosts" : ["10.0.0.134:28017","10.0.0.134:28018","10.0.0.134:28019"],"setName" : "my_repl","setVersion" : 1,"ismaster" : true, #主節點"secondary" : false,"primary" : "10.0.0.134:28017","me" : "10.0.0.134:28017","electionId" : ObjectId("7fffffff0000000000000001"),"maxBsonObjectSize" : 16777216,"maxMessageSizeBytes" : 48000000,"maxWriteBatchSize" : 1000,"localTime" : ISODate("2018-01-04T09:11:15.204Z"),"maxWireVersion" : 4,"minWireVersion" : 0,"ok" : 1
}#從節點檢測
[mongod@mongo ~]$ mongo --port=28018
MongoDB shell version: 3.2.8
connecting to: 127.0.0.1:28018/test
my_repl:SECONDARY> rs.isMaster()
{"hosts" : ["10.0.0.134:28017","10.0.0.134:28018","10.0.0.134:28019"],"setName" : "my_repl", "setVersion" : 1,"ismaster" : false, "secondary" : true, #從節點"primary" : "10.0.0.134:28017","me" : "10.0.0.134:28018","maxBsonObjectSize" : 16777216,"maxMessageSizeBytes" : 48000000,"maxWriteBatchSize" : 1000,"localTime" : ISODate("2018-01-04T09:11:40.092Z"),"maxWireVersion" : 4,"minWireVersion" : 0,"ok" : 1
}

?

?

#在主節點上添加節點

my_repl:PRIMARY> rs.add ("10.0.0.134:28020") #添加從節點
{ "ok" : 1 }
my_repl:PRIMARY> rs.status()
{"set" : "my_repl","date" : ISODate("2018-01-04T09:16:33.144Z"),"myState" : 1,"term" : NumberLong(1),"heartbeatIntervalMillis" : NumberLong(2000),"members" : [{"_id" : 0,"name" : "10.0.0.134:28017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 1353,"optime" : {"ts" : Timestamp(1515057249, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2018-01-04T09:14:09Z"),"electionTime" : Timestamp(1515056187, 1),"electionDate" : ISODate("2018-01-04T08:56:27Z"),"configVersion" : 2,"self" : true},{"_id" : 1,"name" : "10.0.0.134:28018","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 1216,"optime" : {"ts" : Timestamp(1515057249, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2018-01-04T09:14:09Z"),"lastHeartbeat" : ISODate("2018-01-04T09:16:31.632Z"),"lastHeartbeatRecv" : ISODate("2018-01-04T09:16:31.693Z"),"pingMs" : NumberLong(0),"syncingTo" : "10.0.0.134:28017","configVersion" : 2},{"_id" : 2,"name" : "10.0.0.134:28019","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 1216,"optime" : {"ts" : Timestamp(1515057249, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2018-01-04T09:14:09Z"),"lastHeartbeat" : ISODate("2018-01-04T09:16:31.632Z"),"lastHeartbeatRecv" : ISODate("2018-01-04T09:16:31.693Z"),"pingMs" : NumberLong(0),"syncingTo" : "10.0.0.134:28017","configVersion" : 2},{"_id" : 3,"name" : "10.0.0.134:28020","health" : 1,"state" : 2,"stateStr" : "SECONDARY", #從節點10.0.0.134:28020"uptime" : 143,"optime" : {"ts" : Timestamp(1515057249, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2018-01-04T09:14:09Z"),"lastHeartbeat" : ISODate("2018-01-04T09:16:31.647Z"),"lastHeartbeatRecv" : ISODate("2018-01-04T09:16:30.645Z"),"pingMs" : NumberLong(0),"configVersion" : 2}],"ok" : 1
}

?

?

#刪除節點

my_repl:PRIMARY> rs.remove("10.0.0.134:28020") #刪除從節點
{ "ok" : 1 }
my_repl:PRIMARY> rs.status()
{"set" : "my_repl","date" : ISODate("2018-01-04T09:18:10.582Z"),"myState" : 1,"term" : NumberLong(1),"heartbeatIntervalMillis" : NumberLong(2000),"members" : [{"_id" : 0,"name" : "10.0.0.134:28017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 1450,"optime" : {"ts" : Timestamp(1515057484, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2018-01-04T09:18:04Z"),"electionTime" : Timestamp(1515056187, 1),"electionDate" : ISODate("2018-01-04T08:56:27Z"),"configVersion" : 3,"self" : true},{"_id" : 1,"name" : "10.0.0.134:28018","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 1313,"optime" : {"ts" : Timestamp(1515057484, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2018-01-04T09:18:04Z"),"lastHeartbeat" : ISODate("2018-01-04T09:18:10.231Z"),"lastHeartbeatRecv" : ISODate("2018-01-04T09:18:10.241Z"),"pingMs" : NumberLong(0),"syncingTo" : "10.0.0.134:28017","configVersion" : 3},{"_id" : 2,"name" : "10.0.0.134:28019","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 1313,"optime" : {"ts" : Timestamp(1515057484, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2018-01-04T09:18:04Z"),"lastHeartbeat" : ISODate("2018-01-04T09:18:10.231Z"),"lastHeartbeatRecv" : ISODate("2018-01-04T09:18:10.243Z"),"pingMs" : NumberLong(0),"syncingTo" : "10.0.0.134:28017","configVersion" : 3}],"ok" : 1
}

?

?#添加仲裁節點

my_repl:PRIMARY> rs.addArb("10.0.0.134:28020");#添加仲裁節點
{ "ok" : 1 }
my_repl:PRIMARY> rs.status();
{"set" : "my_repl","date" : ISODate("2018-01-04T09:19:32.814Z"),"myState" : 1,"term" : NumberLong(1),"heartbeatIntervalMillis" : NumberLong(2000),"members" : [{"_id" : 0,"name" : "10.0.0.134:28017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 1532,"optime" : {"ts" : Timestamp(1515057570, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2018-01-04T09:19:30Z"),"electionTime" : Timestamp(1515056187, 1),"electionDate" : ISODate("2018-01-04T08:56:27Z"),"configVersion" : 6,"self" : true},{"_id" : 1,"name" : "10.0.0.134:28018","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 1395,"optime" : {"ts" : Timestamp(1515057570, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2018-01-04T09:19:30Z"),"lastHeartbeat" : ISODate("2018-01-04T09:19:30.915Z"),"lastHeartbeatRecv" : ISODate("2018-01-04T09:19:30.926Z"),"pingMs" : NumberLong(0),"syncingTo" : "10.0.0.134:28017","configVersion" : 5},{"_id" : 2,"name" : "10.0.0.134:28019","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 1395,"optime" : {"ts" : Timestamp(1515057534, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2018-01-04T09:18:54Z"),"lastHeartbeat" : ISODate("2018-01-04T09:19:30.902Z"),"lastHeartbeatRecv" : ISODate("2018-01-04T09:19:30.922Z"),"pingMs" : NumberLong(0),"syncingTo" : "10.0.0.134:28017","configVersion" : 5},{"_id" : 4,"name" : "10.0.0.134:28020","health" : 1,"state" : 7,"stateStr" : "ARBITER", #仲裁節點"uptime" : 34,"lastHeartbeat" : ISODate("2018-01-04T09:19:30.903Z"),"lastHeartbeatRecv" : ISODate("2018-01-04T09:19:30.924Z"),"pingMs" : NumberLong(0),"syncingTo" : "10.0.0.134:28019","configVersion" : 5}],"ok" : 1
}

?

?#主、從、仲裁節點對比

#主節點操作
[mongod@mongo ~]$ mongo --port=28017
MongoDB shell version: 3.2.8
connecting to: 127.0.0.1:28017/test
my_repl:PRIMARY> use test
switched to db test
my_repl:PRIMARY> db.anyux.insert([{"language":"C"},{"language":"C++"}]) #插入數據
BulkWriteResult({"writeErrors" : [ ],"writeConcernErrors" : [ ],"nInserted" : 2,"nUpserted" : 0,"nMatched" : 0,"nModified" : 0,"nRemoved" : 0,"upserted" : [ ]
})
my_repl:PRIMARY> db.anyux.find().pretty()                   #主節點顯示數據
{ "_id" : ObjectId("5a4df337c702312dedac9176"), "language" : "C" }
{ "_id" : ObjectId("5a4df337c702312dedac9177"), "language" : "C++" }#從節點操作
MongoDB shell version: 3.2.8
connecting to: 127.0.0.1:28018/test
my_repl:SECONDARY> use test
my_repl:SECONDARY> rs.slaveOk();
my_repl:SECONDARY> db.anyux.find().pretty()                             #從節點顯示數據
{ "_id" : ObjectId("5a4df337c702312dedac9176"), "language" : "C" }
{ "_id" : ObjectId("5a4df337c702312dedac9177"), "language" : "C++" }#仲裁節點
[mongod@mongo ~]$ mongo --port=28020
MongoDB shell version: 3.2.8
connecting to: 127.0.0.1:28020/test
my_repl:ARBITER> rs.slaveOk();
my_repl:ARBITER> show dbs;
local  0.000GB
test   0.000GB
my_repl:ARBITER> db.anyux.find().pretty();                               #仲裁節點不會存儲數據
Error: error: { "ok" : 0, "errmsg" : "node is recovering", "code" : 13436 }

?

轉載于:https://www.cnblogs.com/anyux/p/8194648.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255774.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255774.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255774.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux文件系統的實現 (圖文并茂,比較好)

作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝! Linux文件管理從用戶的層面介紹了Linux管理文件的方式。Linux有一個樹狀結構來組織文件。樹的頂端為根目錄(/),節點為目錄&#xff0…

【深度學習】——如何處理輸入圖像大小不一樣的情況

這里一般有常見的幾種方法: 1)將圖像縮放成大小一致后再輸入,如RCNN算法 2)roi pooling:這里允許輸入圖像的大小不一樣,后續根據指定的固定大小來求解池化的核大小,以此來得到相同大小的特征圖&…

ROS探索總結(一)——ROS簡介

隨著機器人領域的快速發展和復雜化,代碼的復用性和模塊化的需求原來越強烈,而已有的開源機器人系統又不能很好的適應需求。2010年Willow Garage公司發布了開源機器人操作系統ROS(robot operating system),很快在機器人…

微信瀏覽器取消緩存的方法

摘要:做微信公家號以及調試手機頁面的時辰,防止不了頁面要跳轉到微信閱讀器打開,調試階段,android版微信閱讀器一直都默許緩存html靜態資本,每一次靜態資本變革乃至新內容發布的時辰在微信閱讀器上都極有可能不克不及更新&#xf…

【機器視覺】——裂紋檢測筆記

目錄 傳統算法處理裂縫的基本思路: 第一種思路 第二種思路: 第三種思路 CPP代碼 halcon代碼 python代碼 Matlab代碼 深度學習缺陷檢測 裂縫檢測文獻 傳統算法處理裂縫的基本思路: 第一種思路 1.先轉換彩色圖為灰度圖 2.進行自適應…

利用union判斷系統的大小端

int checkCPUendian()//返回1,為小端;反之,為大端; { union{ unsigned int a; unsigned char b; }c; c.a 1; return 1 c.b; }大端模式(Big-endian),是指數據的高字節保存在內存的低地址中,而數據…

Filter(過濾器)?和?interceptor(攔截器)的區別

Filter(過濾器) 和 interceptor(攔截器)的區別 1.攔截器是基于java反射機制的,而過濾器是基于函數回調的。 2.過濾器依賴于Servlet容器,而攔截器不依賴于Servlet容器。 3.攔截器只對Action請求起作用&#…

ROS探索總結(二)——ROS總體框架

一、 總體結構 根據ROS系統代碼的維護者和分布來標示,主要有兩大部分:(1)main:核心部分,主要由Willow Garage公司和一些開發者設計、提供以及維護。它提供了一些分布式計算的基本工具,以及整個…

python 阿貍的進階之路(4)

裝飾器 #1、開放封閉原則:對擴展開放,對修改是封閉#2、裝飾器:裝飾它人的,器指的是任意可調用對象,現在的場景裝飾器-》函數,被裝飾的對象也是-》函數#原則:1、不修改被裝飾對象的源代碼 2、不修…

【深度學習】——利用pytorch搭建一個完整的深度學習項目(構建模型、加載數據集、參數配置、訓練、模型保存、預測)

目錄 一、深度學習項目的基本構成 二、實戰(貓狗分類) 1、數據集下載 2、dataset.py文件 3、model.py 4、config.py 5、predict.py 一、深度學習項目的基本構成 一個深度學習模型一般包含以下幾個文件: datasets文件夾:存放…

二叉樹的序遍歷

時間限制: 1 s空間限制: 32000 KB題目等級 : 白銀 Silver題目描述 Description求一棵二叉樹的前序遍歷,中序遍歷和后序遍歷 輸入描述 Input Description第一行一個整數n,表示這棵樹的節點個數。 接下來n行每行2個整數L和R。第i行的兩個整數Li和Ri代表編號…

GUI登錄界面

在這次的作業中,我先使用單選按鈕,輸入框,復選框設計了一個簡單地登錄界面。接著我使用了MouseListener將登陸按鈕與下一個“查詢界面”連接起來。最后我使用了我們本周所學的JFrame框架與事件處理機制設計了一個簡單地界面。我所設計的登錄界…

淺談ROS操作系統及其應用趨勢

ROS操作系統是最先由斯坦福開發的開源機器人操作系統,目前由willowgarage公司開發和維護,相關的開發社區也很成熟( http://www.ros.org , http://answers.ros.org, http://www.willowgarage.com), 經過幾年的發展API也逐漸穩定&a…

Raft學習傳送門

Raft官網 官方可視化動畫1 官方可視化動畫2 論文中文翻譯 論文英文地址 Paxos Made Simple論文翻譯 Raft理解 技術分享 《分布式一致性raft算法實現原理》 狀態機 MIT: raft實現 分布式系統學習2-Raft算法分析與實現 分布式系統MIT 6.824學習資源 知乎大神的&#…

【Python生成器與迭代器的區別】

目錄 一、迭代 二、迭代器 1)創建迭代器——兩種方法 iter()方法 利用()和range結合使用 2)具體案例 3、生成器 4、二者的異同 1)、共同點 2)、不同點 a、語法上 b、用法上 一、迭代 首先理解一…

BZOJ4426 : [Nwerc2015]Better Productivity最大生產率

如果一個區間包含另一個區間,那么這兩個區間是否在一起的生產率是一樣的。 將所有這種包含了其他區間的區間放入數組$b$,其余的放入數組$c$,有多個相同的時候則從$b$移一個到$c$。 那么$c$里所有區間左端點遞增,右端點也遞增&…

[codevs1105][COJ0183][NOIP2005]過河

[codevs1105][COJ0183][NOIP2005]過河 試題描述 在河上有一座獨木橋,一只青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由于橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的…

ABB機器人套接口通信 機器人部分

ABB機器人套接口通信 機器人部分 文章機器人部分,描述如何運行機器人從機程序,使機器人根據上位機節點發送的命令,執行具體運動。 ABB機器人執行3個任務。這些任務都配置為SEMISTATIC(背景程序)的任務,第三任務是正常動作任務。下文描述如…

CRM項目總結

CRM項目總結 一:開發背景 在公司日益擴大的過程中,不可避免的會伴隨著更多問題出現。 對外 : 如何更好的管理客戶與公司的關系?如何更及時的了解客戶日益發展的需求變化?公司的產品是否真的符合客戶需求?以…

【面經——《速騰聚創科技有限公司——深度學習算法工程師》】

自我介紹 實習項目 1)項目主要應用的領域? 2)難點在哪?——機械臂吸盤大小和目標大小之間坐標的協調 3)難點不在于算法,在于數據的處理和均衡性?對于數據均衡方面有什么理解&#xf…