高並發架構系列:數據庫主從同步的3種一致性方案實現,及優劣比較


下載網站:www.SyncNavigator.CN 
 客服QQ1793040
----------------------------------------------------------


關於HKROnline SyncNavigator 注冊機價格的問題

 

 

HKROnline SyncNavigator 8.4.1 非破解版 注冊機 授權激活教程
 

 

 

 

最近一直在研究數據庫同步的問題,在網上查了很多資料,也請教了很多人,找到了一種通過快照復制的方法。研究了一番后發現之前就是用的這個方法,效果不是很好,果斷放棄。經過了一番尋覓和他人指點,最后從一位熱心網友那里得知一款很好用的軟件—— SyncNavigator。

 

 

好東西就要拿出來跟大家分享,所以今天向大家介紹一下這款軟件,及其一些使用方法。下面先看看它有什么強大的功能吧!

 

SyncNavigator的基本功能:

 

自動同步數據/定時同步數據
無論是實時同步/24小時不間斷同步,還是根據計划任務(每小時/每日/每周/等)定時自動同步都能完全勝任。

完整支持 Microsoft SQL Server
完整支持 Microsoft SQL Server 2000 2005 2008 數據庫類型。並能在不同數據庫版本之間相互同步數據。

支持 MySQL 4.1 以上版本
支持 MySQL 4.1 5.0 5.1 5.4 5.5。並能在不同數據庫版本之間相互同步數據。

無人值守和故障自動恢復
當數據庫故障或網絡故障以后,無需人工干預(或操作)自動恢復同步並確保數據完全准確,可靠。

同構數據庫同步/異構數據庫同步
SQL Server to SQL Server, MySQL to MySQL, SQL Server to MySQL 等都能輕松實現。

斷點續傳和增量同步
當同步完成(或中斷)后,再次同步時能繼續上一次的位置增量同步,避免每次都需要從頭開始的問題。

在高並發場景下,數據主從同步是必然的方式,除了數據庫主從同步外,還會涉及到分布式環境下的數據同步(文末有介紹~)。

今天分享數據庫主從同步解決方案。

數據主從同步的由來

互聯網的很多業務,特別是在高並發的場景下,基本都是讀遠遠大於寫,如果數據庫讀和寫的壓力都同在一台主機上,這顯然不太合理。

於是,把一台數據庫主機分為單獨的一台寫主庫(主要負責寫操作),而把讀的數據庫壓力分配給讀的從庫,而且讀從庫可以變為多台,這就是讀寫分離的典型場景如下:

 

為了進一步的降低數據庫端的壓力(高並發的瓶頸),這個時候也會在業務層部署分布式緩存集群(redis、memcached)等,把讀的壓力轉移給應用服務器端,其實與數據主從的設計是遵循同一個原則,降低后端數據庫的壓力。

問題:

讀寫分離提高了資源的利用效率的同時也引出了一個問題,就是由於延時(網絡傳輸,操作)而引起的數據庫主從不一致的問題,以下會詳細談相關的數據一致性解決方案。

 

數據同步一致性解決方案

1.半同步復制

辦法就是等主從同步完成之后,等主庫上的寫請求再返回,這就是常說的“半同步復制”。

實現方案

mysql的半同步復制方案,下面我以mysql為例介紹。

 

MySQL半同步復制

MySQL的Replication默認是一個異步復制的過程,從MySQL5.5開始,MySQL以插件的形式支持半同步復制,我先談下異步復制,這樣可以更好的理解半同步復制。

1)異步復制

MySQL默認的復制是異步的,主庫在執行完客戶端提交的事務后會立即將結果返給給客戶端,並不關心從庫是否已經接收並處理,這樣就會有一個問題,主如果crash掉了,此時主上已經提交的事務可能並沒有傳到從庫上。

2)半同步復制

介於異步復制和全同步復制之間,主庫在執行完客戶端提交的事務后不是立刻返回給客戶端,而是等待至少一個從庫接收到並寫到relay log中才返回給客戶端。相對於異步復制,半同步復制提高了數據的安全性,同時它也造成了一定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。所以,半同步復制最好在低延時的網絡中使用。

 

半同步復制原理:

  • 事務在主庫寫完binlog后需要從庫返回一個已接受,才放回給客戶端
  • mysql5.5版本以后,以插件的形式存在,需要單獨安裝
  • 確保事務提交后binlog至少傳輸到一個從庫
  • 不保證從庫應用完成這個事務的binlog
  • 性能有一定的降低
  • 網絡異常或從庫宕機,卡主庫,直到超時或從庫恢復

該方案優點:

利用數據庫原生功能,比較簡單

該方案缺點:

主庫的寫請求時延會增長,吞吐量會降低

2.數據庫中間件

 

流程:

1)所有的讀寫都走數據庫中間件,通常情況下,寫請求路由到主庫,讀請求路由到從庫

2)記錄所有路由到寫庫的key,在主從同步時間窗口內(假設是500ms),如果有讀請求訪問中間件,此時有可能從庫還是舊數據,就把這個key上的讀請求路由到主庫。

3)在主從同步時間過完后,對應key的讀請求繼續路由到從庫。

相關的中間件有:

1)canal:是阿里巴巴旗下的一款開源項目,純Java開發,基於數據庫增量日志解析,提供增量數據訂閱&消費,目前主要支持了MySQL。

2)otter:也是阿里開源的一個分布式數據庫同步系統,尤其是在跨機房數據庫同步方面,有很強大的功能。它是基於數據庫增量日志解析,實時將數據同步到本機房或跨機房的mysql/oracle數據庫。

兩者的區別在於:

otter目前嵌入式依賴canal,部署為同一個jvm,目前設計為不產生Relay Log。

otter目前允許自定義同步邏輯,解決各類需求。

該方案優點

能保證絕對一致

該方案缺點:

數據庫中間件的成本較高

 

3.緩存記錄寫key法

 

寫流程:

1)如果key要發生寫操作,記錄在cache里,並設置“經驗主從同步時間”的cache超時時間,例如500ms

2)然后修改主數據庫

讀流程:

1)先到緩存里查看,對應key有沒有相關數據

2)有相關數據,說明緩存命中,這個key剛發生過寫操作,此時需要將請求路由到主庫讀最新的數據。

3)如果緩存沒有命中,說明這個key上近期沒有發生過寫操作,此時將請求路由到從庫,繼續讀寫分離。

該方案優點:

相對數據庫中間件,成本較低

該方案缺點:

為了保證“一致性”,引入了一個cache組件,並且讀寫數據庫時都多了緩存操作。

以上就是數據庫主從同步一致性方案詳解,如果有興趣了解更加深入的分布式大數據分布式文件系統和分布式數據庫的一致性,可以到優知學院官網查看:分布式數據庫數據一致性的原理、與技術實現方案(文章)~

更多利用分布式緩存、異步消息等方式解決高並發場景,具體的內容如下:


免責聲明!

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



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