復制(副本集)
什么是復制
- 復制提供了數據的冗余備份,並在多個服務器上存儲數據副本,提高了數據的可用性,並可以保證數據的安全性
- 復制還允許從硬件故障和服務中斷中恢復數據
為什么要復制
- 數據備份
- 數據災難恢復
- 讀寫分離
- 高(24* 7)數據可用性
- 無宕機維護
- 副本集對應用程序是透明
復制的工作原理
- 復制至少需要兩個節點A、B...
- A是主節點,負責處理客戶端請求
- 其余的都是從節點,負責復制主節點上的數據
- 節點常見的搭配方式為:一主一從、一主多從
- 主節點記錄在其上的所有操作,從節點定期輪詢主節點獲取這些操作,然后對自己的數據副本執行這些操作,從而保證從節點的數據與主節點一致
- 主節點與從節點進行數據交互保障數據的一致性
復制的特點
- N 個節點的集群
- 任何節點可作為主節點
- 所有寫入操作都在主節點上
- 自動故障轉移
- 自動恢復
設置復制節點
- 接下來的操作需要打開多個終端窗口,而且可能會連接多台ubuntu主機,會顯得有些亂,建議在xshell中實現
- step1:創建數據庫目錄t1、t2
- 在Desktop目錄下演示,其它目錄也可以,注意權限即可
mkdir t1
mkdir t2
- step2:使用如下格式啟動mongod,注意replSet的名稱是一致的
mongod --bind_ip 192.168.196.128 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0
mongod --bind_ip 192.168.196.128 --port 27018 --dbpath ~/Desktop/t2 --replSet rs0
- step3:連接主服務器,此處設置192.168.196.128:27017為主服務器
mongo --host 192.168.196.128 --port 27017
- step4:初始化
rs.initiate()
- 初始化完成后,提示符如下圖:
- step5:查看當前狀態
rs.status()
- 當前狀態如下圖:
- step6:添加復本集
rs.add('192.168.196.128:27018')
- step7:復本集添加成功后,當前狀態如下圖:
- step8:連接第二個mongo服務
mongo --host 192.168.196.128 --port 27018
- step9:向主服務器中插入數據
use test1
for(i=0;i<10;i++){db.t1.insert({_id:i})} db.t1.find()
- step10:在從服務器中插查詢
- 說明:如果在從服務器上進行讀操作,需要設置rs.slaveOk()
rs.slaveOk()
db.t1.find()
其它說明
- 刪除從節點
rs.remove('192.168.196.128:27018')
- 關閉主服務器后,再重新啟動,會發現原來的從服務器變為了從服務器,新啟動的服務器(原來的從服務器)變為了從服務器
備份
- 語法
mongodump -h dbhost -d dbname -o dbdirectory
- -h:服務器地址,也可以指定端口號
- -d:需要備份的數據庫名稱
- -o:備份的數據存放位置,此目錄中存放着備份出來的數據
- 例1
sudo mkdir test1bak
sudo mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak
恢復
- 語法
mongorestore -h dbhost -d dbname --dir dbdirectory
- -h:服務器地址
- -d:需要恢復的數據庫實例
- --dir:備份數據所在位置
- 例2
mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1