亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 課堂 > 基礎知識 > 正文

主從復制延遲原因分析

2024-09-12 20:30:11
字體:
來源:轉載
供稿:網友
  寫在前面:
 
  之前在維護線上主從復制架構的時候,遇到了一些主從延遲問題,筆者呢,也是比較好學的,哈哈!所以,查閱了諸多資料,然后去其糟粕,根據自己的理解和查閱的資料整理成了本文,在此申明,本文內容是筆者自己的理解,不代表權威性,僅供各位同行做個參考,自己呢,也做個學習記錄。本著實事求是的原則,對于網上的諸多資料,筆者自己也只是信5分,懷疑5分,就算是官方的資料,有的也有bug不是,只有自己動手實踐過了,才能相信,才有發言權,其他的,一切都是虛的!
 
  MySQL主從復制過程:
 
  1)主庫 Binlog Dump線程在binlog有變化時,主動發送最新的binlog到從庫。
 
  2)從庫 I/O線程被動接收主庫傳來的binlog之后,記錄到從庫的relay log中,當沒有數據傳入的時候則會等待。與此同時SQL線程重放 relay log。
 
  3)當從庫長時間未收到主庫傳來的數據,并且等待時間超過了slave_net_timeout定義的時間(默認3600秒)后,Slave_IO_State的狀態將會置為No。在此之后,每隔MASTER_CONNECT_RETRY [Connect_Retry: 30]定義的時間(默認60秒)將會嘗試重新連接,直到連接成功或超過重試次數MASTER_RETRY_COUNT [Master_Retry_Count: 6666](默認86400次)。
 
  slave_net_timeout可以在配置文件中修改或set variable在線設置
 
  而 MASTER_CONNECT_RETRY、MASTER_RETRY_COUNT 需要在CHANGE MASTER TO建立復制關系時提前指定
 
  在線變更 slave_net_timeout:
 
  SHOW VARIABLES LIKE 'slave_net_timeout'
 
  Variable_name          `Value`
 
  slave_net_timeout      3600
 
 
  SET GLOBAL slave_net_timeout=1800
 
  修改MASTER_CONNECT_RETRY=30,MASTER_RETRY_COUNT值:
 
  mysql> change master to MASTER_CONNECT_RETRY=30,MASTER_RETRY_COUNT=6666;
 
  ERROR 1198 (HY000): This operation cannot be performed with a running slave; run STOP SLAVE first
 
  mysql> stop slave;
 
  Query OK, 0 rows affected (0.01 sec)
 
  mysql> change master to MASTER_CONNECT_RETRY=30,MASTER_RETRY_COUNT=6666;
 
  Query OK, 0 rows affected (0.01 sec)
 
  mysql> start slave;
 
  Query OK, 0 rows affected (0.02 sec)
 
  MySQL主從復制延遲是怎樣形成的:
 
  1、主庫的worker線程在寫binlog的時候是并發工作的(并行寫入),而主庫的dump線程和從庫的IO線程都是單線程推拉binlog,特別是SQL線程是拿著relay log中的event逐一單線程回放的(5.6版本開啟slave_parallel_workers支持特定情況下的并行復制,5.7版本之后全面支持并行復制后在復制層面已極大改善了延遲問題)。因此即使不考慮網絡延遲,主流MySQL版本在高并發的情況下,消費很可能趕不上生產,采用異步復制的從庫很有可能跟不上主庫的進度。
 
 
  2、在復制期間,無論是主庫或從庫負載高(特別是從庫落盤壓力大,關系到sync_binlog、innodb_flush_log_at_trx_commit的設置)或者是網絡傳輸慢(特別是跨機房的同步)等情況發生時,都會產生主從延遲,并且是不可避免的。如果要實現強一致性,可采用Semi-sync,但采用該plugin也無法保證持續強一致性(rpl_semi_sync_master_timeout會引起復制模式的降級)
 
  根據MySQL主從復制延遲的形成原因,以下情況可能導致MySQL主從復制延遲:
 
  1)MASTER高并發,形成大量事務
 
  2)網絡狀況差
 
  3)從庫的硬件配置沒有主庫的好
 
  4)本來就是異步復制
 
  關于落盤時的部分參數解釋:
 
  sync_binlog:
 
          MySQL官方文檔參考:https://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html
 
  解釋:
 
          Controls how often the MySQL server synchronizes the binary log to disk
 
   控制MySQL將二進制日志(binary log)同步到磁盤的頻率
 
  sync_binlog=0:
 
      Disables synchronization of the binary log to disk by the MySQL server. Instead, the MySQL server relies on the operating system to flush the binary log to disk from time to time as it does for any other file. This setting provides the best performance, but in the event of a power failure or operating system crash, it is possible that the server has committed transactions that have not been synchronized to the binary log.
 
  sync_binlog=1:
 
      Enables synchronization of the binary log to disk before transactions are committed. This is the safest setting but can have a negative impact on performance due to the increased number of disk writes. In the event of a power failure or operating system crash, transactions that are missing from the binary log are only in a prepared state. This permits the automatic recovery routine to roll back the transactions, which guarantees that no transaction is lost from the binary log.
 
  sync_binlog=N:
 
       where N is a value other than 0 or 1: The binary log is synchronized to disk after N binary log commit groups have been collected. In the event of a power failure or operating system crash, it is possible that the server has committed transactions that have not been flushed to the binary log. This setting can have a negative impact on performance due to the increased number of disk writes. A higher value improves performance, but with an increased risk of data loss.
 
 
  innodb_flush_log_at_trx_commit:
 
          MySQL官方文檔參考:https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit
 
          其他參考文檔:
 
          https://blog.csdn.net/codepen/article/details/52160715
 
          https://www.cnblogs.com/mayipapa/p/4685313.html
 
  解釋:
 
          是 InnoDB 引擎特有的,ib_logfile的刷新方式
 
  MySQL日志寫入順序:
 
  log buffer => MySQL(write) => log file => OS刷新(flush) => disk
 
  innodb_flush_log_at_trx_commit取值解釋:(從一些博客之中參考的)
 
  0,延遲寫:
 
  log buffer => 每隔1秒 => log file => OS 實時flush => disk
 
  1,實時寫,實時刷:
 
         log buffer => 實時 => log file => OS實時flush => disk
 
         這樣的話,數據庫對IO的要求就非常高了,如果底層的硬件提供的IOPS比較差,那么MySQL數據庫的并發很快就會由于硬件IO的問題而無法提升
 
  2,實時寫,延遲刷:
 
         log buffer => 實時 => log file => OS每隔1秒 => disk
 
         如果只是MySQL數據庫掛掉了,由于文件系統沒有問題,那么對應的事務數據并沒有丟失。只有在數據庫所在的主機操作系統損壞或者突然掉電的情況下,數據庫的事務數據可能丟失1秒之類的事務數據。這樣的好處,減少了事務數據丟失的概率,而對底層硬件的IO要求也沒有那么高(log buffer寫到文件系統中,一般只是從log buffer的內存轉移的文件系統的內存緩存中,對底層IO沒有壓力)。
 
  官方文檔中文解釋:(筆者自己的理解)
 
         當innodb_flush_log_at_trx_commit,被設置為0,日志緩沖(log buffer)每秒一次地被寫入到日志文件(log file),并且對日志文件做磁盤刷新(flush disk),該模式下在事務提交的時候,不會主動觸發寫入磁盤的操作。
 
         當innodb_flush_log_at_trx_commit,被設置為1,在每個事務提交時,日志緩沖(log buffer)被寫入到日志文件(log file),并且對日志文件做磁盤刷新(flush disk) [同時進行]
 
         當innodb_flush_log_at_trx_commit,被設置為2,在每個事務提交時,日志緩沖(log buffer)被寫入到日志文件(log file),但不對日志文件做磁盤刷新(flush disk) [不同時進行],該模式下,MySQL會每秒執行一次 flush(刷到磁盤)操作
 
         盡管如此,當innodb_flush_log_at_trx_commit值為2時,對日志文件(log file)的磁盤刷新(flush disk)也每秒發生一次。
 
         因為進程安排問題,每秒一次的刷新不是100%保證都會發生??梢酝ㄟ^設置innodb_flush_log_at_trx_commit值不為1來獲得較好的性能,但如果你設置此值為0,那么MySQL崩潰會丟失崩潰前1秒的事務(該模式下性能最好,但不×××全);如果設置此值為2,當操作系統崩潰或斷電時才會丟失最后1秒的事務(該模式下性能較好,也比0模式安全)。如果設置此值為0,該模式性能最低,但是最安全的模式。在MySQL服務崩潰或者操作系統crash的情況下,binlog只會丟失一個語句或一個事務。
 
  注意,許多操作系統和一些磁盤硬件會欺騙刷新到磁盤操作(flush disk)。盡管刷新沒有進行,也會告訴MySQL刷新已經進行。即使設置此值為1,事務的持久性也不被保證,且在最壞的情況下斷電甚至會破壞數據庫。在SCSI磁盤控制器中,或在磁盤自身中,使用有后備電池的磁盤緩存會加速文件刷新并且使得操作更安全??梢栽囍褂胔dparm命令在硬件緩存中禁止磁盤寫緩存,或者使用其他一些對硬件提供商專用的命令
 
  A higher value improves performance, but with an increased risk of data loss
 
  For the greatest possible durability and consistency in a replication setup that uses InnoDB with transactions, use these settings:
 
  sync_binlog=1
 
  innodb_flush_log_at_trx_commit=1
 
  MySQL主從延遲如何計算:
 
  第一種計算方式:position(簡單粗暴,僅僅能看出是否有延遲)
 
  mysql> show slave status/G;
 
  Read_Master_Log_Pos: 4
 
  Exec_Master_Log_Pos: 0
 
  第二種計算方式:Seconds_Behind_Master
 
  參考MySQL官方文檔:
 
  https://dev.mysql.com/doc/refman/5.6/en/replication-administration-status.html
 
  https://dev.mysql.com/doc/refman/5.6/en/show-slave-status.html
 
  參考其他文章:
 
  https://blog.csdn.net/leonpenn/article/details/76489480
 
  1) 當SQL線程執行event時,從庫執行時刻的timestamp值 減去 該event上附帶的時間戳(當時主庫上的timestamp),這兩者的差值
 
  2) 一旦SQL線程未在執行event,則Seconds_Behind_Master為0
 
  3) IO線程或SQL線程 is not running,則Seconds_Behind_Master為NULL
 
  4) Seconds_Behind_Master為0時,表示master slave 復制沒有延遲(絕大情況下如此)
 
  在網絡很快的情況下,io thread 很快的從master獲取binlog到slave的realy log,然后sql thread replay,此時Seconds_Behind_Master值能真正表示slave落后于master的秒數。
 
  在網絡很差的情況下,io thread同步master的binlog很慢,而sql thread replay很快,此時Seconds_Behind_Master也是0,但真正情況是,slave落后于master很多
 
  假如有以下3種情況發生,雖然Seconds_Behind_Master仍然存在非NULL的值,但已經變得不準確
 
  1、主從時間不一致(雖然引入了clock_diff_with_master,盡量調節時間差帶來的影響,但該值僅在從庫與主庫建立連接之時獲取,后續不再更新,若之后再去修改主從機的時間,該值就不可靠了)。
 
  2、主從庫間網絡問題或者從庫IO線程未發現主庫的binlog dump 線程掛了,仍然在等待數據傳輸過來,SBM長時間持續為零。
 
  3、主庫有較大的binlog event執行前后,從庫上看到的SBM將會有大的跳動(監控圖中將很可能產生毛刺)
 
  4、對于并行復制,SMB是基于Exec_Master_Log_Pos,不精準。

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩成人在线免费观看| 亚洲色图日韩av| 国产精品免费久久久久久| 国产亚洲精品激情久久| 久久精品2019中文字幕| 久久手机免费视频| 欧美亚洲另类制服自拍| 91免费在线视频网站| www.欧美免费| 日韩乱码在线视频| 91色琪琪电影亚洲精品久久| 久久这里有精品视频| 国产欧美精品va在线观看| 国产视频丨精品|在线观看| 成人黄色av网站| 亚洲精品日产aⅴ| 久久精品国产亚洲| 欧美激情视频网| 久久久久一本一区二区青青蜜月| 亚洲国产精品大全| 日韩精品在线视频美女| 国产在线拍揄自揄视频不卡99| 欧美日韩人人澡狠狠躁视频| 欧美限制级电影在线观看| 96pao国产成视频永久免费| 51精品在线观看| 日本人成精品视频在线| 岛国av一区二区三区| 国产www精品| 欧美一级视频在线观看| 深夜福利一区二区| 中文综合在线观看| 亚洲一区二区三区在线视频| 成人亚洲欧美一区二区三区| 欧美大片欧美激情性色a∨久久| 久久成人18免费网站| 久久久久久久久久亚洲| 国产午夜精品视频免费不卡69堂| 国产精品69久久| 中文日韩在线观看| 久久6免费高清热精品| 亚洲女在线观看| 国产一区二区三区在线观看视频| 福利精品视频在线| 久久久久久久久综合| 国产精品普通话| 国产精品一二三在线| 久久久久久尹人网香蕉| 国内自拍欧美激情| 成人激情在线播放| 大伊人狠狠躁夜夜躁av一区| 欧美黑人巨大xxx极品| 国产性猛交xxxx免费看久久| 日韩av免费看| 国产999精品| 高清欧美电影在线| 91tv亚洲精品香蕉国产一区7ujn| 欧美日韩亚洲91| 久久久成人精品视频| 最新69国产成人精品视频免费| 亚洲欧洲在线免费| 久久久噜噜噜久久中文字免| 日韩美女免费视频| 91中文字幕在线观看| 久久综合久中文字幕青草| 乱亲女秽乱长久久久| 亚洲色图在线观看| 亚洲国产精品资源| 精品久久久视频| 国产精品91在线| 亚洲美女喷白浆| 亚洲欧美日韩精品久久亚洲区| 中文字幕在线日韩| 久久99亚洲精品| 国产精品www网站| 欧美裸体视频网站| 精品欧美国产一区二区三区| 欧美最猛性xxxxx(亚洲精品)| 精品香蕉一区二区三区| 亚洲精品一区二区网址| 中文字幕一区二区精品| 欧美日韩第一视频| 7777免费精品视频| 日日噜噜噜夜夜爽亚洲精品| 日韩成人在线网站| 尤物九九久久国产精品的分类| 北条麻妃一区二区三区中文字幕| 中文字幕一区电影| 国内精品久久久久| 丝袜美腿精品国产二区| 亚洲一区999| 欧美精品www在线观看| 国产在线精品一区免费香蕉| 日韩av手机在线看| 久久久久久中文字幕| 欧美一级电影免费在线观看| 91av在线国产| 亚洲精品免费一区二区三区| 欧美激情一二区| 国产欧美中文字幕| 亚洲天堂男人天堂女人天堂| 91精品国产高清自在线看超| 日韩一区二区久久久| 欧美精品福利在线| 91久久精品在线| 中文字幕免费精品一区| 日韩av快播网址| 岛国av一区二区| 精品国产一区二区三区四区在线观看| 久久人人爽人人爽人人片亚洲| 色综合五月天导航| 日韩免费视频在线观看| 免费97视频在线精品国自产拍| 欧美在线激情网| 亚洲美女久久久| 日韩激情视频在线| 国产精品视频网址| 欧美老少配视频| 欧美日韩国产页| 成人福利网站在线观看| 久热爱精品视频线路一| 亚洲国产精品人久久电影| 国产一区二区美女视频| 裸体女人亚洲精品一区| 精品国产老师黑色丝袜高跟鞋| 亚洲男人天天操| 国产精品爽爽ⅴa在线观看| 成人写真福利网| 91精品国产色综合久久不卡98| 国产成人精品网站| 欧美中文字幕第一页| 欧美激情综合色| 日韩亚洲精品视频| 久久亚洲影音av资源网| 成人在线小视频| 色综合久久天天综线观看| 欧美成人精品一区| 中文字幕亚洲无线码a| 久久精品成人欧美大片| 日韩成人在线网站| 亚洲最大的免费| 国模精品一区二区三区色天香| 国产成人精品日本亚洲| 91大神在线播放精品| 成人有码视频在线播放| 久久久久久久久久久网站| 国产精品久久久久久av福利软件| 国产精品自产拍在线观看中文| 亚洲精品色婷婷福利天堂| 亚洲欧美日韩高清| 秋霞成人午夜鲁丝一区二区三区| 亚洲女人天堂成人av在线| 日韩av资源在线播放| 欧美激情精品久久久久久变态| 55夜色66夜色国产精品视频| 亚洲护士老师的毛茸茸最新章节| 久久免费成人精品视频| 欧美制服第一页| 日韩有码在线观看| 久久久久亚洲精品成人网小说| 国内外成人免费激情在线视频网站| 久久频这里精品99香蕉| 久久久成人精品| 国产亚洲人成a一在线v站|