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做全量遷移的過程中(比如使用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結(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目前只能實(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主要的工作:
? ? 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)。