MySQL binlog數據庫同步技術總結


下載網站: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 等都能輕松實現。

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

binlog是MySQL以二進制形式打印的日志,它默認不加密、不壓縮。每個正常的binlog文件頭部有4個字節的標記,值為0xfe 0x62 0x69 0x6e(magic數字標記是binlog文件)。從第4個字節之后是一個一個的event,log_event是binlog里的單位,即正常情況下binlog按照逐log_event的形式增長。除去頭部的標記,binlog就是一個log_event的序列。每個log_event都獨立單元,沒有互相引用的關系,它也有自己的二進制頭部,主要是記錄了時間戳、類型標記等描述信息。

Binlog模式分三種Row、Statement、Mixed

Row模式存儲的是數據修改后的結果,binlog中可以不記錄執行的sql語句的上下文相關的信息,僅僅只需要記錄那一條記錄被修改了,修改成什么樣了。對於update mytable set col1=’abc’ where col2=’c’在row模式下可能產生大量的數據,因為語句雖然是一條,但實際影響的數據記錄卻可能很多。而對於alter table、drop table、create table等信息在Row模式下則不會產生大量的log條目,因為它還是記錄的語句,而不是單行數據的變化情況。

Statemnet模式每一條會修改數據的sql都會記錄到 master的binlog中。slave在復制的時候sql進程會解析成和原來master端執行過的相同的sql來再次執行。由於他是記錄的執行語句,所以,為了讓這些語句在slave端也能正確執行,那么他還必須記錄每條語句在執行的時候的一些相關信息,也就是上下文信息,以保證所有語句在slave端杯執行的時候能夠得到和在master端執行時候相同的結果。

Mixed模式則是前兩種的混合,MySQL會根據執行的每一條具體的sql語句來區分對待記錄的日志形式,也就是在Statement和Row之間選擇一種。選擇性的使用面向行數據變化的Row方式記錄,主要是面對一些未決語句(nondeterministic),考慮到安全問題,避免主從庫之間數據出現不一致,比如語句面向多行插入,其中又有auto-increment的字段,數據庫存儲引擎不同,可能帶來插入順序

mysql主從同步延遲原理

要了解MySQL數據庫主從同步延遲原理,我們先從MySQL的數據庫主從復制原理說起:

MySQL binlog數據庫同步技術總結

MySQL的主從復制都是單線程的操作,主庫對所有DDL和DML產生的日志寫進binlog,由於binlog是順序寫,所以效率很高。Slave的IO Thread線程從主庫中binlog中讀取取日志。Slave的SQLThread線程將主庫的DDL和DML操作事件在slave中重放。DML和DDL的IO操作是隨即的,不是順序的,成本高很多。由於SQL Thread也是單線程的,如果slave上的其他查詢產生lock爭用,又或者一個DML語句(大事務、大查詢)執行了幾分鍾,那么所有之后的DML會等待這個DML執行完才會繼續執行,這就導致了延時。

主從同步延遲的引發原因

    1、Master負載

    2、Slave負載

    3、網絡延遲

    4、機器配置(cpu、內存、硬盤)

總之,當主庫的並發較高時,產生的DML數量超過slave的SQL Thread所能處理的速度,或者當slave中有大型query語句產生了鎖等待那么延時就產生了。

同步延遲的解決方案

  • 最簡單的減少slave同步延時,盡量讓主庫的DDL快速執行。還有就是主庫是寫,對數據安全性較高,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之類的設置,而slave則不需要這么高的數據安全,完全可以講sync_binlog設置為0或者關閉binlog,innodb_flushlog也可以設置為0來提高sql的執行效率,從庫關閉binlog記錄。另外就是使用比主庫更好的硬件設備作為slave。
  • 在業務架構上將不同的業務分布到不同的物理數據庫上,同一個業務分庫架構,在業務層與數據庫之間增加分布式緩存以便減少主庫的壓力。
  • 在mysql 5.7版本后開始支持多線程並行復制技術enhanced multi-threaded slave(簡稱MTS)。

MySQL並行同步機制

並行同步在MySQL5.6就開始支持,只不過在5.6時是基於schema的,也就是基於庫的,相比於5.7的機制要遜色的多。MySQL 5.7才可稱為真正的並行復制,這其中最為主要的原因就是slave服務器的回放與主機是一致的。即master服務器上是怎么並行執行的slave上就怎樣進行並行回放。不再有庫的並行復制限制。

從MySQL官方來看,其並行復制的原本計划是支持表級的並行復制和行級的並行復制,行級的並行復制通過解析ROW格式的二進制日志的方式來完成。但是最終出現給小伙伴的確是在開發計划中稱為:MTS: Prepared transactions slave parallel applier。該並行復制的思想最早是由MariaDB的Kristain提出,並已在MariaDB 10中出現,相信很多選擇MariaDB的小伙伴最為看重的功能之一就是並行復制。

MySQL 5.7並行復制的思想簡單易懂,一言以蔽之:一個組提交的事務都是可以並行回放,因為這些事務都已進入到事務的prepare階段,則說明事務之間沒有任何沖突(否則就不可能提交)。為了兼容MySQL 5.6基於庫的並行復制,5.7引入了新的變量slave-parallel-type,其可以配置的值有:

• DATABASE:默認值,基於庫的並行復制方式

• LOGICAL_CLOCK:基於組提交的並行復制方式

MySQL在binlog中定義了兩個Logical_clock的變量:

• max_c ommitted_transaction:記錄上次組提交時的logical_clock,代表上述mysqlbinlog中的last_committed

• transaction_counter:記錄當前組提交中各事務的logcial_clock,代表上述mysqlbinlog中的sequence_number

通過工具檢查binlog文件,可以發現較之原來的二進制日志內容多了last_committed和sequence_number,last_committed表示事務提交的時候,上次事務提交的編號,如果事務具有相同的last_committed,表示這些事務都在一組內,可以進行並行的回放。例如上述last_committed為0的事務有6個,表示組提交時提交了6個事務,而這6個事務在從機是可以進行並行回放的。

提升同步的策略中,有很多實現,包括MySQL各版本的實現及MariaDB等分支的實現上,按按粒度區分的三個策略,粒度從粗到細是按庫、按表、按行,而MySQL5.7按照commit_id的策略適用范圍更廣,改進策略並發性更優。


免責聲明!

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



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