副本集
MongoDB復制是將數(shù)據(jù)同步在多個服務器的過程懦鼠。
復制提供了數(shù)據(jù)的冗余備份,并在多個服務器上存儲數(shù)據(jù)副本,提高了數(shù)據(jù)的可用性伸眶, 并可以保證數(shù)據(jù)的安全性。
復制還允許您從硬件故障和服務中斷中恢復數(shù)據(jù)刽宪。
- 保障數(shù)據(jù)的安全性
- 數(shù)據(jù)高可用性 (24*7)
- 災難恢復
- 無需停機維護(如備份厘贼,重建索引,壓縮)
- 分布式讀取數(shù)據(jù)
原理
mongodb的復制至少需要兩個節(jié)點纠屋。其中一個是主節(jié)點涂臣,負責處理客戶端請求,其余的都是從節(jié)點售担,負責復制主節(jié)點上的數(shù)據(jù)赁遗。
mongodb各個節(jié)點常見的搭配方式為:一主一從、一主多從族铆。
主節(jié)點記錄在其上的所有操作oplog岩四,從節(jié)點定期輪詢主節(jié)點獲取這些操作,然后對自己的數(shù)據(jù)副本執(zhí)行這些操作哥攘,從而保證從節(jié)點的數(shù)據(jù)與主節(jié)點一致剖煌。
客戶端從主節(jié)點讀取數(shù)據(jù)材鹦,在客戶端寫入數(shù)據(jù)到主節(jié)點時, 主節(jié)點與從節(jié)點進行數(shù)據(jù)交互保障數(shù)據(jù)的一致性耕姊。
特征
- N 個節(jié)點的集群
- 任何節(jié)點可作為主節(jié)點
- 所有寫入操作都在主節(jié)點上
- 自動故障轉移
- 自動恢復
實驗
首先關閉服務器上所有的mongodb服務
然后建立三個文件夾 /data/db1 /data/db2 /data/db3
然后使用命令
mongod --port 27017 --dbpath "/data/db1" --replSet rs0
Mongodb同時還提供了一種后臺Daemon方式啟動桶唐,只需要加上一個"--fork"參數(shù)即可,值得注意的是茉兰,用到了"--fork"參數(shù)就必須啟用"--logpath"參數(shù)尤泽。如下所示:
mongod --port 27017 --dbpath=data/db --fork --logpath=log/mongodb.log
啟動一個實例,接著打開另外兩個從節(jié)點服務
mongod --port 27018 --dbpath "/data/db2" --fork --logpath=log/2.log --replSet rs0
mongod --port 27019 --dbpath "/data/db3" --fork --logpath=log/3.log --replSet rs0
接著规脸,我們進入第一個服務器坯约,進行副本集設置
(<hostname> 代表自己的ip地址)
#連接數(shù)據(jù)庫
> mongo <hostname> 27017
#初始化rs
> rs.initiate({
_id: "rs0",
members: [
{
_id: 0,
host: "<hostname>:27017"
}
]
}
})
#查看rs的狀態(tài)
>rs.status()
此時,我們可以看見莫鸭,rs中已經(jīng)有一臺自己的服務器了
接著我們來添加兩個從服務器
rs.add('<hostname>:27018')
rs.add('<hostname>:27019')
至此闹丐,我們已經(jīng)添加成功了,成功組成了一個主復制集被因,兩個從復制集的操作卿拴,復制集的主從是有服務器自動推選出來的,如果主服務器DOWN掉梨与,馬上其他從服務器替換為主服務器巍棱。
仲裁者
副本集要求參與選舉投票(vote)的節(jié)點數(shù)為奇數(shù),當我們實際環(huán)境中因為機器等原因限制只有兩個(或偶數(shù))的節(jié)點蛋欣,這時為了實現(xiàn) Automatic Failover引入另一類節(jié)點:仲裁者(arbiter)航徙,仲裁者只參與投票不擁有實際的數(shù)據(jù),并且不提供任何服務陷虎,因此它對物理資源要求不嚴格到踏。
rs.addArb("192.168.158.132:27017")
遇到的問題
- 權限問題
當使用非root用戶時,一定要注意權限問題尚猿,否則很多命令都會出錯窝稿,像 mongod 等 - ip地址問題
一定要注意 Ip地址問題,你在rs.conf()中做的修改會影響到整個應用凿掂,如果你在本機上使用了127.0.0.1 (當然伴榔,他不會讓你這么干),那么當你的mongo 服務和應用服務不在同一個服務器庄萎,就對導致報錯踪少。碰到一個奇葩問題是,當在服務器上使用 rs.initiate() 時糠涛,不加參數(shù)援奢,他默認就會把當前庫加到配置里,但是服務器的name會變成坑爹的計算機名稱(hostname):端口忍捡,導致應用無法識別集漾。所以最好是使用 本機ip地址切黔,如192.168.1.3,而不要使用local localhost 127...* 等
其他要注意的
- 所有的Secondary都宕機、或則副本集中只剩下一個節(jié)點具篇,則該節(jié)點只能為Secondary節(jié)點纬霞,官方推薦的最小的副本集也應該具備一個primary節(jié)點和兩個secondary節(jié)點。兩個節(jié)點的副本集不具備真正的故障轉移能力驱显。
- 投票節(jié)點最多只能有7個
要注意的是险领,這個命令只允許在本地,或是一個經(jīng)過認證的客戶端秒紧。
引用
http://www.cnblogs.com/zhoujinyi/p/3554010.html
http://blog.csdn.net/yabingshi_tech/article/details/47044711
http://www.runoob.com/mongodb/mongodb-replication.html