如何判定一個數(shù)據(jù)庫出了問題

主備切換有兩種場景: 主動切換 和 被動切換. 被動切換大多是主庫出了問題瓤逼、由HA系統(tǒng)引發(fā)的. 那么: 如何判定主庫出了問題呢 ?

一炕横、 select 1 判定
實際上, select 1 成功返回、只能說明這個庫的進(jìn)程還在线椰、并不能說明主庫沒問題. eg. 以下場景:

set global innodb_thread_concurrency=3; // 控制innodb并發(fā)線程上限. 超過列粪、進(jìn)入等待. 來避免線程數(shù)過多土至、上下文切換的成本過高.

create table `t`(
 `id` int(11) not null,
`c` int(11) default null
) engine=innodb;

insert into t values(1,1);
image.png

在session D里螟左、select 1是可執(zhí)行成功的, 但查詢表t會被堵住.
注意:

并發(fā)連接和并發(fā)查詢不是一個概念. show processlist看到的幾千個連接啡浊、指的就是并發(fā)連接.
當(dāng)前正在執(zhí)行的語句、才是并發(fā)查詢.
連接多頂多占一些內(nèi)存胶背、而并發(fā)查詢多巷嚣、才是造成CPU壓力的根本. 在線程進(jìn)入鎖等待之后、并發(fā)線程的計數(shù)會-1, 行鎖(包括間隙鎖)不占用CPU資源.

思考:

Mysql會什么設(shè)計鎖等待不計入并發(fā)線程數(shù)呢 ?

假設(shè)以下場景:
1. 線程1 執(zhí)行begin; update t set c=c+1 where id=1; 啟動事務(wù)trx1, 然后保持钳吟、此時線程處于空閑
狀態(tài)廷粒、不計入并發(fā)線程
2.  線程2~129執(zhí)行 update t set c=c+1 where id=1; 由于等行鎖、進(jìn)入等待砸抛、這樣就有128個
線程處于等待狀態(tài).
3. 若處于等待狀態(tài)線程計數(shù)不-1, innodb會認(rèn)為線程用滿、阻止其他查詢語句進(jìn)入引擎執(zhí)行树枫、線程1不能
提交直焙、而另外的128個線程又處于鎖等待狀態(tài)、整個系統(tǒng)就阻塞了. 如下圖:
此時innodb不能響應(yīng)任何請求砂轻、且所有線程都處于等待狀態(tài)奔誓、此時占用CPU為0, 很不合理、所以 
設(shè)計進(jìn)入鎖等待、將并發(fā)線程的計數(shù)器-1, 是合理的.

但: 若真的執(zhí)行查詢厨喂、還是計入并發(fā)線程的. eg. select sleep(100) from t;
等待并發(fā)線程不減1, 系統(tǒng)鎖死.png

二和措、查表判斷
在系統(tǒng)庫(mysql)新建一個表, eg. 命名為 health_check, 里邊只放一行數(shù)據(jù)、定期檢測, 可以發(fā)現(xiàn)由于并發(fā)線程數(shù)過多導(dǎo)致的db不可用.

select * from mysql.health_check;

但: 若空間滿了蜕煌、這種方法又不好使.
更新事務(wù)要寫binlog派阱、而一旦binlog所在磁盤空間占用率達(dá)到100%, 那所有的更新和事務(wù)提交的commit語句都會被堵住, 但可以正常讀取.

三、更新判斷

update mysql.headlth_check set t_modified=now();

節(jié)點可用性的檢測都應(yīng)該包含主庫和備庫斜纪、若用來檢測主庫的話贫母、備庫也要進(jìn)行更新檢測. 但: 備庫的檢測也是要寫binlog的、一般會把A和B的主備關(guān)系盒刚、設(shè)計為雙M架構(gòu)腺劣、所以在備庫B上執(zhí)行的檢測命令、也會發(fā)回給主庫A.
但若A因块、B更新同一條數(shù)據(jù)橘原、就可能發(fā)生行沖突、導(dǎo)致主備同步停止. 可以插入多條數(shù)據(jù)涡上、使用A趾断、B的server_id做主鍵.

create table `headlth_check`(
 `id` int(11) not null,
`t_modified` timestamp not null default current_timestamp,
primary key(`id`)
) engine=innodb;
# 檢測命令
insert into mysql.health_check(id, t_modified) values(@@server_id, now()) on duplicate

這是一個比較常見的方案、但還存在一些問題, 判定慢.
eg. 所有的檢測邏輯都需要一個超時時間N吓懈、執(zhí)行update歼冰、超過Ns不返回、認(rèn)為系統(tǒng)不可用.
但: 假設(shè)日志盤IO利用率已經(jīng)100%, 這個時候系統(tǒng)響應(yīng)很慢耻警、需要主備切換. 但檢測使用的update需要的資源很少隔嫡、拿到io就可以提交成功、超時之前就返回了甘穿、于是得到了系統(tǒng)正常的結(jié)論, 顯然這是不合理的判定.

四腮恩、內(nèi)部統(tǒng)計
針對磁盤利用率、若Mysql 可以告知每次請求的io時間温兼、就靠譜多了.
5.6版本以后的performance_schema庫秸滴、file_summay_by_event_name表里就統(tǒng)計了每次IO請求時間.
event_name='wait/io/file/innodb/innodb_log_file' 統(tǒng)計的是redo log的寫入時間. 第一列 event_name表示統(tǒng)計的類型.
接下來3組、統(tǒng)計的是redo log操作時間

第一組5列募判、是所有IO類型的統(tǒng)計:
count_star 是所有IO總次數(shù)
sum荡含、min、avg届垫、max是統(tǒng)計的總和释液、最小、平均和最大值.(單位ps)

第二組6列装处、是讀操作的統(tǒng)計
最后一列 sum_number_of_bytes_read統(tǒng)計的是误债、總共從redo log讀多少個字節(jié)

第三組6列, 是寫操作統(tǒng)計

最后四組時間、是對其它類型數(shù)據(jù)的統(tǒng)計、在redo log里寝蹈、可以認(rèn)為是對 fsync的統(tǒng)計.

binlog對應(yīng)的event_name是: wait/io/file/sql/binlog 這行李命、統(tǒng)計邏輯同 redo log. 額外的統(tǒng)計這些信息、是有性能耗損的箫老、大概在10%左右. 建議只開啟需要的項.

打開統(tǒng)計項之后封字、可以通過判斷MAX_TIMER的值來判斷數(shù)據(jù)庫是否有問題.
eg. 設(shè)定閾值、單次IO超過200ms屬于異常槽惫、出現(xiàn)異常把之前的統(tǒng)計值清空周叮、再次出現(xiàn)這個異常就可以加入監(jiān)控累計值了.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市界斜,隨后出現(xiàn)的幾起案子仿耽,更是在濱河造成了極大的恐慌,老刑警劉巖各薇,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件项贺,死亡現(xiàn)場離奇詭異,居然都是意外死亡峭判,警方通過查閱死者的電腦和手機(jī)开缎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來林螃,“玉大人奕删,你說我怎么就攤上這事×迫希” “怎么了完残?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長横漏。 經(jīng)常有香客問我谨设,道長,這世上最難降的妖魔是什么缎浇? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任扎拣,我火速辦了婚禮,結(jié)果婚禮上素跺,老公的妹妹穿的比我還像新娘二蓝。我一直安慰自己,他們只是感情好指厌,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布刊愚。 她就那樣靜靜地躺著,像睡著了一般仑乌。 火紅的嫁衣襯著肌膚如雪百拓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天晰甚,我揣著相機(jī)與錄音衙传,去河邊找鬼。 笑死厕九,一個胖子當(dāng)著我的面吹牛蓖捶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扁远,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼俊鱼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了畅买?” 一聲冷哼從身側(cè)響起并闲,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谷羞,沒想到半個月后帝火,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡湃缎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年犀填,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗓违。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡九巡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹂季,到底是詐尸還是另有隱情冕广,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布乏盐,位于F島的核電站佳窑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏父能。R本人自食惡果不足惜神凑,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望何吝。 院中可真熱鬧溉委,春花似錦、人聲如沸爱榕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽黔酥。三九已至藻三,卻和暖如春洪橘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棵帽。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工熄求, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逗概。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓弟晚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親逾苫。 傳聞我的和親對象是個殘疾皇子卿城,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容