999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

解決MySQL同步延遲

2018-11-09 12:01:50
網絡安全和信息化 2018年4期
關鍵詞:引擎

背景

最近有一組DB出現比較大的延遲,這組DB是專門用來存儲監控數據,每分鐘會使用load data的方式導入大量的數據。為了節省空間,將原來使用壓縮表的innodb引擎轉換成了TokuDB引擎,使用的版本和引擎如下:

MySQL Version:5.7

Storage Engine:TokuDB

轉換后,發現主從延遲逐漸增大,基本每天落后主機大概50個binlog左右,大概延遲7.5個小時左右的數據,主機每天大概產生160個binlog,binlog列表如圖1所示。

由于對該業務非常熟悉,因此很快就定位到造成主從同步延遲的原因,并很快就解決了延遲的問題。這里不直接說解決辦法,而是想描述一套完整的解決主從延遲問題的思考方式,和大家一起來系統的做一些思考。帶著問題去思考延遲的根本原因和解決辦法。接下來我們就一起開腦洞。

圖1 binlog列表

首先,既然產生了主從延遲,就說明在從機上的消費速度趕不上主機binlog產生的速度。我們先來思考一下可能的原因,并根據現場的蛛絲馬跡去驗證猜想的正確性。其實所謂問題排查,就是提出可能問題猜想,然后不斷去證明的過程。不同的是,每個人的經驗不同,排查的質量也不盡頭相同,僅此而已。那就來從各個可能的方面探索吧。

網絡

網絡可能導致主從延遲的問題,比如主機或者從機的帶寬打滿、主從之間網絡延遲很大,有可能會導致主機上的binlog沒有全量傳輸到從機,造成延遲。

我的那組DB的IO線程已經將對應的binlog近乎實時的拉取到了從機DB上,基本排除網絡導致的延遲。還可結合網絡質量相關監控來進一步確認是否是網絡的問題。

機器性能

從機使用了爛機器?之前有遇到過有的業務從機使用了很爛的機器,導致的主從延遲。比如,主機使用SSD而從機還是使用SATA。從機用爛機器的觀念需要改改,隨著DB自動切換的需求越來越高,尤其是我所在的金融行業,從機至少不要比主機配置差。

從機高負載?有很多業務會在從機上做統計,把從機服務器搞成高負載,從而造成從機延遲很大的情況,這種使用top命令即可快速發現。

從機磁盤有問題?磁盤、raid卡、調度策略有問題的情況下,有時會出現單個IO延遲很高的情況,比如raid卡電池充放電的時候,在沒有設置強行write back的情況下得會將write back模式修改為write through。 使 用iostat命令查看DB數據盤的IO情況,是否是單個IO的執行時間很長,塊大小和磁盤隊列情況等,可以比較一下DB盤的IO調度規則以及塊大小的設置等。使用iostat查看IO運行情況,如圖2所示。

從IO情況看也沒什么問題,單個IO延遲很小,iops很低,寫帶寬也不大。調度規則(cat/sys/block/fioa/queue/scheduler)和塊大小等和主機設置是一樣的,排除磁盤的問題。

從運行指標看,機器負載很低,機器性能也可以排除。

大事務

圖2 查看IO運行情況

圖3 單線程

是否是經常會有大事務?這個可能廣大DBA們會遇到比較多,比如在RBR模式下,執行帶有大量的delete操作,或者在MBR模式下刪除的時候添加了不確定語句(類似limit),又或者一個表的alter操作等,都會導致延遲情況的發生。這種通過查看processlist相關信息以及使用mysqlbinlog查看binlog中的SQL就能快速進行確認。這個設想也被排除。

鎖沖突問題也會導致從機SQL線程執行慢,比如從機上有一些select....for update的SQL,或者使用了MyISAM引擎等。此類問題,可以通過抓去processlist以及查看information_schema下面和鎖以及事務相關的表來查看。經過排查也并未發現鎖的問題。

參數

參數部分使用如果是innodb引擎,可以根據自己的使用環境調整innodb_flush_log_at_trx_commit、sync_binlog參數來提升復制速度,那組 DB使用的 TokuDB,則可以優化tokudb_commit_sync、tokudb_fsync_log_period、sync_binlog等參數來做調整。這些參數調整后,復制的延遲情況會有一些作用。

注意:這種調整可能會影響數據的安全性,需要結合業務來考慮。

多線程

多線程問題可能是DBA們遇到最多的問題,之前在5.1和5.5版本,MySQL的單線程復制瓶頸就廣受詬病。從5.6開始MySQL正式支持多線程復制。

很容易想到,如果是單線程同步,單個線程存在寫入瓶頸,導致主從延遲。那就先調整為多線程試試效果。

可以通過show processlist查看是否有多個同步線程,也可以查看參數的方式查看是否使用多線程(show variables like'%slave_parallel%')。

當你看到是圖3這種結果的時候,恭喜你,你使用的是單線程。使用下面那行命令改造成多線程復制:

STOP SLAVE SQL_THREAD;SET GLOBAL slave_parallel_type='LOGICAL_CLOCK';SET GLOBAL slave_parallel_workers=8;START SLAVE SQL_THREAD;

改造后如圖4所示。本來就已經是多線程復制了,因此問題的根源也不在是否開啟多線程復制上。但是當我使用show processlist查看復制狀態的時候,大多數情況下發現只有1個SQL線程在執行,如圖5所示。可以發現,基本都是一個線程在執行,那么可以初步判定是多線程的威力沒有得到很好的發揮,為了更有力地說明問題,想辦法統計出來每個同步線程使用的比率。統計方法如下:

1.將線上從機相關統計打開(出于性能考慮默認是關閉的),打開方法可以如下如下SQL:

圖4 多線程

圖5 查看復制狀態

圖5 查看復制狀態

UPDATE performance_schema.setup_consumers SET ENABLED = 'YES'WHERE NAME LIKE 'events_transactions%';

UPDATE performance_schema.setup_instruments SET ENABLED = 'YES',TIMED = 'YES'WHERE NAME= 'transaction';

2.創建一個查看各個同步線程使用量的視圖,代碼如下:

USE test;

CREATE VIEW rep_thread_count AS SELECT a.THREAD_ID AS THREAD_ID,a.COUNT_STAR AS COUNT_STAR FROM performance_schema.events_transactions_summary_by_thread_by_event_name a WHERE a.THREAD_ID in (SELECT b.THREAD_ID FROM performance_schema.replication_applier_status_by_worker b);

3.一段時間后,統計各個同步線程的使用比率,SQL如下:

SELECT SUM(COUNT_STAR) FROMrep_thread_count INTO @total;

SELECT 100*(COUNT_STAR/@total) AS thread_usage FROMrep_thread_count;

結果如下 :58.15、10.53、7.77、6.66、5.88、5.39、5.08、4.57。

從上面的結果我們可以看出,絕大多數情況下都是一個線程在跑,在監控這種存在大量數據導入的場景,肯定容易出現瓶頸。如果能提高各線程并發執行的能力,可能很好地改善同步延遲的情況,那該如何來解決呢?

組提交

我們不妨從多線程同步的原理來思考,在5.7中,多線程復制的功能有很大的改善,支持LOGICAL_CLOCK的方式,在這種方式下,并發執行的多個事務只要能在同一時刻commit,就說明線程之間沒有鎖沖突,那么master就可以將這一組的事務標記并在slave機器上安全的進行并發執行。因此,可以盡可能地使所有線程能在同一時刻提交,這樣就能很大程度上提升從機的執行的并行度,從而減少從機的延遲。

有了這個猜想后,很自然想到了人為控制盡可能多地使所有線程在同一時刻提交,其實官方已經給我們提供了類似的參數,參數如下:

binlog_group_commit_sync_delay

#參 數 說 明 見:https://dev.mysql.com/doc/refman/5.7/en/replication-optionsbinary-log.html#sysvar_binlog_group_commit_sync_delay

注意:這個參數會延遲SQL的響應,對延遲非常敏感的環境需要特別注意,單位是微秒。

binlog_group_commit_sync_no_delay_count

#參 數 說 明 見:https://dev.mysql.com/doc/refman/5.7/en/replication-optionsbinary-log.html#sysvar_binlog_group_commit_sync_no_delay_count

注意:這個參數取到了一定的保護作用,在達到binlog_group_commit_sync_no_delay_count設定的值的時候,不管是否達到了binlog_group_commit_sync_delay設置定的閥值,都立即進行提交。

由于是監控的DB,主要是load數據,然后展示,1秒左右的導入延遲對業務沒什么影響,因此將兩個參數調整為:

SET GLOBAL binlog_group_commit_sync_delay= 1000000;

SET GLOBAL binlog_group_commit_sync_no_delay_count = 20;

注意:這兩個參數請根據業務特性進行調整,以免造成線上故障。

為了防止導入SQL堆積,設置SET GLOBAL binlog_group_commit_sync_no_delay_count為 20,在達到20個事務的時候不管是否達到了1秒都進行提交。減少對業務的影響。

設置完這兩個參數后,發現并發復制瞬間提升了好多,很多時候8個線程都能跑滿。于是將線程調整到16個。運行一段事件后,再次統計各個同步線程的使用比率,發現并發度提升了非常多,新的比率為:15.17、11.68、10.35、9.18、7.96、6.68、5.80、4.97、4.38、4.00、3.66、3.51、3.32、3.24、3.11、3.02。

通過show slave status查看,發現從機延遲越來越小,目前已經完全追上,并穩定運行了一周。

總結

最后,簡單總結一下:

在遇到主從延遲的問題的時候,可以從如下幾個地方開腦洞,尋找蛛絲馬跡,找到問題的根源,對癥下藥,藥到病除,排查范圍包括但不限于如下幾方面:網絡方面、性能方面、配置方面(參數優化)、大事務、鎖、多線程復制、組提交。

通過上面對整個問題排查的梳理,希望廣大DBA遇到類似復制延遲的問題都能徹底終結。

猜你喜歡
引擎
以學促干 挺膺擔當 激活砥礪前行的紅色引擎
江陰市“三個創新”打造危化品安全監管新引擎
新海珠,新引擎,新活力!
消費繼續發揮經濟增長第一引擎作用
消費導刊(2018年8期)2018-05-25 13:19:23
三生 三大引擎齊發力
藍谷: “涉藍”新引擎
商周刊(2017年22期)2017-11-09 05:08:31
休閑垂釣 傳統漁業新引擎
中國水產(2017年2期)2017-02-25 07:56:29
信息化,“盛京”加速的新引擎
中國衛生(2015年4期)2015-11-08 11:16:18
無形的引擎
河南電力(2015年5期)2015-06-08 06:01:46
基于Cocos2d引擎的PuzzleGame開發
主站蜘蛛池模板: 国产一在线观看| 国产一级做美女做受视频| 久久精品国产免费观看频道| 久久这里只精品热免费99| 国产中文一区a级毛片视频| 亚洲不卡av中文在线| 欧美日韩中文字幕二区三区| 天天色天天综合网| 欧洲日本亚洲中文字幕| 91福利在线观看视频| 色天堂无毒不卡| 男女男免费视频网站国产| 激情无码字幕综合| 91无码人妻精品一区二区蜜桃 | 在线观看亚洲天堂| 一级黄色片网| aa级毛片毛片免费观看久| 制服丝袜国产精品| 精品国产福利在线| 狠狠色丁香婷婷| 热这里只有精品国产热门精品| www欧美在线观看| 中文字幕第1页在线播| 欧美不卡二区| 婷婷丁香在线观看| 中文一区二区视频| 欧美国产在线看| 亚洲精品亚洲人成在线| 精品五夜婷香蕉国产线看观看| 婷婷亚洲天堂| 天堂岛国av无码免费无禁网站| 中文字幕永久在线看| 九九热精品在线视频| 国产精品视频第一专区| 色九九视频| 黄色网站不卡无码| 亚洲综合极品香蕉久久网| 大陆精大陆国产国语精品1024| 亚洲手机在线| 国产激爽大片高清在线观看| 色综合久久88| 亚洲中久无码永久在线观看软件| 熟妇丰满人妻| 国产爽爽视频| 狠狠久久综合伊人不卡| 久久婷婷五月综合97色| 高清无码一本到东京热 | 成人免费网站在线观看| 欲色天天综合网| 国产在线欧美| 欧美不卡二区| v天堂中文在线| 欧美精品v欧洲精品| 青草视频在线观看国产| 青青热久免费精品视频6| 一本一本大道香蕉久在线播放| 九九这里只有精品视频| 永久毛片在线播| 成人精品在线观看| 综1合AV在线播放| 毛片视频网| 色婷婷丁香| 久久精品66| 最新日本中文字幕| 国产不卡在线看| 欧美黄色网站在线看| 久久亚洲天堂| 青青青国产视频手机| 67194亚洲无码| 91亚洲视频下载| 99人妻碰碰碰久久久久禁片| 国产伦精品一区二区三区视频优播| 久久免费看片| 色哟哟国产成人精品| 青草免费在线观看| h视频在线播放| 国产一级裸网站| 国产黄色片在线看| 91精品啪在线观看国产91| 青草91视频免费观看| 波多野结衣第一页| 精久久久久无码区中文字幕|