mongoDB集群的搭建


Mongo有三種集群方式
1.Replica Set副本
2.Sharding分片
3.Master-slave主備

通常來說,我們用第1、2種較多,第3種官方並不推薦。下面,我們來講解下這三種集群方式的搭建方式。本文,假設讀者已經對Docker有所了解,我們整個過程使用Docker搭建Mongo的集群環境。

接下來哦我介紹的就是第1種方式——副本集

1.1     什么是復制?

復制提供了數據的冗余備份,並在多個服務器上存儲數據副本,提高了數據的可用性,並可以保證數據的安全性,復制還允許從硬件故障和服務中斷中恢復數據

1.保障數據的安全性

2.數據高可用性 (24*7)

3.災難恢復

4.無需停機維護(如備份,重建索引,壓縮)

5.分布式讀取數據

 

 

2.1     MongoDB復制原理

mongodb的復制至少需要兩個節點。其中一個是主節點,負責處理客戶端請求,其余的都是從節點,負責復制主節點上的數據。

mongodb各個節點常見的搭配方式為:一主一從、一主多從。

主節點記錄在其上的所有操作oplog,從節點定期輪詢主節點獲取這些操作,然后對自己的數據副本執行這些操作,從而保證從節點的數據與主節點一致。

 

 

3.1     MongoDB副本集特征
1.  N 個節點的集群
2. 任何節點可作為主節點
3. 所有寫入操作都在主節點上
4. 自動故障轉移
5. 自動恢復

 

4.1    副本集的配置(我用的cnetos7 兩台服務器)

 

1.創建數據庫目錄 mkdir mongo1 mongo2 

 

2.啟動服務器:

mongod --bind_ip 172.36.170.88 --port 8319 --dbpath ~/mongo1 --replSet rs1

注:這里的bind_ip我用的內網ip ,端口可以自己指定

mongod --bind_ip 172.36.170.67 --port 8320 --dbpath ~/mongo2 --replSet rs1

 

3.啟動客戶端

 

mongo --host 172.36.170.88 --port 8319 | mongo 172.36.170.88 :8319

第一個客戶端查看副本集狀態

rs.status()

第一個客戶端副本集初始化(哪個客戶端先去初始化,哪個就是主機)

rs.initiate()

第一個客戶端副本集添加成員

rs.add('172.36.170.67:8320')

 

啟動第二個客戶端 (發現是從機)

mongo --host 172.36.170.67 --port 8320

 

如果從機想要讀取主機數據的話每次都需要執行

rs.slaveOK()

然后就是主機添加數據 從機就可以去讀了,從機進行寫的操作會失敗

 

5.1  演示主機宕機

使用Ctrl+C或者kill關閉主機服務端,然后在重啟服務器的時候發現主機已經變成從機

發現顯示為rs1:SECONDARY> 從機自動變成master

 

6.1 后台啟動服務器(在后台啟動,下次直接啟動客戶端就可以了,啟動之后用exit退出,否則會被系統認為非法退出,無法在后台啟動)

nohup mongod --bind_ip 172.36.170.88 --port 8319 --dbpath ~/mongo1 --replSet rs1 > /dev/null &

nohup mongod --bind_ip 172.36.170.67 --port 8320 --dbpath ~/mongo2 --replSet rs1 > /dev/null &

 

nohup----不斷的運行命令

& ---- 在后台運行

/dev/null  : 在類Unix系統中,/dev/null,或稱空設備,是一個特殊的設備文件,它丟棄一切寫入其中的數據(但報告寫入操作成功),讀取它則會立即得到一個EOF。

在程序員行話,尤其是Unix行話中,/dev/null 被稱為位桶(bit bucket)或者黑洞(black hole)。空設備通常被用於丟棄不需要的輸出流,或作為用於輸入流的空文件。這些操作通常由重定向完成。

 

7.1 連接可視化工具

如果你的端口是27017,在你的服務器中沒有開通這個端口,是連接不上的,所以你要去 vi /etc/mongo.config中修改端口,修改成開通的

而且還要開啟防火牆和開通特定端口,以下是一個博客 借鑒一下:

https://blog.csdn.net/zll_0405/article/details/81208606 (感謝博主的整理)

 

8.1 大批量的建集合和數據 可以在數據庫 右擊 --open shell

command + Enter 執行
#創建10個集合后綴為0-9的數字
for (var i = 0; i < 10; i++) {
db.createCollection('favoriate_'+i)
}

#每個集合創建10個數據
for (var i = 0; i < 10; i++) {
db.favoriate_0.insert({user_id:i+'99dc2d2-1f8c-11e9-9e72-00163e02d3f3', phone:'1382189788'+i, media_id:'D2018050408335209'+i, index:i, play_time:'',
percentage:'', creat_time:'',})
}

#i個集合創建1個數據。#getCollection()--獲取非正常集合名稱
for (var i = 0; i < 10; i++) {
db.getCollection('favoriate_'+i).insert({user_id:i+'99dc2d2-1f8c-11e9-9e72-00163e02d3f3', phone:'1382189788'+i, media_id:'D2018050408335209'+i, index:i, play_time:'',
percentage:'', creat_time:'',})
}

#后綴為26個英文字母
for (var i = 0; i < 26; i++) {
db.createCollection('favoriate_'+String.fromCharCode((65 + i)));
}

for (var i = 0; i < 26; i++) {
db.getCollection('favoriate_'+String.fromCharCode((65 + i))).insert({user_id:String.fromCharCode((65 + i))+'99dc2d2-1f8c-11e9-9e72-00163e02d3f3',
phone:'1382189788'+i, media_id:'D2018050408335209'+i, index:i, play_time:'',
percentage:'', creat_time:'',})
}

#刪除所有符合條件的記錄
for (var i = 0; i < 26; i++) {
db.getCollection('favoriate_'+String.fromCharCode((65 + i))).remove({creat_time:''})
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM