很多用戶在調(diào)研完 TiDB 之后,就會進(jìn)入測試環(huán)節(jié)缚窿,這里詳細(xì)描述一下硬件選型的相關(guān)考慮點(diǎn)丰辣。
測試環(huán)境
首先來談?wù)劀y試環(huán)境。如果是純兼容性驗(yàn)證翼闽,推薦官網(wǎng)上的 docker-compose 部署即可拾徙,后面會單獨(dú)列一份 docker 部署上可能會遇到的問題 list,不過一般來說感局,docker 部署都是比較簡單易用的尼啡。
如果希望有一些直觀上的印象,比如大概了解一下 tidb-ansible询微,各組件的啟停崖瞭,配置,日志等撑毛《潦眩可以申請一臺配置稍高點(diǎn)的虛擬機(jī),16C32G代态,將幾個組件都部署在同一臺服務(wù)器上寺惫,這樣也是可以 run 的,只是無法做高可用蹦疑、性能等相關(guān)測試西雀。
如果希望做一些功能測試驗(yàn)證,例如在線添加縮容節(jié)點(diǎn)歉摧,破壞性測試等艇肴,那么必須要滿足以下基本條件
1腔呜、tidb-server 至少兩臺服務(wù)器(虛機(jī))
2、tikv-server 至少三臺服務(wù)器(虛機(jī))再悼,注意是三臺獨(dú)立的服務(wù)器核畴,而不是三個 tikv 實(shí)例
3、pd-server 至少三臺服務(wù)器(虛機(jī)冲九,可以和 tidb-server 混合部署)
也就是至少五臺服務(wù)器谤草,當(dāng)然如果要測試添加節(jié)點(diǎn),得再準(zhǔn)備一臺服務(wù)器作為備用莺奸。如果想測試 tidb-server 的高可用丑孩,還得準(zhǔn)備 haproxy 的服務(wù)器(測試的話也可以和 tidb-server 混合部署)。
有些用戶會找過來灭贷,說你們的 pd 擴(kuò)容方案按照官網(wǎng)的操作失敗了温学,最后一查只有一臺 pd-server,添加到兩臺甚疟。這種由于 pd-server 內(nèi)部也組了一個 raft-group仗岖,它也得滿足多數(shù)派協(xié)議,所以只有一個 pd-server 的話是沒法 rolling_update 的览妖,只能先 stop 集群再 start 才可以箩帚。還有一些用戶只有兩臺服務(wù)器,上面部署了多個 tikv 實(shí)例黄痪,雖然看似滿足了3個 tikv 節(jié)點(diǎn)的需求,但是要知道如果在一臺服務(wù)器上部署多個 tikv 實(shí)例盔然,pd 的調(diào)度是不會把數(shù)據(jù)在這臺服務(wù)器上存儲多份的桅打,因?yàn)檫@樣對于高可用來說毫無意義。所以上面的要求是最低要求愈案,如果不滿足挺尾,就不要做相關(guān)的功能性測試,因?yàn)榻Y(jié)果一定是非預(yù)期的站绪。
生產(chǎn)環(huán)境
有些人可能會說遭铺,還會有一種測試場景,那就是性能測試恢准。對于 TiDB 來說魂挂,如果要測性能,那么兩大基本條件 SSD 磁盤 + 萬兆網(wǎng)絡(luò)是必須要滿足的馁筐,所以這個場景也一并歸納到生產(chǎn)環(huán)境來說吧涂召。
首先看看TiDB 集群各組件的功能
1、tidb-server?
主要負(fù)責(zé)接收 client 端的請求敏沉,解析并轉(zhuǎn)化為 kv-api 發(fā)送給 kv果正,同時也會承擔(dān)部分聚合計(jì)算的功能(如果計(jì)算無法下推炎码,或者需要對下推的結(jié)果集再次進(jìn)行計(jì)算的場景)。所以 tidb-server 的資源規(guī)劃就很明顯了秋泳,如果是典型的 TP 類場景潦闲,業(yè)務(wù)并發(fā)較高,但幾乎都是點(diǎn)查點(diǎn)寫迫皱,那么整個系統(tǒng)的瓶頸大概率先出現(xiàn)在 tidb-server歉闰,所以 tidb-server 的 cpu 高一點(diǎn),數(shù)量多一點(diǎn)是一個更好的選擇舍杜。如果是 AP 類場景新娜,業(yè)務(wù)并發(fā)較低(100以下),那么 tidb-server 的 cpu 不太可能成為瓶頸,選擇大一點(diǎn)的內(nèi)存會更好。
2缚柏、tikv-server?
主要負(fù)責(zé)數(shù)據(jù)的存儲捉腥,同時在 tikv-server 上有兩個進(jìn)程分別是 corprocessor 和 schedule 來負(fù)責(zé)處理讀寫請求,可以認(rèn)為 tikv 不僅僅是存儲節(jié)點(diǎn)奠涌,它也會負(fù)責(zé)(大)部分計(jì)算的功能。如果是 TP 類場景,查詢的瓶頸一般會先出現(xiàn)在 tidb 上衰粹,如果是寫入量較高,那么更多的 tikv 實(shí)例是更好的選擇笆怠,推薦是3的倍數(shù)铝耻。如果是 AP 類場景,需要更多 CPU蹬刷,內(nèi)存以及更多的 tikv 實(shí)例瓢捉。
3、pd-server?
主要負(fù)責(zé)兩個功能办成,一是全局唯一的事務(wù)號的分配泡态,二是整個集群的元數(shù)據(jù)信息。所以 pd-server 不需要太多的資源迂卢,8c32G 內(nèi)存某弦,200G 磁盤就可以,在集群規(guī)模較大元數(shù)據(jù)較多的情況下而克,推薦使用 SSD 磁盤靶壮。但是 pd-server 的穩(wěn)定性對于整個集群來說至關(guān)重要,所以推薦單獨(dú)的服務(wù)器部署 pd-server员萍,而且要有三個節(jié)點(diǎn)亮钦。
4、monitor-server?
主要負(fù)責(zé)監(jiān)控?cái)?shù)據(jù)的收集以及展示充活,如果節(jié)點(diǎn)數(shù)(tidb 實(shí)例 + tikv 實(shí)例 + pd 實(shí)例)數(shù)量超過10個蜂莉,推薦16c32G 及以上配置蜡娶,目前默認(rèn)保留15天的監(jiān)控?cái)?shù)據(jù),后面可能會調(diào)整為一個月或者更長映穗,磁盤空間按照2G 每個實(shí)例每15天來計(jì)算即可窖张。建議 monitor 服務(wù)器單獨(dú)部署,不要跟其他組件混合部署蚁滋,否則監(jiān)控?cái)?shù)據(jù)落盤的時候可能會引起資源競爭宿接,極端的情況遇到過影響到 pd,從而集群短時間不可用的案例辕录。
5睦霎、haproxy + keepalived (集群外組件)
主要負(fù)責(zé) tidb-server 的負(fù)載均衡及高可用切換,建議單獨(dú)部署走诞,根據(jù)業(yè)務(wù)并發(fā)量來申請配置副女,至少不低于8core,而且 haproxy 的配置文件中需要開啟多線程以及 timeout 時間調(diào)長蚣旱。
綜合來看碑幅,結(jié)論如下:
1、監(jiān)控服務(wù)器需要單獨(dú)部署塞绿,可以用虛機(jī)沟涨,推薦16c32G 及以上配置,可以用普通磁盤异吻,空間按照每個(tidb/ tikv/ pd)實(shí)例4GB /月來估算裹赴。
2、pd 服務(wù)器對于性能要求不高诀浪,但是需要穩(wěn)定棋返,所以推薦單獨(dú)部署8c16g200G SSD 磁盤即可,生產(chǎn)環(huán)境必須要部署3個 pd 節(jié)點(diǎn)笋妥。如果一定要混合部署,只能和 tidb 一起窄潭,并且要保證 tidb-server 的壓力不大春宣。否則一旦出現(xiàn) tidb 把服務(wù)器的 cpu 吃光,或者把內(nèi)存吃光出現(xiàn) oom嫉你,可能會影響到 pd月帝,甚至?xí)鹫麄€集群短時間不可用的情況。
3幽污、tikv 服務(wù)器必須獨(dú)立部署嚷辅,數(shù)據(jù)目錄必須為 SSD,如果為 Nvme 磁盤更好距误,如果是公有云服務(wù)器選擇本地 SSD 磁盤簸搞。tikv 服務(wù)器可以考慮多實(shí)例部署扁位,按照每個 tikv 實(shí)例 16core,64G 內(nèi)存趁俊,1.5T 的磁盤來配比即可域仇。最佳實(shí)踐是,例如服務(wù)器是2路12core 的 CPU 型號寺擂,打開超線程之后就是48core暇务,那么配置內(nèi)存最好是256G,同時配置3塊獨(dú)立的單塊容量不超過2T 的 Nvme 磁盤怔软。單臺服務(wù)器的數(shù)據(jù)目錄不能像 Hadoop 的存儲節(jié)點(diǎn)一樣配置幾十 T垦细,試想一下如果在線環(huán)境出現(xiàn)服務(wù)器下線的情況,十T 的數(shù)據(jù) rebalance 到其它節(jié)點(diǎn)挡逼,對于集群性能和時延的影響是很大的括改,這一點(diǎn)跟 Hadoop 的離線系統(tǒng)不太一樣。
4挚瘟、tikv 服務(wù)器的磁盤最好用 Nvme 磁盤叹谁,最多2個 tikv 實(shí)例共享一塊 Nvme 盤,如果是普通 SSD 磁盤乘盖,那么不管做不做 RAID焰檩,都不要出現(xiàn)多個 tikv 實(shí)例共享一塊磁盤的情況。如果是普通 SSD订框,可以考慮多塊盤做 RAID10的方式來增加隨機(jī)讀的 IOPS析苫,但是寫入的 IOPS 幾乎跟單盤類似,沒有明顯的提升穿扳。生產(chǎn)環(huán)境不推薦用 RAID0的方式衩侥,因?yàn)閾p壞1塊磁盤之后整個 RAID 組不可用,雖然 tikv 有多副本的機(jī)制能夠?qū)⒂绊懡档阶畹兔铮?tikv 的下線上線茫死,上 T 數(shù)據(jù)的遷移調(diào)度是會對性能和時延產(chǎn)生影響的。另外生產(chǎn)環(huán)境的數(shù)據(jù)庫服務(wù)器也不推薦 RAID5履羞,如果壞了一塊磁盤峦萎,對于寫入的影響非常大,而分布式系統(tǒng)存在木桶效應(yīng)忆首,如果某一個tikv 實(shí)例的寫入非常慢爱榔,會影響到整個集群的性能。所以結(jié)論就是糙及,要么不用 RAID详幽,要么用 RAID10,其他方式都不推薦,當(dāng)然首推 Nvme 磁盤唇聘,其次是 RAID10 的普通 SSD版姑。
5、tidb 服務(wù)器的 cpu 不需要太高雳灾,48c足夠漠酿,如果是 AP 業(yè)務(wù),內(nèi)存推薦128G 以上谎亩。磁盤幾乎沒有要求炒嘲,普通的機(jī)械盤即可,如果需要開啟binlog 功能匈庭,容量在1T 以內(nèi)也基本夠用了夫凸,如果規(guī)模比較大的集群需要導(dǎo)出數(shù)據(jù)或者做全量備份,推薦在指定的一個 tidb-server 上掛一個容量較大的外掛磁盤即可阱持。生產(chǎn)環(huán)境至少2臺 tidb-server夭拌,這樣前端接 haproxy / F5 才能保證高可用,如果業(yè)務(wù)并發(fā)較高衷咽,或者希望做多個業(yè)務(wù)側(cè)在計(jì)算層的資源隔離鸽扁,也可以按需規(guī)劃。
6镶骗、haproxy 需要獨(dú)立部署桶现,跟監(jiān)控服務(wù)器一樣,可以用虛機(jī)來做鼎姊,一般會部署兩臺服務(wù)器骡和,然后通過 keepalived 做高可用。因?yàn)楹蠖说?tidb-server 是無狀態(tài)的相寇,所以不需要擔(dān)心類似 MySQL 方案中的腦裂現(xiàn)象慰于。
7、有一些小的細(xì)節(jié)方面唤衫,例如 tikv 實(shí)例(非服務(wù)器)數(shù)量婆赠,推薦為3的整數(shù)倍,這是為了調(diào)度側(cè)考量佳励,如果非核心業(yè)務(wù)場景休里,可以關(guān)閉 tikv 的 sync_log 參數(shù),整體寫入性能應(yīng)該會有30%的提升植兰。
配置上面需要注意的地方
除了上面所說的這些除外份帐,下面列一些在日常支持中經(jīng)常遇到客戶配置錯誤的地方璃吧。
1楣导、標(biāo)簽
如果存在 tikv 多實(shí)例部署,或者跨機(jī)房部署集群的情況畜挨,一定要注意 label 的配置筒繁。而 label 除了在 inventory.ini 文件中噩凹,tikv 指定好別名和 labels 之外,還需要配置下面的參數(shù)
TiKV1-1 ansible_host=172.16.10.4 deploy_dir=/data1/deploy tikv_port=20171 labels="host=tikv1"?
## Group variables
[pd_servers:vars]
# location_labels = ["zone","rack","host"]
注意將上面的 location_labels 的注釋去掉毡咏,按需配置驮宴。如果在集群首次部署的時候沒有配置,那么通過 pd-ctl config set?location_labels "zone, rack, host" 也可以設(shè)置成功呕缭,具體可以參考官網(wǎng)的 FAQ堵泽,搜索 label。
2恢总、多實(shí)例部署時迎罗,需要將 CPU、內(nèi)存片仿、可用磁盤空間顯示的配置好纹安,具體參考官網(wǎng)部署集群的章節(jié)。默認(rèn)的配置文件是按照單實(shí)例來分配的砂豌,如果多實(shí)例不指定的話就會出現(xiàn) CPU 和內(nèi)存爭用的情況厢岂。
3、pd 調(diào)度 kv 節(jié)點(diǎn)的一個重要依據(jù)是阳距,各 tikv 節(jié)點(diǎn)數(shù)據(jù)目錄的使用率塔粒,如果手工在某一個 tikv 節(jié)點(diǎn)的 data 目錄下放置了一個大文件,可能會引起內(nèi)部的調(diào)度娄涩,將數(shù)據(jù)遷移走窗怒,最好避免這種情況的影響。
4蓄拣、在做集群 tikv 節(jié)點(diǎn)下線的過程中扬虚,offline 只是告訴 pd ,該節(jié)點(diǎn)需要進(jìn)入下線狀態(tài)球恤,把這個節(jié)點(diǎn)上的 leader 調(diào)度走的同時補(bǔ)全副本數(shù)辜昵,直到所有數(shù)據(jù)副本補(bǔ)全才會進(jìn)入 tombstone 狀態(tài),這時才能將這個 tikv 進(jìn)程停掉并清理數(shù)據(jù)咽斧。