摘要:完成的一個(gè)小程序,用于殺掉上的異常線程,如慢查詢處于狀態(tài)的。在這里出現(xiàn)的實(shí)例都會(huì)被執(zhí)行檢查,可用注釋,但需要重啟腳本。檢查用公共配置,實(shí)時(shí)生效。為表示腳本不進(jìn)行任何檢查,只簡(jiǎn)單維護(hù)與數(shù)據(jù)庫(kù)的連接存活。試運(yùn)行模式可用于監(jiān)控慢查詢并告警。
Python完成的一個(gè)小程序,用于殺掉 MySQL 上的異常線程,如慢查詢、處于Sleep狀態(tài)的。
項(xiàng)目地址:https://github.com/seanlook/m...
寫這個(gè)腳本的初衷是在使用阿里云RDS的過(guò)程中,數(shù)據(jù)庫(kù)出現(xiàn)異常,需要快速恢復(fù)。網(wǎng)上有許多類似的kill腳本,都是通過(guò) mysqladmin 實(shí)現(xiàn)的。然而 Ali-RDS 環(huán)境有以下限制:
不提供 SUPER 權(quán)限的用戶,也就是用戶只能 kill 自己的線程
當(dāng)連接數(shù)暴增時(shí),外部用戶無(wú)法登陸,包括控制臺(tái)
為了解決上午2大問(wèn)題,該 python 腳本通過(guò)在db實(shí)例上,使用多線程的方式,為每個(gè)用戶保留一個(gè)連接,并實(shí)時(shí)讀取指令配置文件 mysqk.ini,發(fā)現(xiàn)有 kill 需求時(shí),利用對(duì)應(yīng)用戶已有連接找到 information_schema.processlist 中符合條件的線程,并 kill 。
說(shuō)明:該腳本在9月份做過(guò)一次重寫,7月份的版本(分支 old_0.5.0)是每實(shí)例每用戶,對(duì)應(yīng)一個(gè)線程,db實(shí)例一多線程數(shù)也太多,看得始終不太優(yōu)雅,于是改成了一個(gè)db實(shí)例一個(gè)線程,維護(hù)同時(shí)維護(hù)多個(gè)用戶的會(huì)話。同時(shí)新版也加入了更多的功能,如按時(shí)間窗口檢查,包含或排除特定連接,郵件通知,配置項(xiàng)覆蓋。
特性始終通過(guò) mysql ping 維持一個(gè)長(zhǎng)連接,并有斷開(kāi)自動(dòng)重來(lái)機(jī)制,解決沒(méi)有連接可用的尷尬局面
每個(gè)db實(shí)例有自己的線程,避免需要多帶帶登陸個(gè)別用戶去kill的繁復(fù)操作。
如果你具有 SUPER 權(quán)限,也可以簡(jiǎn)化配置做到兼容
能夠分開(kāi)應(yīng)對(duì)需要?dú)⑺谰€程的場(chǎng)景:
長(zhǎng)時(shí)間運(yùn)行超過(guò) N 秒的
Sleep 狀態(tài)的事務(wù) (一般不建議,但有時(shí)候kill它,可以快速釋放連接給管理員使用)
排除一些線程不能kill,如 Binlog dump
包含特定關(guān)鍵字的線程要kill
出現(xiàn)符合條件的線程時(shí),會(huì)對(duì)當(dāng)時(shí)的processlist, engine status,lock_wait 做一個(gè)快照,并郵件發(fā)出
有試運(yùn)行dry_run模式,即執(zhí)行所有的檢查過(guò)程但不真正kill
支持只在時(shí)間窗口內(nèi)運(yùn)行,考慮到晚上一些長(zhǎng)任務(wù)不檢查
密碼加密
快速使用需要pip安裝MySQL-python和pycrypto兩個(gè)庫(kù),只在python 2.7上有測(cè)試。
在 settings.py 里面設(shè)置連接的用戶名和密碼信息。這里假設(shè)同一批db的要check的認(rèn)證信息是一樣的,指定的用戶既用于登錄認(rèn)證,也用于告知腳本哪些用戶需要被檢查。
密碼要通過(guò) prpcryptec.py 加密,加密的密鑰需寫入腳本本身的 KEY_DB_AUTH變量。(擔(dān)心泄露的話,把mysqk.py編譯成 pyc 來(lái)跑)
在 mysqk.ini 主配置文件里面
db_info 節(jié)設(shè)置需要被檢查的數(shù)據(jù)庫(kù)地址,如 db01=10.0.200.100:3306
可分別 db01等指定需要kill thread的選項(xiàng)。[id_db01] 則默認(rèn)復(fù)用 [db_commkill] 的選項(xiàng)
db_comconfig 節(jié)設(shè)置 db_puser 為能查看到所有processlist的權(quán)限用戶,且在 settings.py 的DB_AUTH中已指定
只想執(zhí)行檢查,并不想真正kill異常線程,確認(rèn) dry_run不等于0
Here we go!
配置項(xiàng)說(shuō)明mysqk.ini:
mail_config郵件通知相關(guān)設(shè)置,smtp服務(wù)地址和認(rèn)證信息。
mail_receiver= 設(shè)置空,表示不發(fā)郵件
設(shè)置要檢查kill哪些數(shù)據(jù)庫(kù)實(shí)例.
格式:
在這里出現(xiàn)的db實(shí)例都會(huì)被執(zhí)行檢查,可用 ; 注釋,但需要重啟腳本。
db_comconfig檢查用公共配置,實(shí)時(shí)生效。
db_puser:指定一個(gè)用戶名用于 show processlist,需要的權(quán)限:PROCESS、information_schema庫(kù)查看??梢哉J(rèn)為是一個(gè)代表用戶,檢查異常thread,把結(jié)果提供給有該thread殺掉權(quán)限用戶。
run_max_count:執(zhí)行檢查的次數(shù),是一個(gè)全局控制開(kāi)關(guān)。每次修改這個(gè)值都會(huì)重新開(kāi)始檢查,即一個(gè) clean start,讓剛修改的配置生效。
為 0 表示腳本不進(jìn)行任何檢查,只簡(jiǎn)單維護(hù)與數(shù)據(jù)庫(kù)的連接存活。存活檢查頻率在 settings.py 由 CHECK_CONFIG_INTERVAL × CHECK_PING_MULTI決定
為 999 表示會(huì)在后臺(tái)一致檢查連接線程(但不一定有符合kill條件的),檢查的頻率在 settings.py 里面 CHECK_CONFIG_INTERVAL 指定
為其它值時(shí),表示檢查次數(shù)滿后停止檢查
dry_run:是否開(kāi)啟試運(yùn)行模式,為0表示真實(shí)kill,為1或其它值表示試運(yùn)行。試運(yùn)行模式可用于監(jiān)控慢查詢并告警。注意同一會(huì)話線程ID只告警一次
run_time_window:運(yùn)行的檢查的時(shí)間窗口,格式如 08:00-22:00,在這個(gè)時(shí)間以外不執(zhí)行檢查,留空表示不限制。主要考慮晚上一些統(tǒng)計(jì)任務(wù)可能出現(xiàn)“異?!本€程。
db_commkillkill用公共配置,實(shí)時(shí)生效,會(huì)被 id_
k_user:很關(guān)鍵的一個(gè)選項(xiàng),表示你要檢查并kill哪些數(shù)據(jù)庫(kù)用戶,多個(gè)用逗號(hào)分隔(不要帶引號(hào))。
為 all 時(shí),表示要檢查 settings.py 里 DB_AUTH 指定的所有用戶
為 none 時(shí),表示不kill任何異常線程,效果與設(shè)置了 dry_run 模式相當(dāng)
k_longtime:執(zhí)行超過(guò)設(shè)定值的sql則認(rèn)為異常。一般大于 CHECK_CONFIG_INTERVAL
k_sleep:Sleep超過(guò)設(shè)定秒的sql則認(rèn)為異常,為 0 表示不殺掉sleep狀態(tài)的線程
k_exclude:排除掉那些特定關(guān)鍵字的線程,比如復(fù)制線程、管理員的連接等
k_include:包含這些特定關(guān)鍵字的線程,需要被kill。注意,它作用在滿足 k_user 和 k_exclude 的前提之下。
k_exclude與k_include 的值是支持python re模塊正則的格式,不要帶引號(hào)
這部分區(qū)域的配置項(xiàng)與 db_commconfig 相同,用于針對(duì)個(gè)別db的kill選項(xiàng)。
使用建議兩種組合模式:
設(shè)置 dry_run=0,默認(rèn) k_user=none,當(dāng)數(shù)據(jù)庫(kù)出現(xiàn)異常時(shí),主動(dòng)修改對(duì)應(yīng)db的k_user值,動(dòng)態(tài)kill
設(shè)置 dry_run=1,默認(rèn) k_user=all,相當(dāng)于運(yùn)行在daemon模式,有慢查詢則郵件通知,并且記錄下當(dāng)時(shí)的信息
當(dāng)然你也可以dry_run=0,k_user=all,讓程序一直在后臺(tái)跑并kill,但生產(chǎn)環(huán)境極不推薦。
有日志和快照文件可以查看。
配置文件示例mysqlk.ini :
[mail_config] mail_host=smtp.exmail.qq.com [email protected] mail_pass=xxxxxx mail_receiver= [db_info] crm0=192.168.1.125:3306 crm1=192.168.1.126:3306 crm2=192.168.1.127:3306 crm3=192.168.1.128:3306 base=10.0.200.142:3306 [db_commconfig] db_puser=ecuser ; how many kill times once this config file changed ; 0: DISABLE all kill ; 999: always kill threads that meet kill conditions ; default: 1 ; can not be inherit run_max_count=999 dry_run=1 run_time_window=08:00-22:00 [db_commkill] k_user=all k_longtime=10 k_lock=1 k_sleep=0 k_exclude=Binlog|ecdba|Daemon k_include=select sleep(17) [id_crm0] ; k_user: who"s threads to be killed. use comma to separate ; none: do not kill anyone"s threads ; all: kill all user"s threads (with other where conditions) ; default: none k_user=all ; k_longtime: filter the threads who"s running time is longer than this ; 0: ignore the time > x condition ; default: 10 k_longtime=10 ; k_sleep: whether kill sleepd threads or not ; 0: do not kill command="Sleep" threads from processlist ; when it set to 1, usually it"s subset of k_longtime condition ; default: 0 k_sleep=0 [id_crm1] k_user=ecuser k_longtime=10 k_sleep=0 [id_crm2] k_user=all k_longtime=10 k_sleep=0 [id_crm3]
原文鏈接地址:http://seanlook.com/2016/09/2...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44278.html
摘要:實(shí)際應(yīng)用中,查詢的返回結(jié)果會(huì)有條記錄。修改保存文件后,重啟服務(wù)。通常優(yōu)化至少到級(jí)別,最好能優(yōu)化到指出使用哪個(gè)索引在該表找到行記錄。如果該值為,說(shuō)明沒(méi)有使用索引,可以建立索引提高性能顯示實(shí)際使用的索引。 ...
閱讀 3419·2021-09-09 11:39
閱讀 1259·2021-09-09 09:33
閱讀 1164·2019-08-30 15:43
閱讀 581·2019-08-29 14:08
閱讀 1757·2019-08-26 13:49
閱讀 2412·2019-08-26 10:09
閱讀 1576·2019-08-23 17:13
閱讀 2325·2019-08-23 12:57