測試環境kudu集羣事故,影響:測試效果,測試進度,生產發佈延遲,需警戒,特此寫出過程
操做需謹慎!
操做需謹慎!
操做需謹慎!
任務環境都要以生產環境而對待!node
昨天於上午10點,業務說kudu表沒法使用後,影響測試,沒法正常發佈。去scm平臺發現kudu_tablet掛了5臺python
運維查看信息日誌後,作近一步處理服務器
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] 運維
而後重啓tablet-server後能夠啓動tablet-server,可是操做完以後,全部tablet-server部分分區塊不可用
具體截圖:ide
這時運維解決不了-上報平臺owner後處理工具
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
842 out of 1462 table(s) are not healthy測試
這裏就不貼了ui
如何處理這種狀況呢?優先考慮恢復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_'
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
從新使用命令檢查
修改系統文件句柄:ulimit -n 409600
修改集羣kudu句柄
重啓tablet-server
有多張表,不能訪問,可使用程序解析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()
在服務器上執行後
正在慢慢恢復,數據量比較大,就不截圖了。
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數據相對較多些,顯得不均衡。