TIDB-Lightning筆記

TIDB-Lightning是什么

? ? ? ? 簡單來說TIDB Lightning是一個(gè)能把源數(shù)據(jù)快速全量導(dǎo)入到TIDB集群的工具。在這段描述中有三個(gè)重點(diǎn)單詞:快速、全量、TIDB集群,快速指的是TIDB Lightning的速度較快,在建議配置可以達(dá)到300G的速度,當(dāng)然實(shí)際的速度是取決于硬件的性能情況。全量指的是TIDB Lightning用來進(jìn)行全量數(shù)據(jù)的導(dǎo)入,比如在初始化TIDB集群的時(shí)候需要用到,TIDB Lightning不能用于增量數(shù)據(jù)的同步,如果需要使用增量數(shù)據(jù)可以使用dm進(jìn)行。

為什么要有TIDB Lightning

? ? ? ? 在做全量同步的時(shí)候可以使用的方式有很多,比如可以用DM中集成的DM工具也可以做全量的數(shù)據(jù)遷移,那么為什么還需要專門的一個(gè)TIDB Lightning工具做全量導(dǎo)入的。


使用SQL的全量導(dǎo)入流程

? ? ? ? 在使用SQL做全量遷移的過程中(比如使用mydumper)因?yàn)槎际峭ㄟ^insert語句方式進(jìn)行的導(dǎo)入,所以在導(dǎo)入過程中TIDB需要做大量的工作。比如:

????????需要保證ACID特性帶來的開銷;

????????region分裂過程中的開銷。因?yàn)樵谝婚_始的時(shí)候?qū)Ρ淼膇nsert基本都在一個(gè)region中完成,那么這個(gè)region很容易就就成為熱點(diǎn)region,寫入會(huì)密集的集中在某一個(gè)TIKV上面,這種情況下需要持續(xù)一段時(shí)間直到PD完成leader的調(diào)度工作,在一個(gè)大表寫入完成之后,新表的寫入也會(huì)發(fā)生上面提到的事情,這樣也就造成了性能的額外開銷。

? ? ? ? 另外就是在分層壓縮下導(dǎo)致的寫放大。

? ? ? ? 在使用SQL做全量導(dǎo)入的時(shí)候不免會(huì)發(fā)生上述的三個(gè)問題,那么怎么去解決這些問題呢?TIDB是一個(gè)高度分層的結(jié)構(gòu),既然走TIDB_Server層需要遇到acid的問題,而且我們主要也是在做數(shù)據(jù)的導(dǎo)入工作,沒有業(yè)務(wù)的活動(dòng),那么就可以通過繞過TIDB_SERVER層的方式解決事務(wù)的開銷。對(duì)于region熱點(diǎn)的問題就更容易解決了,可以通過預(yù)先分配region的方式解決。第三個(gè)問題也可以通過預(yù)先的排序降低TIKV壓縮時(shí)的復(fù)雜度來解決。TIDB Lightning就是為此而生的。

整體架構(gòu)


TIDB-Lightning架構(gòu)

? ? ? ? 在TIDB-Lightning結(jié)構(gòu)中,導(dǎo)入的過程主要有如下流程:

? ? ? ? ? ? Lightning對(duì)mydumper導(dǎo)出目錄進(jìn)行解析,篩選出DDL這些建表的語句。然后將執(zhí)行語句發(fā)送給TIDB_SERVER執(zhí)行。

? ? ? ? ? ? Lightning對(duì)表的insert語句進(jìn)行解析和編碼,通過kv編譯器轉(zhuǎn)換為KV,然后發(fā)給importer組件。

? ? ? ? ? ? importer組件進(jìn)行排序分裂、上傳數(shù)據(jù)到tikv等一系列的操作,最后進(jìn)行導(dǎo)入。


Lightning


Lightning架構(gòu)

? ? ? ? Lightning目前只能實(shí)現(xiàn)對(duì)mydumper導(dǎo)出,主要步驟有:

? ? ? ? ? ? 1、掃描。Lightning組件會(huì)首先對(duì)備份的文件進(jìn)行一次掃描,獲取表結(jié)構(gòu)定義數(shù)據(jù)和表數(shù)據(jù)(insert into),對(duì)于表結(jié)構(gòu)的定義語句會(huì)直接發(fā)送給TIDB_Server進(jìn)行處理。

? ? ? ? ? ? 2、建表。TIDB Server收到表結(jié)構(gòu)定義語句,進(jìn)行建表等操作。

? ? ? ? ? ? 3、解析表數(shù)據(jù)。在TIDB的整體結(jié)構(gòu)中,TIDB_Server負(fù)責(zé)對(duì)SQL進(jìn)行解析,在Lightning中會(huì)調(diào)用TIDB對(duì)sql文件進(jìn)行解析,這里的TIDBServer是本地的TIDB,寄存于Lightning的內(nèi)存中。Lightning 會(huì)直接使用 TiDB 實(shí)例來把 SQL 轉(zhuǎn)換為 KV 對(duì),這個(gè)就是圖中的KV解析器,同時(shí)Lightning還會(huì)把文件分割為默認(rèn)256M的區(qū)塊,以便并行執(zhí)行操作。

? ? ? ? ? ? 4、將解析編碼后的數(shù)據(jù)發(fā)送給importer

? ? ? ? Lightning的并發(fā)策略主要有如下三個(gè)參數(shù):

? ? ? ? ? ? index-concurreny=2

? ? ? ? ? ? table-concurreny=2

? ? ? ? ? ? region-concurreny=40

importer


importer結(jié)構(gòu)

? ? importer主要的工作:

? ? 1、排序。毫無疑問,從Lightning發(fā)送過來的kv肯定是一種無序的狀態(tài),importer首先要做的事情就是需要對(duì)kv進(jìn)行排序。importer直接使用rocksdb對(duì)數(shù)據(jù)進(jìn)行排序,在排序前會(huì)預(yù)先分配一定的空間,這些預(yù)先分配的空間可以叫engine file,每一個(gè)engine file都可以看成是一個(gè)rocksdb。排序的時(shí)候只需要把KV導(dǎo)入到這些engine file,rocksdb就可以幫助我們完成排序合并等一系列的操作。

2、預(yù)分配region。importer會(huì)根據(jù)要導(dǎo)入的數(shù)據(jù)范圍(這個(gè)時(shí)候已經(jīng)收到數(shù)據(jù)自然知道對(duì)于的范圍了)預(yù)先分配region,如果通知PD在導(dǎo)入前就完成pd的調(diào)度工作。這樣就避免了在導(dǎo)入過程中產(chǎn)生熱點(diǎn)region的問題。

3、上傳數(shù)據(jù)。如果importer排序(其實(shí)是rocksdb干的)后的文件均是一些sst文件,這些數(shù)據(jù)需要上傳到對(duì)應(yīng)的tikv上去。

4、將數(shù)據(jù)導(dǎo)入到raft-group中

后續(xù)工作

1、數(shù)據(jù)校驗(yàn)


2、統(tǒng)計(jì)分析、自增列id處理

? ? ? ? 對(duì)于自增列來說,因?yàn)閿?shù)據(jù)不是通過tidb是通過tivk直接導(dǎo)入的,那么自增列就存在一定的問題,如果不處理則可能導(dǎo)致唯一鍵沖突的問題。


部署需求

? ? ? TIKV的空間:

? ? ? ? ? ? ? ? 數(shù)據(jù)源大小*索引倍率(2)*副本數(shù)(3)*壓縮比(0.7)

? ? ? ? ? ? ? ? 數(shù)據(jù)源大小一般是不包含索引的,而編碼后會(huì)有索引。

? ? ? ? ? ? ? ? raft默認(rèn)有3個(gè)副本,所以需要*3

? ? ? ? ? ? ? ? TIKV會(huì)進(jìn)行數(shù)據(jù)的壓縮,建議按照0.7進(jìn)行計(jì)算

? ? ? ? TIKV的網(wǎng)絡(luò)需求:

? ? ? ? ? ? 建議使用萬兆網(wǎng)卡,另外需要注意如果所有的帶寬都被importer占用,那么會(huì)導(dǎo)致TIKV同PD的交互出現(xiàn)問題,PD可能會(huì)認(rèn)為節(jié)點(diǎn)已經(jīng)被下線,在使用千兆網(wǎng)卡的時(shí)候容易出現(xiàn),建議使用upload-speed-limit進(jìn)行網(wǎng)絡(luò)限制。

? ? ? ? Lightning硬件需求:

? ? ? ? ? ? 32+Cpu

? ??????????足夠儲(chǔ)存整個(gè)數(shù)據(jù)源的 SSD 硬盤,讀取速度越快越好

? ??????????使用萬兆網(wǎng)卡,帶寬需 300 MB/s 以上

? ??????????運(yùn)行過程默認(rèn)會(huì)打滿 CPU,建議單獨(dú)部署。如果必須同其他組件一同部署,需要配置region-concurrency?限制?tidb-lightning?的 CPU 使用

? ??????tikv-importer硬件要求:

? ??????????32+ 邏輯核 CPU

????????????40 GB+ 內(nèi)存

????????????1 TB+ SSD 硬盤,IOPS 越高越好(要求 ≥8000)

????????????硬盤必須大于最大的 N 個(gè)表的大小總和,其中 N = max(index-concurrency, table-concurrency)。

????????????使用萬兆網(wǎng)卡,帶寬需 300 MB/s 以上

????????????運(yùn)行過程中 CPU、I/O 和網(wǎng)絡(luò)帶寬都可能打滿,建議單獨(dú)部署。

? ? ?關(guān)于importer內(nèi)存的使用計(jì)算:

?????????(max-open-engines(8) ×?write-buffer-size?× 2) + (num-import-jobs?×?region-split-size?× 2)

? ? ? ? max-open-engines:

? ? ? ? write-buffer-size:數(shù)據(jù)刷到硬盤前能存于硬盤的上限

? ? ? ? num-import-jobs:導(dǎo)入認(rèn)為的并發(fā)數(shù)

? ???????region-split-size:把要導(dǎo)入的數(shù)據(jù)切分為這個(gè)大小的 Region,之所以要*2是因?yàn)橛袃蓚€(gè)列族(數(shù)據(jù)和索引)

機(jī)器不夠(混合部署)怎么辦

? ? ? ? 1、在Lightning上把region-concurrency設(shè)為分配給Lightning的cpu數(shù)量,建議為全體CPU的75%。

? ? ? ? 2、在importer上面,降低table-concurrency+index-concurrency的數(shù)量降低對(duì)磁盤的使用,這兩個(gè)參數(shù)分別是對(duì)表的并發(fā)處理數(shù)和索引的并發(fā)處理數(shù)量假設(shè)他們的值都為1,那么importer的空間只需要一張最大表大小就好了。

? ? ? ? 3、在importer上面降低num-import-jobs減少對(duì)cpu和內(nèi)存的使用

? ? ? ? 4、設(shè)置upload-speed-limit限制帶寬,帶寬不夠可能會(huì)導(dǎo)致pd獲取不到tikv的狀態(tài)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容