記錄一次事故處理50%kudu表沒法進行正常訪問

記錄一次事故處理50%kudu表沒法進行正常訪問

測試環境kudu集羣事故,影響:測試效果,測試進度,生產發佈延遲,需警戒,特此寫出過程
操做需謹慎!
操做需謹慎!
操做需謹慎!

任務環境都要以生產環境而對待!node

事故緣由:

昨天於上午10點,業務說kudu表沒法使用後,影響測試,沒法正常發佈。去scm平臺發現kudu_tablet掛了5臺
記錄一次事故處理50%kudu表沒法進行正常訪問
記錄一次事故處理50%kudu表沒法進行正常訪問python

運維查看信息日誌後,作近一步處理服務器

1.重啓kudu—tablet發現沒法啓動

2.而後從新查看相關日誌

Check failed: _s.ok() Bad status: IO error: Unable to write consensus meta file for tablet e99481bc28d84bd69ccf328bed071d6b to path /data/ktwd/consensus-meta/e99481bc28d84bd69ccf328bed071d6b: Call to mkstemp() failed on name template /data/ktwd/consensus-meta/e99481bc28d84bd69ccf328bed071d6b.kudutmp.XXXXXX: Too many open files (error 24)F1219 1354 raft_consensus.cc:3052] 運維

3.發現文件句柄不夠影響io寫入,運維中止kudu_tablet,操做

記錄一次事故處理50%kudu表沒法進行正常訪問
記錄一次事故處理50%kudu表沒法進行正常訪問
而後重啓tablet-server後能夠啓動tablet-server,可是操做完以後,全部tablet-server部分分區塊不可用
具體截圖:ide

記錄一次事故處理50%kudu表沒法進行正常訪問

這時運維解決不了-上報平臺owner後處理工具

事故分析:

1.問相關運維如何操做的,查看相關記錄命令

記錄一次事故處理50%kudu表沒法進行正常訪問

2.查看kudu_tablet相關日誌

記錄一次事故處理50%kudu表沒法進行正常訪問

3.檢查kudu健康狀態

cluster
    ksck:檢查kudu集羣的健康
kudu cluster ksck <master_addresses> [-checksum_cache_blocks] [-checksum_scan] [-checksum_scan_concurrency=<concurrency>] [-nochecksum_snapshot] [-color=<color>] [-tables=<tables>] [-tablets=<tablets>] 
master_addresses:逗號分隔的master地址
checksum_cache_blocks:是否檢查掃描read blocks
checksum_scan:對集羣中的數據進行校驗和掃描
checksum_scan_concurrency:每一個ts設置多少掃描校驗執行器,默認4
color:輸出是否有顏色
tables:一個逗號分隔的檢查tables,空表示檢查全部tables
tablets:逗號分隔的tablets id,空表示檢查全部tablets

kudu cluster ksck cdh-02:7051,cdh-03:7051,cdh-04:7051
記錄一次事故處理50%kudu表沒法進行正常訪問
842 out of 1462 table(s) are not healthy測試

事故處理:

1.找出全部的有問題的kudu_table,並列出來

這裏就不貼了ui

2.如何修復此問題

如何處理這種狀況呢?優先考慮恢復tablet server。先查詢下有沒有節點tablet server服務已經關閉了,有的話,再先啓動tablet server服務。而後從新ksck一下,查看tablet副本的可用狀況狀況。
若是tablet server沒法恢復,能夠考慮下面的方法。下面的方法可能會致使對該tablet最近的修改數據丟失命令行

使用命令檢查
sudo -u kudu kudu cluster ksck cdh-02:7051,cdh-03:7051,cdh-04:7051 -tables='db_test.ods_'
記錄一次事故處理50%kudu表沒法進行正常訪問
kudu中,表由tablet組成。對於3副本的狀況,若是有2個副本所在的tablet Server不可獲取(TS unavailable),且其中一個不可獲取的副本爲leader。那麼會本tablet不能正常的訪問。
使用命令修復3d

使用到的kudu提供的命令行工具: kudu remote_replica unsafe_change_config7。

kudu remote_replica unsafe_change_config <tserver_address> <tablet_id> <peer uuids>…

sudo -u kudu kudu remote_replica unsafe_change_config cdh-04:7050 b8475299d46f47af9e68665db225af42 451c8b9e876c4099a9c1c1d0807f370a
#正常的tablet-server 要修復的tablet-id 正常的server-id

從新使用命令檢查
記錄一次事故處理50%kudu表沒法進行正常訪問

3.修改文件句柄

修改系統文件句柄:ulimit -n 409600
修改集羣kudu句柄
記錄一次事故處理50%kudu表沒法進行正常訪問

4.重啓tablet-server

重啓tablet-server

5.python腳本過濾條件批處理修復

有多張表,不能訪問,可使用程序解析ksck輸出的內容,批量處理生成修改一致性配置的命令,而後批量修改該命令

import re

#獲取tablet id
def search1(line):
    searchObj = re.match(r'Tablet (\w{32}) .+ not RUNNING',line)
    if searchObj:
        return searchObj.group(1)
    else:
        return None

#獲取running的server id 主機名
def search2(line):
    searchObj = re.match(r'(\w{32}) \(([\w|-]+):\d+\): RUNNING',line)
    #獲取正則匹配中()包含的信息
    if searchObj:
        return searchObj.group(1) + ',' + searchObj.group(2)
    else:
        return None
#讀取tablet-id.txt
with open('tablet-id.txt','r') as f :
    lists = f.readlines()
    #寫commond.txt
    f= open('commond.txt','w')
    #tablet server
    ts=''
    #tablet id
    ti=''
    #server id
    si=''
    command_pre='sudo -u kudu kudu remote_replica unsafe_change_config '
    #拼接後的命令
    command=''
    #匹配計數器
    cnt=0
    for i in lists:
        i = i.strip()
        #cnt爲0時查找 tablet id那行
        if cnt==0 and search1(i) is not None:
            ti = search1(i)
            cnt += 1
            continue
        #匹配tablet id以後的三行
        if cnt>0 :
            cnt += 1
            #匹配server running的行
            searchObj = search2(i)
            if searchObj is not None:
                #對返回結果server name和id進行拆分
                l=searchObj.split(',')
                si = l[0]
                ts = l[1]
            #四行都匹配完寫文件
            if cnt==4:
                if len(ts)>0 and len(ti)>0 and len(si)>0:
                    command = command_pre + ts + ' ' + ti + ' ' + si + '\n'
                    print command
                    f.write(command)
                cnt = 0
                ts=''
                ti=''
                si=''
    f.close()

記錄一次事故處理50%kudu表沒法進行正常訪問
在服務器上執行後
記錄一次事故處理50%kudu表沒法進行正常訪問
正在慢慢恢復,數據量比較大,就不截圖了。

總結

1.tablet server關閉時,tablet的移動(不能同時遷移2臺)

tablet server關閉時,tablet的移動。
本部分,是對本文內容的一個補充。

Tablet replicas are not tied to a UUID.Kudu doesn't do tablet re-balancing at runtime, so new tablet server will get tablets the next time a node dies or if you create new tables.8
​ 當一個tablet server被關閉超過必定的時間(默認5分鐘),位於tablet server上的tablet會被移動到其它的tablet server9。若是一個tablet server被關閉了很長時間,再啓動起來,位於本tablet server上的tablet數目可能不多。其它tablet server上的tablet數據相對較多些,顯得不均衡。

2.kudu文件句柄要設置根據本身業務量評估

3.kudu_tablet分區不能大於1500,大於1500後進行平衡或者擴容

4.kudu表的接入須要規範化

5.無效的kudu表進行下線

6.全部環境一視同仁

相關文章
相關標籤/搜索