一、讀寫分離的概念
讀寫分離,基本的原理是讓主數據庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從數據庫處理SELECT查詢操作。數據庫復制被用來把事務性操作導致的變更同步到集群中的從數據庫。
讀寫分離的目的是為了實現高並發場景下的請求分流,避免對數據庫的訪問過於集中,導致性能下降甚至是宕機。
二、主從復制介紹
在MongoDB的集群中,會有指定為master的主節點存在,該節點用於被客戶端進行數據的增刪改操作。同時集群中還會有被指定為slave的節點存在,即從節點,該節點主要接收來自於客戶端的讀,檢索操作,並不具備增刪改操作的功能。
在master節點處理完增刪改操作后,會實時同步數據到與其綁定的從節點上,實現主從復制至少要有兩個數據庫實例,並且每個從節點需要知道主節點的地址,如果是在linux中記得開通主從端口的防火牆。
主從復制的優勢在於比較靈活,適用於數據備份,故障后人工進行數據恢復,以及對讀數據的擴展等。
三、主從復制局限
(1)MongoDB目前建議使用副本集實現集群管理,不建議使用簡單的主從復制,副本集在本MongoDB系列博文中有介紹。
(2)主從復制在master宕機后,沒有自動選舉master機制,導致主節點服務一掛,便不能對外提供增刪改操作。
(3)所有增刪改操作都是針對主節點進行操作,可能導致主節點性能下降。
(4)從節點對主節點的數據都是全量拷貝,對主從節點的壓力都是不小的。
四、主從復制簡單配置及實現
設備有限,為方便簡單的實現,可在一台機器上模擬主節點和從節點。在C盤創建master目錄,在E盤創建slave目錄,master目錄作為主節點數據存放的目錄,slave目錄作為從節點數據存放的目錄。
注意:主節點和從節點要指定不同的端口。
啟動主節點:mongod --dbpath C:\master --port 666 --master
啟動從節點:mongod --dbpath E:\slave --port 888 --slave --source localhost:666
啟動成功后就可以連接主節點進行操作了,而對主節點的操作會同步到從節點,而對從節點進行插入操作時,會報not master的提示並拒絕寫入數據。
配置實現解釋
master:默認為false,若要設置當前節點為主節點,需要在服務端啟動添加--master
slave:默認為false,若要設置當前節點為從節點,需要在服務端啟動添加--slave
source:默認為空,用於從節點,指定從節點的復制來源,即主節點所在的地址,格式為:<host><:port>
only:默認為空,用於從節點,主動復制默認復制主節點上所有的數據庫,通過設置此項指定需要復制的數據庫名稱
slavedelay:設置從節點同步主節點的延遲時間,用於從節點設置,默認為0,單位秒。
autoresync:默認為false,用於從節點設置。是否自動重新同步。設置為true,如果落后主節點超過10秒,會強制從節點自動重新同步。如果oplogSize太小,此設置可能有問題。如果oplog大小不足以存儲主節點的變化狀態和從節點的狀態變化之間的差異,這種情況下強制重新同步是不必要的。當設置autoresync選項設置為false,10分鍾內從節點不會進行大於1次的自動重新同步。
什么是oplog?
主節點的操作會被記錄為oplog,存儲在系統數據庫local的集合oplog.$main中,這個集合中的每個文檔都代表主節點的一個操作(不包括查詢),從節點定期從主服務器獲取oplog數據,並在本機進行執行,oplog使用的是固定集合,隨着操作的逐漸增加,新的文檔會逐漸覆蓋舊的文檔。