mysql5.5中的半同步複製
先來看下MYSQL非同步複製的概念:
非同步複製:MySQL本身支援單向的、非同步的複製。非同步複製意味著在把資料從一臺機器拷貝到另一臺機器時有一個延時 – 最重要的是這意味著當應用系統的事務提交已經確認時資料並不能在同一時刻拷貝/應用到從機。通常這個延時是由網路頻寬、資源可用性和系統負載決定的。然而,使用正確的元件並且調優,複製能做到接近瞬時完成。
當主庫有更新的時候,主庫會把更新操作的SQL寫入二進位制日誌(Bin log),並維護一個二進位制日誌檔案的索引,以便於日誌檔案輪迴(Rotate)。在從庫啟動非同步複製的時候,從庫會開啟兩個I/O執行緒,其中一個執行緒連線主庫,要求主庫把二進位制日誌的變化部分傳給從庫,並把傳回的日誌寫入本地磁碟。另一個執行緒則負責讀取本地寫入的二進位制日誌,並在本地執行,以反映出這種變化。較老的版本在複製的時候只啟用一個I/O執行緒,實現這兩部分的功能。
同步複製:同步複製可以定義為資料在同一時刻被提交到一臺或多臺機器,通常這是通過眾所周知的“兩階段提交”做到的。雖然這確實給你在多系統中保持一致性,但也由於增加了額外的訊息交換而造成效能下降。
使用MyISAM或者InnoDB儲存引擎的MySQL本身並不支援同步複製,然而有些技術,例如分散式複製塊裝置(簡稱DRBD),可以在下層的檔案系統提供同步複製,允許第二個MySQL伺服器在主伺服器丟失的情況下接管(使用第二伺服器的複本)。要了解更多資訊,
MYSQL 5。5開始,支援半自動複製。之前版本的MySQL Replication都是非同步(asynchronous)的,主庫在執行完一些事務後,是不會管備庫的進度的。如果備庫不幸落後,而更不幸的是主庫此時又出現Crash(例如當機),這時備庫中的資料就是不完整的。簡而言之,在主庫發生故障的時候,我們無法使用備庫來繼續提供資料一致的服務了。
Semisynchronous Replication則一定程度上保證提交的事務已經傳給了至少一個備庫。
Semi synchronous中,僅僅保證事務的已經傳遞到備庫上,但是並不確保已經在備庫上執行完成了。
此外,還有一種情況會導致主備資料不一致。在某個session中,主庫上提交一個事務後,會等待事務傳遞給至少一個備庫,如果在這個等待過程中主庫Crash,那麼也可能備庫和主庫不一致,這是很致命的。(在主庫恢復後,可以通過引數Rpl_semi_sync_master_no_tx觀察)
如果主備網路故障或者備庫掛了,主庫在事務提交後等待10秒(rpl_semi_sync_master_timeout的預設值)後,就會繼續。這時,主庫就會變回原來的非同步狀態。
MySQL在載入並開啟Semi-sync外掛後,每一個事務需等待備庫接收日誌後才返回給客戶端。如果做的是小事務,兩臺主機的延遲又較小,則Semi-sync可以實現在效能很小損失的情況下的零資料丟失。
主機Crash時的處理
備庫Crash時,主庫會在某次等待超時後,關閉Semi-sync的特性,降級為普通的非同步複製,這種情況比較簡單。
主庫Crash後,那麼可能存在一些事務已經在主庫Commit,但是還沒有傳給任何備庫,我們姑且稱這類事務為”牆頭事務”。”牆頭事務”都是沒有返回給客戶端的,所以發起事務的客戶端並不知道這個事務是否已經完成。
這時,如果客戶端不做切換,只是等Crash的主庫恢復後,繼續在主庫進行操作,客戶端會發現前面的”牆頭事務”都已經完成,可以繼續進行後續的業務處理;另一種情況,如果客戶端Failover到備庫上,客戶端會發現前面的“牆頭事務”都沒有成功,則需要重新做這些事務,然後繼續進行後續的業務處理。
可以做多個備庫,任何一個備庫接收完成日誌後,主庫就可以返回給客戶端了。
網路傳輸在併發執行緒較多時,一次可能傳輸很多日誌,事務的平均延遲會降低。
“牆頭事務”在牆頭上的時候,是可以被讀取的,但是這些事務在上面Failover的場景下,是被認為沒有完成的。
預設情況下MySQL的複製是非同步的,Master上所有的更新操作寫入Binlog之後並不確保所有的更新都被複制到Slave之上。非同步操作雖然效率高,但是在Master/Slave出現問題的時候,存在很高資料不同步的風險,甚至可能丟失資料。
MySQL5.5引入半同步複製功能的目的是為了保證在master出問題的時候,至少有一臺Slave的資料是完整的。在超時的情況下也可以臨時轉入非同步複製,保障業務的正常使用,直到一臺salve追趕上之後,繼續切換到半同步模式。
Master:
INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;
SET GLOBAL rpl_semi_sync_master_enabled=1;
SET GLOBAL rpl_semi_sync_master_timeout=1000; (1s, default 10s)
Slave:
INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;
SET GLOBAL rpl_semi_sync_slave_enabled=1;
複製心跳(使用者檢測複製是否中斷)
MySQL5.5提供的新的配置master_heartbeat_period,能夠在複製停止工作和出現網路中斷的時候幫助我們迅速發現問題。
啟用方法:
STOP SLAVE;
CHANGE MASTER TO master_heartbeat_period= milliseconds;
START SLAVE;
Slave自動恢復同步
在MySQL5.5版本之前,MySQL Slave例項在異常終止服務之後,可能導致複製中斷,並且relay binlog可能損壞,在MySQL再次啟動之後並不能正常恢復複製。在MySQL5.5中這一問題得到了解決,MySQL可以自行丟棄順壞的而未處理的資料,重新從master上獲取源資料,進而回複復制。
跳過指定複製事件
在多Master或環形複製的情況下,處於複製鏈條中間的伺服器異常,可以通過
CHANGE MASTER TO MASTER_HOST=xxx IGNORE_SERVER_IDS=y
跳過出問題的MySQL例項。
自動轉換欄位型別
MySQL5.1在基於語句的複製下,支援部分的欄位轉換,但是行級的會報錯。MySQL5.5語句和行級複製都已支援。還可以通過 SLAVE_TYPE_CONVERSIONS 控制轉換的方向。
贈送:
- 為mysql的安裝提供前提環境和初始化安裝mysql
- 建立資料庫目錄
- # mkdir /mydata/data –pv
- 建立mysq使用者
- # useradd -r mysql
- 修改許可權
- # chown -R mysql.mysql /mydata/data/
- 使用mysql-5.5通用二進位制包安裝
- 解壓mysql軟體包
- # tar xf mysql-5.5.28-linux2.6-i686.tar.gz-C /usr/local/
- 建立連線,為了方便檢視mysql的版本等資訊
- # cd /usr/local/
- #ln –sv mysql-5.5.28-linux2.6-i686.tar.gzmysql
- 修改屬主屬組
- # cd mysql
- # chown -R root.mysql ./*
- 初始化資料庫
- # scripts/mysql_install_db –user=mysql –datadir=/mydata/data/
- 提供配置檔案
- # cp support-files/my-large.cnf /etc/my.cnf
- 提供服務指令碼
- # cp support-files/mysql.server/etc/rc.d/init.d/mysqld
- 新增至服務列表
- # chkconfig –add mysqld
- # chkconfig –list mysqld
- # chkconfig mysqld on
- 編輯配置檔案,提供資料目錄
- # vim /etc/my.cnf
- # The MySQL server 修改mysqld伺服器端的內容
- log-bin=master-bin 主伺服器二進位制日誌檔案字首名
- log-bin-index=master-bin.index 索引檔案
- innodb_file_per_table= 1 開啟innodb的一表一個檔案的設定
- server-id = 1 必須是唯一的
- datadir =/mydata/data 資料目錄路徑
- 啟動mysql服務
- # servicemysqld start
- 為了便於下面的測試,設定環境變數
- # vim/etc/profile.d/mysql.sh
- export PATH=$PATH:/usr/local/mysql/bin
- 執行環境變數指令碼,使其立即生效
- # . /etc/profile.d/mysql.sh
- 建立使用者賬戶
- mysql> grant replication slave on *.* to `chris`@`172.16.%.%` identified by `work`;
- 重新整理資料使其生效
- mysql> flush privileges;
- 建立mysql資料庫目錄
- # mkdir /mydata/data –pv
- 建立mysql使用者
- # useradd -r mysql
- 修改資料目錄許可權
- # chown -R mysql.mysql /mydata/data/
- 使用mysql-5.5通用二進位制包安裝mysql
- 解壓mysql軟體包
- # tar xf mysql-5.5.28-linux2.6-i686.tar.gz-C /usr/local/
- 建立連線,便於檢視mysql的版本等資訊
- # cd /usr/local/
- # ln –sv mysql-5.5.28-linux2.6-i686.tar.gzmysql
- 修改mysql屬主屬組
- # cd mysql
- # chown -R root.mysql ./*
- 初始化mysql資料庫
- # scripts/mysql_install_db –user=mysql–datadir=/mydata/data/
- 提供mysql配置檔案
- # cp support-files/my-large.cnf /etc/my.cnf
- 提供服務指令碼
- # cp support-files/mysql.server /etc/init.d/mysqld
- 新增至服務列表
- # chkconfig –add mysqld
- 編輯配置檔案
- # vim /etc/my.cnf
- # The MySQL server
- #log-bin=mysql-bin 禁用二進位制日誌,從伺服器不需要二進位制日誌檔案
- datadir = /mydata/data mysql的資料目錄
- relay-log = relay-log 設定中繼日誌
- relay-log-index = relay-log.index 中繼日誌索引
- innodb_file_per_table = 1
- server-id = 2 id不要和主伺服器的一樣
- 設定環境變數
- # vim/etc/profile.d/mysql.sh
- export PATH=$PATH:/usr/local/mysql/bin
- 執行此指令碼(匯出環境變數)
- # . /etc/profile.d/mysql.sh
- 啟動服務
- # service mysqld start
- mysql> show master status; #在Master上執行檢視二進位制檔案
- 在從伺服器上開啟複製功能
- change master to master_host=`172.16.7.1`,master_user=`chris`,master_password=`work`,master_log_file=`master-bin.000001`,master_log_pos=407;
- 開啟複製功能
- mysql>start slave;
- 安裝外掛:mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME `semisync_master.so`;
- 啟動模組:mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
- 設定超時時間:mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;
1
2
3
4
|
slave:
安裝外掛:msyql> `semisync_slave.so` ;
啟動模組:mysql> 1 ;
重啟程式使其模組生效:mysql>
|
- 在Master和Slave的my.cnf中編輯:
- # On Master
- [mysqld]
- rpl_semi_sync_master_enabled=1
- rpl_semi_sync_master_timeout=1000 #此單位是毫秒
- # On Slave
- [mysqld]
- rpl_semi_sync_slave_enabled=1
- master:
- mysql> CREATE DATABASE asyncdb;
- master> SHOW STATUS LIKE `Rpl_semi_sync_master_yes_tx`;
- slave> SHOW DATABASES;
- 其測試過程如下
- # 主伺服器上
- [mysqld]
- server-id = 1
- log-bin = mysql-bin
- relay-log = relay-mysql
- relay-log-index = relay-mysql.index
- auto-increment-increment = 2 #每次跳兩個數。
- auto-increment-offset = 1 #從1開始。
- [mysqld]
- server-id = 2
- log-bin = mysql-bin
- relay-log = relay-mysql
- relay-log-index = relay-mysql.index
- auto-increment-increment = 2
- auto-increment-offset = 2
- master:檢視日誌檔案資訊
- mysql> show master status;
- +——————+———-+————–+——————+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +——————+———-+————–+——————+
- | mysql-bin.000001 | 107 | | |
- +——————+———-+————–+——————+
- Slave:檢視伺服器日誌檔案資訊
- mysql> show master status;
- +——————+———-+————–+——————+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +——————+———-+————–+——————+
- | mysql-bin.000001 | 107 | | |
- +——————+———-+————–+——————+
- 1 row in set (0.00 sec)
1
2
3
|
master:
mysql> `chrislee` @ `172.16.%.%` IDENTIFIED `work` ;
mysql>
|
- slave:
- mysql> GRANT REPLICATION SLAVE ON *.* TO `chrisli`@`172.16.%.%` IDENTIFIED BY `work`;
- mysql> flush privileges
- server1
- mysql> CHANGE MASTER TO MASTER_HOST=`172.16.7.2`,MASTER_USER=`chrisli`,MASTER_PASSWORD=`work`,MASTER_LOG_FILE=`mysql-bin.000001`,MASTER_LOG_POS=344;
- server2:
- mysql> CHANGE MASTER TO MASTER_HOST=`172.16.7.1`,MASTER_USER=`chrislee`,MASTER_PASSWORD=`work`,MASTER_LOG_FILE=`mysql-bin.000001`,MASTER_LOG_POS=345;
相關文章
- mysql5.5半同步複製探究MySql
- MySQL5.5半同步複製實現原理MySql
- 配置mysql5.5主從複製、半同步複製、主主複製MySql
- MySQL的非同步複製和半同步複製MySql非同步
- MySQL的半同步複製MySql
- MySQL 半同步複製MySql
- MySQL半同步複製MySql
- 【MySQL】半同步與增強半同步複製MySql
- MySQL 8 複製(二)——半同步複製MySql
- mysql 5.7半同步複製MySql
- MySQL主從複製之半同步複製MySql
- mysql半同步複製的設定MySql
- Mysql5.7半同步複製MySql
- MySQL主從複製、半同步複製和主主複製MySql
- MySQL的主從複製、半同步複製、主主複製詳解MySql
- MySQL5.7主從複製-半同步複製搭建MySql
- MySQL主從複製、半同步複製和主主複製概述MySql
- 主從複製、雙主複製及半同步複製、以及基於SSL的複製
- MySQL 半同步複製+MMM架構MySql架構
- MySQL半同步複製--after_rollbackMySql
- mysql線上建立半同步複製的從庫MySql
- 半同步複製報錯mysql8.0.25MySql
- MySQL半同步複製--after_commitMySqlMIT
- mysql5.5.9半同步複製功能部署MySql
- MySQL 5.5半同步複製的配置與監控MySql
- MySQL中的半同步複製(r11筆記第65天)MySql筆記
- Mariadb之半同步複製叢集配置
- MySQL增強(Loss-less)半同步複製MySql
- MySQL5.7半同步複製報錯案例分析MySql
- MySQL 5.5 Semi-sync 半同步複製測試MySql
- 多從庫時半同步複製不工作的BUG分析
- #MySQL# mysql5.7新特性之半同步複製MySql
- MySQL(二):主從複製結構、半同步複製、雙主複製結構、利用SSL實現安全的MySQL主從複製MySql
- MySQL 5.5 主從複製非同步、半同步以及注意事項詳解MySql非同步
- MySQL 5.7半同步複製after sync和after commit詳解MySqlMIT
- Mysql半同步複製模式說明及配置示例 - 運維小結MySql模式運維
- MySQL 8 複製(一)——非同步複製MySql非同步
- MySQL半同步複製資料最終一致性驗證MySql