tikv節點宕機(機器再起不來),或者數據節點被rm -rf 掉了怎麼辦
正常狀況下tikv節點down掉了。此時不要去執行store delete store_id 。數據通常能夠正常訪問,可是若是永久損壞的tikv節點。咱們總想要把它移除。如何移除呢?
(移除kv節點過程當中,若是kv節點健康在線,能夠實現動態移除。若是kv節點不可用,可能致使訪問數據的時候找不到region。【ERROR 9005 (HY000): Region is unavailable[try again later]】)
記移除一個損壞的tikv節點的過程:
一、動態移除kv節點
./pd-ctl -d -u http://192.168.100.73:4203 store delete 1
則該tikv節點狀態會變爲 "state_name": "Offline" 狀態。
執行 operator show 會看到後臺不少線程 transfer-peer 和 remove-peer 。
![](http://static.javashuo.com/static/loading.gif)
在此過程當中能夠先把故障節點的region 爲leader 的轉走先(理論上leader轉義走了能夠恢復正常,但實際並不必定):
scheduler add evict-leader-scheduler 1
調整做業調度的參數,加快region。(經過operator show能夠看到調度進程。)
config set leader-schedule-limit 10
config set region-schedule-limit 10
config set replica-schedule-limit 20
以下圖:咱們會看到leader_count 和region_count 慢慢在減小。
![](http://static.javashuo.com/static/loading.gif)
二、直至最後,有些region_count 一直不能自動transfer-peer 到別的kv節點。因此不能被
remove-peer。能夠採起手動移除的辦法:
(1):找出擁有損害kv節點的region。
pd-ctl -d -u http://192.168.100.73:4203 region check down-peer |grep -B 1 "start_key" |grep '"id":'|awk '{print "./pd-ctl -d -u http://192.168.100.73:4203 operator add remove-peer "$NF" 1"}'|sed s/,//g
(2):以上語句會生成以下相似的語句,執行之(1是store_id的id標誌。)。
./pd-ctl -d -u http://192.168.100.73:4203 operator add remove-peer 4743 1
./pd-ctl -d -u http://192.168.100.73:4203 operator add remove-peer 171058 1
./pd-ctl -d -u http://192.168.100.73:4203 operator add remove-peer 11642 1
./pd-ctl -d -u http://192.168.100.73:4203 operator add remove-peer 4419 1
在此查看損壞的kv節點的信息:
![](http://static.javashuo.com/static/loading.gif)
全部的region已經移除走,該kv節點已經不擁有任何region。理論上,此節點狀態應該變爲Tombstone。數據庫恢復正常。但實際上可能會出現查詢到壞的region節點。依然不正常。
![](http://static.javashuo.com/static/loading.gif)
怎麼辦呢?再次在pd工具下最新region。查看元數據信息,依然能夠看到某些屬於損壞kv的region。而且處於pendingpear狀態。說明移除的region處於掛起狀態,可能hung住:
![](http://static.javashuo.com/static/loading.gif)
這些損壞kv節點的pendingpears雖然不是leader 。可是依然影響tidb節點的數據操做,致使dml時候老報如下錯誤:
ERROR 9005 (HY000): Region is unavailable[try again later]
三、如何解決?啓用kv節點修復數據工具:
中止全部kv節點,執行如下語句。命令將一些失敗掉的機器從全部 Region 的 peers 列表中移除。這樣,這些 Region 即可以在 TiKV 重啓以後以剩下的健康的副本繼續提供服務了。這個命令經常用於多個 TiKV store 損壞或被刪除的狀況。此命令會致使數據丟失,但由於在集羣下咱們有至少3個副本。因此基本上一個kv節點損壞並不會致使數據丟失,可放心執行。
tikv-ctl --db /path/to/tikv/db unsafe-recover remove-fail-stores 1
執行完以上語句後。在pd工具下查看store信息:
"state_name": "Tombstone" 表示下線成功的 TiKV 節點
![](http://static.javashuo.com/static/loading.gif)
狀態信息說明:
Up Stores:正常運行的 TiKV 節點數量
Disconnect Stores:短期內通訊異常的 TiKV 節點數量
LowSpace Stores:剩餘可用空間小於 80% 的 TiKV 節點數量
Down Stores:中止工做的 TiKV 節點數量,若是大於 0,說明有節點不正常
Offline Stores:正在下線的 TiKV 節點數量(正在下線的 TiKV 節點還在提供服務)
Tombstone Stores:下線成功的 TiKV 節點數量
注:
若是集羣不可用,緊急恢復集羣,數據安全性不高。能夠直接執行
tikv-ctl --db /path/to/tikv/db unsafe-recover remove-fail-stores 1