《MySQL——外部檢測與內部統計 判斷 主庫是否出現問題》

目錄

    • select1判斷
    • 查表判斷
    • 更新判斷
    • 外部檢測弊端
    • 內部統計

一主一備的雙M架構里,主備切換只需要把客戶端流量切換到備庫。

在一主多從的架構里,主備切換要把客戶端流量切換到備庫,也需要把從庫接到新主庫上。

切換有兩種場景:1、主動切換 2、被動切換。

被動切換是由于主庫出問題了,下面是幾種判斷主庫出問題的方法:

select1判斷

select 1 成功返回,說明這個庫的進程孩子啊,但是不能說明主庫沒問題。

如果在執行語句超過了設置的innodb_thread_concurrency,此時select 1語句是成功的,但是CPU不能滿足線程查詢要求了,新的查詢要求進來只會阻塞。

查表判斷

在系統庫(mysql庫)里創建一個表,命名為health_check,里面只放一行數據,然后定期執行語句:

select * from mysql.headlth_check;

使用這個方法,可以檢測出由于并發線程過多導致的數據庫不可用的情況。

但是這個方法也會有一個問題:空間滿了,失效

更新事務要寫binlog,一旦binlog所在的磁盤空間占用率達到100%,那么所有的更新語句和事務提交commit語句就會堵住。但是系統此時是可以正常讀數據的。

更新判斷

放一個timestamp字段,用來表示最后一次執行檢測的時間:

update mysql.health_check set t_modified = now();

這種節點可用性檢測應該包含主庫和備庫。

備庫檢測也要寫binlog, 一般只能主庫寫,備庫不能寫。這里是為了檢測備庫,所以才能寫,但是binlog是雙M結構,所以會互相同步這一個檢測sql,那么有可能會造成主從數據不一致(t_modified內容不同)

如果主庫A和備庫B都用相同的更新命令,就可能出現行沖突,從而導致主備同步停止。

我們可以在表上存入多行數據,用A,B的server_id做主鍵:

create table 'health_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 key update t_modified=now();

MySQL規定了主庫和備庫的server_id必須不同,就可以保證主、備庫各自的檢測命令不會發生沖突

這種方法仍然存在問題:判定慢

所有的檢測邏輯都需要一個超時時間N。即執行一條update語句,超過N秒后還不返回就認為系統不可用。

如果一個日志盤的IO利用率已經是100%的場景,此時系統響應非常慢,已經需要做主備切換了。

我們檢測使用的update命令由于需要的資源比較少,很可能在拿到IO資源的時候就可以提交成功,并且在超時時間N秒未到達之前就返回給檢測系統。所以update命令沒有超時,然后得到系統正常的錯誤結論。

外部檢測弊端

上面的三種方法都是基于外部檢測的。外部檢測天然有個問題,就是隨機性。

外部檢測都需要定時輪詢,所以系統可能已經出現問題了,但是卻要等到下一個檢測語句執行的時候才能發現問題。運氣不好,第一次輪詢還不能發現。

內部統計

MySQL5.6版本后提供了performance_schema庫,在file_summary_by_event_name表里統計每次IO請求的時間。
在這里插入圖片描述

該行數據統計的是redo log的寫入時間。

COUNT_STAR是所有IO總次數。

前綴SUM、MIN、AVG、MAX,指統計項的總和、最小值、平均值、最大值。

SUM_NUMBER_OF_BYTES_READ 統計總共從redo log里讀了多少字節

需要注意的是,每進行一次統計,是由性能損耗的,所以建議只打開自己需要的項進行統計。

如打開 redo log 的時間監控:

mysql> update setup_instruments set ENABLED='YES', Timed='YES' where name like '%wait/io/file/innodb/innodb_log_file%';

然后通過MAX_TIMER值來判斷數據庫是否出現問題。可以設定閾值,單次IO請求時間超過200ms屬于異常,然后使用類似于下面的語句檢測:

mysql> select event_name,MAX_TIMER_WAIT  FROM performance_schema.file_summary_by_event_name where event_name in ('wait/io/file/innodb/innodb_log_file','wait/io/file/sql/binlog') and MAX_TIMER_WAIT>200*1000000000;

發生異常后,取得需要數據后再:

mysql> truncate table performance_schema.file_summary_by_event_name;

把之前的統計信息清空。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377171.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377171.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377171.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NIM的完整形式是什么?

NIM:無內部消息 (NIM: No Internal Message) NIM is an abbreviation of "No Internal Message". NIM是“無內部消息”的縮寫。 It is an expression, which is commonly used in the Gmail platform. It is written in the subject of the mail, if the…

[Json] C#ConvertJson|List轉成Json|對象|集合|DataSet|DataTable|DataReader轉成Json (轉載)...

點擊下載 ConvertJson.rar 本類實現了 C#ConvertJson|List轉成Json|對象|集合|DataSet|DataTable|DataReader轉成Json|等功能大家先預覽一下 請看代碼 /// <summary> /// 類說明&#xff1a;Assistant /// 編 碼 人&#xff1a;蘇飛 /// 聯系方式&#xff1a;361983679 …

let 只能在嚴格模式下嗎_LET的完整形式是什么?

let 只能在嚴格模式下嗎LET&#xff1a;今天早早離開 (LET: Leaving Early Today) LET is an abbreviation of "Leaving Early Today". LET是“ Leaveing Today Today”的縮寫 。 It is an expression, which is commonly used in the Gmail platform. It is writt…

js 遮罩層 loading 效果

//調用方法 //關閉事件<button οnclickLayerHide()>關閉</button>&#xff0c;在loadDiv(text)中&#xff0c;剔除出來 //調用LayerShow(text)&#xff0c;text為參數&#xff0c;可以寫入想要寫入的提示語 //本方法在調用時會自動生成一個添加到body的div&#x…

centos6.5安裝配置LDAP服務[轉]

centos6.5安裝配置LDAP服務[轉] 安裝之前查一下 1find / -name openldap*centos6.4默認安裝了LDAP&#xff0c;但沒有裝ldap-server和ldap-client 于是yum安裝 1su root2yum install -y openldap openldap-servers openldap-clients不建議編譯源碼包&#xff0c;有依賴比較麻煩…

《MySQL——恢復數據-誤刪行、表、庫》

目錄誤刪行事前預防誤刪行數據方法誤刪表/庫延遲復制備庫事前預防誤刪庫/表方法傳統的架構不能預防誤刪數據&#xff0c;因為主庫的一個drop table命令&#xff0c;會通過binlog傳給所有從庫和級聯從庫&#xff0c;進而導致整個集群的實例都會執行這個命令。 MySQL相關的誤刪除…

python圖例位置_Python | 圖例位置

python圖例位置Legends are one of the key components of data visualization and plotting. Matplotlib can automatically define a position for a legend in addition to this, it allows us to locate it in our required positions. Following is the list of locations…

Freemarker中遍歷List實例

Freemarker中如何遍歷List摘要&#xff1a;在Freemarker應用中經常會遍歷List獲取需要的數據&#xff0c;并對需要的數據進行排序加工后呈現給用戶。那么在Freemarker中如何遍歷List&#xff0c;并對List中數據進行適當的排序呢&#xff1f;通過下文的介紹&#xff0c;相信您一…

工作總結:文件對話框的分類(C++)

原文地址&#xff1a;http://www.jizhuomi.com/software/173.html 文件對話框分為打開文件對話框和保存文件對話框&#xff0c;相信大家在Windows系統中經常見到這兩種文件對話框。例如&#xff0c;很多編輯軟件像記事本等都有“打開”選項&#xff0c;選擇“打開”后會彈出一個…

《MySQL——Innodb改進LRU算法》

Innodb改進LRU.算法&#xff0c;實質上將內存鏈表分成兩段。 靠近頭部的young和靠近末尾的old&#xff0c;取5/12段為分界。 新數據在一定時間內只能在old段的頭部&#xff0c;當在old段保持了一定的時間后被再次訪問才能升級到young。 實質上是分了兩段lru&#xff0c;這樣做的…

nfc/nfc模式_NFC的完整形式是什么?

nfc/nfc模式NFC&#xff1a;沒有進一步評論 (NFC: No Further Comment) NFC is an abbreviation of "No Further Comment". NFC是“沒有進一步評論”的縮寫 。 It is an expression, which is commonly used in messaging or chatting on social media networking s…

dx小記(2)

1.構造一個平截臺體&#xff08;Frustum&#xff09; 最近距離-projMatirx.43/projMatrix.33 projMatrix。33 深度/&#xff08;深度-最近距離&#xff09; projMatrix。44-最近距離*&#xff08;深度/&#xff08;深度-最近距離&#xff09;&#xff09; FrustumMatrix proje…

jQuery: 整理4---創建元素和添加元素

1.創建元素&#xff1a;$("內容") const p "<p>這是一個p標簽</p>" console.log(p)console.log($(p)) 2. 添加元素 2.1 前追加子元素 1. 指定元素.prepend(內容) -> 在指定元素的內部的最前面追加內容&#xff0c;內容可以是字符串、…

Design a high performance cache for multi-threaded environment

如何設計一個支持高并發的高性能緩存庫 不 考慮并發情況下的緩存的設計大家應該都比較清楚&#xff0c;基本上就是用map/hashmap存儲鍵值&#xff0c;然后用雙向鏈表記錄一個LRU來用于緩存的清理。這篇文章 應該是講得很清楚http://timday.bitbucket.org/lru.html。但是考慮到高…

《MySQL——join語句優化tips》

目錄要不要用joinJoin驅動表選擇Multi-Range Read優化Batched Key Access &#xff08;BKA&#xff09;對NLJ進行優化BNL算法性能問題BNL轉BKA要不要用join 1、如果使用的是Index Nested-Loop Join算法&#xff0c;即可以用上被驅動表的索引&#xff0c;可以用 2、如果使用的…

scala中抽象類_Scala中的抽象類

scala中抽象類抽象類 (Abstract Class) In the Scala programming language, abstraction is achieved using abstract class. 在Scala編程語言&#xff0c; 抽象是使用抽象類來實現的。 Abstraction is the process of showing only functionality and hiding the details fr…

不能catch Fatal的exception

Clemens Vasters - Are you catching falling knives?里給了一個判斷C#的exception是不是fatal的代碼&#xff0c;可以參考參考。 public static bool IsFatal(this Exception exception) {while (exception ! null){if (exception as OutOfMemoryException ! null &&…

HDU 2824 The Euler function

篩法計算歐拉函數 #include <iostream> #include <cstdio> using namespace std; const int maxn3000005; long long phi[maxn]; int main(){int i,j,a,b;for(i1;i<maxn;i) phi[i]i;for(i2;i<maxn;i2) phi[i]/2;for(i3;i<maxn;i2)if(phi[i]i){for(ji;j<…

LinkChecker 8.1 發布,網頁鏈接檢查

LinkChecker 8.1 可對檢查時間和最大的 URL 數量進行配置&#xff1b;當使用 HTTP 請求時發送 do-not-track 頭&#xff1b;生成 XML 的 sitemap 用于搜索引擎優化&#xff1b;檢測 URL 長度和重復的頁面內容&#xff1b;修復了很多檢查的 bug。 LinkChecker 是一個網頁鏈接檢查…

c語言語言教程0基礎_C語言基礎

c語言語言教程0基礎Hey, Folks here I am back with my second article on C language. Hope you are through with my previous article C language - History, Popularity reasons, Characteristics, Basic structure etc. In this one, I will cover some fundamental conce…