對於mysql資料庫架構為:雙主複製模式的不少技術朋友都非常困惑,如何準確判斷mysqld服務是否能正常提供服務,以及能否自動判斷並且進行主機的切換?同時,對mysqld服務的檢測機制要求消耗資源少、判斷簡單且準確、開發和維護成本低等。我們在實際的生產環境檢測過程中,也曾經犯過錯誤,為此寫一篇短小的文章,把相關經驗、思路、做法分享給大家,為更多的技術朋友起到答疑解惑。
要想做到自動切換提供資料庫服務請求的主備伺服器關鍵,就是要確定雙主複製架構中的mysql資料庫例項是否能正常提供服務請求,最讓人頭疼的就是mysqld服務出現hang住的情況。那麼mysqld服務hang住的時候,會有哪些表象呢?先列出本人及圈內朋友們出現過的情況:
u 不能對資料庫中的物件或資料執行修改性操作,但能正常執行查詢操作;
u 能對系統資料庫(備註:mysql、information_schema)的物件或資料進行查詢操作,不能對非系統資料庫的物件和資料;
u 只能對虛擬資料庫(備註: information_schema)的物件及資料進行查詢操作,不能對其他資料庫的物件和資料;
u 不能對對任何資料庫的物件或資料進行查詢操作,但是能執行show processlist;
u 不能對對任何資料庫的物件或資料進行查詢操作,也不能執行show processlist,但是可以執行部分show操作,例如:show status;
u 其他,還未發現的狀態資訊;
針對上述mysqld服務hang住的情況做乙個分析及彙總,可以發現其有一些共同特徵,總結如下:
u mysqld服務存在,且能ping或telnet;
u 能接受客戶端傳送過來的請求,但是不繼續處理,而是停留在其發生hang住的當下sql執行的狀態;
u 若能執行show processlist的話,能看到所有的sql執行狀態停留不變;
u 資料庫伺服器的load會突然下降,甚至load下降為0,cpu、io等都會接近沒負荷狀態;
u 若mysqld服務發生hang住的時候,一般都無法對資料庫的物件或資料執行修改性質的操作;
文章開篇描述了mysqld服務hang住的時候,mysqld接受、處理服務請求的情況,以及資料庫伺服器的狀態資訊,既然可以發現這些特徵,那麼對於常用檢測mysqld服務是否還活著或者網路是否通的辦法:
u ping或telnet mysqld服務的埠;
u 通過執行show 命令;
u 通過執行select查詢操作;
上述三類檢測辦法是否能真正做到準確檢測呢?答案是:no,只能準確監測到mysqld程序是否活著、程式與資料庫伺服器之間的網路是否暢通,對於mysqld服務能否正常接收和完成處理請求,就無法做到或者部分做到,綜合上述分析資訊,以及從目前我們將近三年實施效果看,對資料庫中的資料進行修改操作,再配合程式對資料修改操作的判斷邏輯是最穩妥的方法,詳細步驟:
u 檢測頻率為:每隔10s,對當前提供服務的mysqld資料庫例項上的檢測表,做一次update操作,探測資料庫例項是否正常提供服務;
u 若上一次資料庫例項服務檢測操作,沒有正常返回更新資訊,則每隔1s做一次資料庫檢測表的update操作,總共做2次探測;
u 若前兩個步驟的資料庫例項服務探測結束,當前提供服務的資料庫例項服務都沒恢復正常,則每隔5ms對資料庫檢測表再做一次update操作,總共檢測三次,若還是沒有正常返回資訊,則認定此資料庫例項服務不能正常接收服務請求;
用於執行資料庫例項服務檢測的表結構和update操作sql為:
create table monitor_db(
id smallint unsigned not null auto_incremnet,
createdate timestamp not null default 』0000-00-00 00:00:00′,
primary key(id)
)engine=innodb character set 『utf8′ collate 『utf8_general_ci』;
insert into monitor_db values(1,now()),(2,date_add(now(),interval -1 day));
u mysql5.0及以下版本的update操作sql
update monitor_db set createdate=now() where id=1;
u mysql5.1及以上版本的update操作sql
set session sql_log_bin=0;
update monitor_db set createdate=now() where id=1;
備註:
對於支援mixed、row複製模式的版本,必須規避mysql雙主複製過程中,可能出現主從執行更新操作sql語句的被修改資料不一致的問題,從而導致複製中斷,為此我們對資料庫例項服務檢測的更新操作不記錄到二進位制日誌檔案中,也即不會複製到其各自的從伺服器。
另外,建議大家把monitor_db表建立到test資料庫,或者類似test功能的資料庫中,儲存引擎建議一定要是:innodb,對於檢測頻率可以根據自己對資料安全性要求,而調整為自己能接受的。
若mysqld服務出現hang住的時候,正常關閉mysqld服務的辦法都無效,只有對mysqld服務程序進行作業系統級別的kill -9 操作,然後再啟動mysqld服務例項,等待其自動進行回滾操作結束,才算啟動成功,建議大家別用mysql5.0.82及前後版本,存在一些bug,很容易導致出現hang的情況。
Python的HTTP服務例項
1 前言 今天需要實現乙個pyhton的http服務,與web的js進行交換。2 例項 支援head get post方法,將引數轉換為json格式,返回結果以json字串返回。使用nodejs預設測試如下 var request require request set the headers va...
angular中的 q服務例項
用於理解 q服務 參考 和其它框架一樣,ng 提供了廣義的非同步 管理的機制。http 服務是在其之上封裝出來的。這個機制就是 ng 的 q 服務。不過 ng 的這套機制總的來說實現得比較簡單,按官方的說法,夠用了。使用的方法,基本上是 var testctrl function q functio...
乙個簡單的IOCP伺服器例項
initsock.h檔案 include pragma comment lib,ws2 32 鏈結到ws2 32.lib class cinitsock cinitsock iocpdemo.cpp檔案 除錯通過 include initsock.h include include 初始化winso...