新聞中心
數(shù)據(jù)庫讀寫分離是為了提高數(shù)據(jù)庫服務器的處理能力和穩(wěn)定性而做的一種優(yōu)化方案。按照讀寫負載不同,將數(shù)據(jù)庫分割成讀庫和寫庫,實現(xiàn)讀寫分離,減輕單一數(shù)據(jù)庫服務器的負荷,提升數(shù)據(jù)庫系統(tǒng)的整體性能和穩(wěn)定性。本文將介紹數(shù)據(jù)庫讀寫分離的通信方式。

1. 主從復制方式
主從復制是數(shù)據(jù)庫讀寫分離的一種常見實現(xiàn)方式。它通過一個主數(shù)據(jù)庫將訪問前來的寫請求轉發(fā)到一個或多個從副本,之后再進行讀操作。寫請求僅在主數(shù)據(jù)庫上執(zhí)行,而讀請求則在從副本上執(zhí)行。主從復制方式的特點如下:
優(yōu)點:
1. 通過主從復制,從服務被允許快速的復制主服務上的數(shù)據(jù),獲得部分信息的讀服務,數(shù)據(jù)時間的延遲較低,常??梢赃_到毫秒級別。
2. 寫入操作在主服務上進行,主服務負責保證數(shù)據(jù)的一致性,以及一定的寫入性能。
缺點:
1. 主從復制依賴于主從之間的數(shù)據(jù)同步,因此寫入在主切換時可能會出現(xiàn)數(shù)據(jù)丟失或不一致的情況。
2. 從數(shù)據(jù)庫只能用于讀操作,不能進行寫操作,因此需要在主副本之間進行一些數(shù)據(jù)同步措施。
2. 分區(qū)方式
分區(qū)方式是另一種數(shù)據(jù)庫讀寫分離的實現(xiàn)方式,它將數(shù)據(jù)按照某種規(guī)則分成多個分區(qū),寫操作只在一個分區(qū)中進行,讀操作可以在所有分區(qū)中執(zhí)行。每個分區(qū)擁有一個主節(jié)點,該主節(jié)點負責接收寫操作并將寫操作應用到存儲區(qū)域。每個分區(qū)還擁有多個從節(jié)點,它們負責處理讀請求。分區(qū)方式的特點如下:
優(yōu)點:
1. 分區(qū)方式能夠支持多個有獨立識別性的節(jié)點,使得整個數(shù)據(jù)庫系統(tǒng)能夠在水平方向上擴容。
2. 下游應用自行根據(jù)需求選擇讀取哪個分區(qū),可以提高查詢效率。
缺點:
1. 分區(qū)方式的實現(xiàn)較為復雜,需要對數(shù)據(jù)庫進行大規(guī)模的重構和改造。
2. 分區(qū)方式中,每個節(jié)點對性能的影響非常大,對節(jié)點的和數(shù)據(jù)的分配要求非常嚴格。
3. 反向代理方式
反向代理方式是通過在代理層增加一個反向代理服務器,實現(xiàn)數(shù)據(jù)庫讀寫分離。反向代理服務器攔截所有的數(shù)據(jù)庫請求,并根據(jù)負載情況將讀請求轉發(fā)至一個或多個從服務器,寫請求則由反向代理服務器轉發(fā)至主服務器。反向代理方式的特點如下:
優(yōu)點:
1. 反向代理方式的實現(xiàn)相對較簡單,只需要在服務端增加一個反向代理服務器即可。
2. 反向代理服務器能夠根據(jù)負載情況動態(tài)的調整從服務器的數(shù)量,對性能的優(yōu)化更加靈活。
缺點:
1. 反向代理方式依賴于反向代理服務器的正常工作,如果反向代理出現(xiàn)問題,則整個數(shù)據(jù)庫服務都將無法運轉。
2. 反向代理服務器處理請求的開銷非常大,如果請求量過大,則可能影響整體性能。
:
在實際的數(shù)據(jù)庫系統(tǒng)中,因為應用的業(yè)務邏輯以及讀寫的負載均衡都存在較大的波動,因此需要根據(jù)具體情況選擇最適合的讀寫分離方案。上述幾種方式各有優(yōu)缺點,我們可以根據(jù)具體場景進行選擇和調整。最重要的是要保持數(shù)據(jù)庫的穩(wěn)定性和高效性,以維護應用的正常運行。
相關問題拓展閱讀:
- 如何在應用層通過spring特性解決數(shù)據(jù)庫讀寫分離
如何在應用層通過spring特性解決數(shù)據(jù)庫讀寫分離
兩種方案
方案1:當只有讀操作的時候,直接操作讀庫(從庫);
當在寫事務(即寫主庫)中讀時,也是讀主庫(即參與到主庫操作),這樣的優(yōu)勢是可以防止寫完后可能讀不到剛才寫的數(shù)據(jù);
此方案其實是使用事務傳播行為為:SUPPORTS解決的。
方案2:當只有讀操作的時候,直接操作讀庫(從庫);
當在寫事務(即寫主庫)中讀時,強制走從庫,即先暫停寫事務,開啟讀(讀從庫),然后恢復寫事務。
此方案其實是使用事務傳播行為為:NOT_SUPPORTS解決的。
核心組件
cn.javass.common.datasource.ReadWriteDataSource:讀寫分離的動態(tài)數(shù)據(jù)源,類似于AbstractRoutingDataSource,具體參考javadoc;
cn.javass.common.datasource.ReadWriteDataSourceDecision:讀寫庫選擇的決策者,具體參考javadoc;
cn.javass.common.datasource.ReadWriteDataSourceProcessor:此類實現(xiàn)了兩個職責(為了減少類的數(shù)量將兩個功能合并到一起了):讀/寫動態(tài)數(shù)據(jù)庫選擇處理器、通過AOP切面實現(xiàn)讀/寫選擇,具體參考javadoc。
具體配置
1、數(shù)據(jù)源配置
1.1、寫庫配置
Java代碼
1.2、讀庫配置
Java代碼
1.3、讀寫動態(tài)庫配置
通過writeDataSource指定寫庫,通過readDataSourceMap指定從庫列表,從庫列表默認通過順序輪詢來使用讀庫,具體參考javadoc;
Java代碼
2、XML事務屬性配置
所以讀方法必須是read-only(必須,以此來判斷是否是讀方法)。
Java代碼
3、事務管理器
事務管理器管理的是readWriteDataSource
Java代碼
4、讀/寫動態(tài)數(shù)據(jù)庫選擇處理器
根據(jù)之前的txAdvice配置的事務屬性決定是讀/寫,具體參考javadoc;
forceChoiceReadWhenWrite:用于確定在如果目前是寫(即開啟了事務),下一步如果是讀,是直接參與到寫庫進行讀,還是強制從讀庫讀,具體參考javadoc;
Java代碼
5、事務切面和讀/寫庫選擇切面
Java代碼
1、事務切面一般橫切業(yè)務邏輯層;
2、此處我們使用readWriteDataSourceTransactionProcessor的通過AOP切面實現(xiàn)讀/寫庫選擇功能,order=Integer.MIN_VALUE(即更高的優(yōu)先級),從而保證在操作事務之前已經(jīng)決定了使用讀/寫庫。
6、測試用例
只要配置好事務屬性(通過read-only=true指定讀方法)即可,其他選擇讀/寫庫的操作都交給readWriteDataSourceTransactionProcessor完成。
可以參考附件的:
cn.javass.readwrite.ReadWriteDestWithForceChoiceReadOnWriteFalse
cn.javass.readwrite.ReadWriteDestWithNoForceChoiceReadOnWriteTrue
可以下載附件的代碼進行測試,具體選擇主/從可以參考日志輸出。
關于數(shù)據(jù)庫讀寫分離怎么通信的介紹到此就結束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。
成都網(wǎng)站營銷推廣找創(chuàng)新互聯(lián),全國分站站群網(wǎng)站搭建更好做SEO營銷。
創(chuàng)新互聯(lián)(www.cdcxhl.com)四川成都IDC基礎服務商,價格厚道。提供成都服務器托管租用、綿陽服務器租用托管、重慶服務器托管租用、貴陽服務器機房服務器托管租用。
文章名稱:數(shù)據(jù)庫讀寫分離的通信方式簡介 (數(shù)據(jù)庫讀寫分離怎么通信)
當前URL:http://www.5511xx.com/article/dhjihhp.html


咨詢
建站咨詢
