尋找武漢手機(jī)網(wǎng)站建設(shè)精準(zhǔn)引流推廣公司
場景:早上來發(fā)現(xiàn)一個程序,鏈接mysql數(shù)據(jù)庫有點(diǎn)問題,隨后排查,因為容器在k8s里面。所以嘗試重啟了pod沒有效果
一、重啟pod:
這里是幾種在Kubernetes中重啟Pod的方法:
- 刪除Pod,利用Deployment重建
kubectl delete pod mypod
Deployment控制器會重建新的Pod
-
使用kubectl edit直接編輯Pod定義,設(shè)置spec.restartPolicy為Always
-
利用RollingUpdate觸發(fā)Pod重啟:
kubectl rollout restart deployment mydeploy
- 利用kubectl exec遠(yuǎn)程執(zhí)行重啟命令:
kubectl exec mypod -- /bin/sh -c "reboot"
- 設(shè)置PodTemplate的LastAppliedConfigAnnotation觸發(fā)重啟
以上都是些常用的在K8s中重啟Pod的方式。
根據(jù)需要選擇合適的方法。刪除重建和RollingUpdate比較流暢,適合批量重啟。exec命令適用于個別Debug場景的重啟。
二、強(qiáng)制停止服務(wù)
有幾種方法可以完全停掉Kubernetes集群中的Pod:
- 縮容Deployment:
kubectl scale deployment my-deploy --replicas=0
這會將Pod的副本數(shù)設(shè)置為0,停止所有Pod。
- 移除Pod selector標(biāo)簽:
編輯Deployment,移除pod模板中的標(biāo)簽,如app=myapp。這會使現(xiàn)有Pod與部署不匹配而被刪除。
- 編輯Deployment的.spec.paused=true
這會暫停Deployment的操作,停止重新創(chuàng)建Pod。
- 刪除Namespace:
kubectl delete namespace my-ns
刪除命名空間也會刪除其中的所有Pod。
所以通過組合使用上述方法,可以完全刪除或停止Namespace和Deployment中的Pod。
注意完全停Pod可能會影響服務(wù),要根據(jù)實際情況平滑處理。
三、檢查mysql
通過show processlist;
發(fā)現(xiàn)有大量的Waiting for table metadata lock
命令查詢及批量刪除:
要批量kill掉那些因等待表元數(shù)據(jù)鎖(Waiting for table metadata lock)而被阻塞的連接,可以使用如下方法:
- 查找那些被阻塞的連接:
SELECT * FROM information_schema.processlist
WHERE state = 'Waiting for table metadata lock'
AND time > 60;
這會返回所有被阻塞超過60秒的連接。
- 然后批量kill掉這些連接:
SELECT concat('KILL ', id, ';') FROM information_schema.processlist
WHERE state = 'Waiting for table metadata lock'
AND time > 60;
這會生成一系列的KILL語句。
- 復(fù)制這些KILL語句并執(zhí)行,就能有效終止那些被長時間阻塞的連接,釋放表鎖。
注意提前檢查需要KILL的連接,避免影響正處理重要任務(wù)的連接。
tips:
1.要用對特權(quán)賬戶,有些業(yè)務(wù)賬戶無法kill特權(quán)賬戶執(zhí)行的sql。
2.要有倒序,查看卡在第一個的sql,然后執(zhí)行kill
3.應(yīng)用停止之后,數(shù)據(jù)庫沒有新增的輸入輸出了,然后kill到lock表的ID就可以恢復(fù)了
其他解決方法:
MySQL中處理鎖表的常用方法有:
-
通過show processlist;命令查看是否有鎖表現(xiàn)象發(fā)生,分析找出發(fā)生鎖表的session進(jìn)程。
-
通過show engine innodb status\G;命令查看事務(wù)是否存在鎖等待。
-
通過增加索引優(yōu)化查詢改善鎖表情況。
-
終止或者重啟發(fā)生鎖表的session進(jìn)程??梢杂胟ill命令終止進(jìn)程的方式。
-
調(diào)整隔離級別參數(shù)lower_isolation_level,將數(shù)據(jù)庫隔離級別調(diào)低,使一些讀操作可以忽略鎖,從而減少鎖表概率。
-
調(diào)整innodb_lock_wait_timeout參數(shù),讓鎖等待超過指定秒數(shù)后返回錯誤而不是無限等待鎖。
-
對于主從數(shù)據(jù)庫,可以kill主庫sessionId后使請求被轉(zhuǎn)移到從庫上,避開主庫上的鎖。
綜上,MySQL通過參數(shù)調(diào)整、進(jìn)程管理、查詢優(yōu)化、讀寫分離等方式可以有效處理鎖表問題。
查看執(zhí)行過長的sql:
-- 統(tǒng)計前10個執(zhí)行時間最長的SQL語句
SELECTid,user,host,db,command,time,info
FROMinformation_schema.processlist
ORDER BYtime DESC
LIMIT 10;
notepad:
sqlyog不會主動切斷命令,需要到終端命令kill 進(jìn)程。