HBase 跨版本遷移總結帖
1. 問題來源
目前公司運維著兩個版本HBase,分別對應社區的94版本和1.1版本。從16年開始推廣新版本,新版本在功能和性能上都比94好,未來方向也在新版本上,所以有些業務需要從94版本升級到新版本,如何解決業務版本升級是團隊面臨的一個問題?
版本升級方案比較
版本升級有兩種方式,原地升級和遷移數據升級,原地升級就是直接在原來的集群從94版本升級到1.1版本,而另一種方式就是通過把數據從94版本遷移到新版本。
2. 原地升級
從94版本原地升級到1.1,需要升級HDFS和HBase,但是目前由于94版本比較低,從94升級到96的時候是沒有辦法滾動升級的,也就是說在升級期間業務肯定不能讀寫了。那么什么情況下適合原地升級?其實在雙11之前,我們就采用過原地升級的方式升級推薦搜索集群。推薦搜索比較特殊,除了是主備集群之外,整個業務可以控制數據推送,以及隨時切換流量的讀寫。所以,我們的任務就是在業務切換流量后,升級一個集群,完成之后升級另一個集群就可以。如果業務可以停止讀寫,那么原地升級是最簡單的。但是大多數情況下,業務都不能停止讀寫或者長時間不讀寫。
3.為什么需要跨版本實時同步數據 目前94版本是幾個業務共用一個集群,而且沒有主備,更要命的是有些業務要求升級,而有些不需要,因此數據遷移是唯一的方案。但是遷移數據不是簡單copy數據,除了跨版本之外,還涉及遷移原來數據和實時新增數據。找到一種方案解決跨版本遷移,包括遷移原來的數據是實時遷移數據,是解決整個問題的關鍵。
4.從同個版本數據遷移講起 同個版本遷移數據的時候,我們采用snapshot + replication的方式,客戶端只需要自己選擇時間切換就可以了。思路大概如下:兩個集群做好同步,在某一時刻,暫停同步,做snapshot,遷移數據,打開replication同步積壓的數據,完成。但是在新老版本之間是沒有辦法做replication的,怎么解決這個問題?搞過HBase的都知道replication的原理,主集群把日志發到從集群,從集群解析日志寫到主集群。那么我們只要想辦法改成寫到新版本就可以了,下面講一下我的方案(餿主意):
5. 實時跨版本replication數據
這里,我們依然需要一個備份集群,但是備份集群本身是不寫數據到自己的,只是做為一個橋梁。我們通過更改寫數據的方式,改成通過http服務寫到新版本的rest服務,由rest直接寫到新版本集群就可以。整個流程大概如下:
涉及的代碼也比較簡單,主要涉及一個類——ReplicationSink:
初始化的初始化rest服務
更改batch方法,寫到rest服務
6. 原來數據 遷移
目前嘗試了一下,在沒有改代碼的情況下是沒有辦法在HBase層面上通過snapshot從老版本遷移到新版本,所以只能從HDFS層面下手。因為數據是實時寫,我們只要做好同步之后,在某個時刻,暫定同步,flush數據,然后通過“暴力遷移”的方式解決:
7. 總結
相比于協調業務慢慢遷移,通過這種方式在DBA遷移好數據之后,業務自己選擇時間驗證數據之后切換客戶端就可以。當然還有其他方式,例如通過Export 和 Import 跑mr的方式。
如果你有更好的方式,或者這種方式考慮不周到的,歡迎討論。
來自:http://mp.weixin.qq.com/s/nwLOm5CX3WU92rG_TSeOhg