下面是本次測(cè)試環(huán)境服務(wù)器的概況,一共四臺(tái)機(jī),其中三個(gè)KV妓笙。按照默認(rèn)的副本數(shù),一共有三個(gè)能岩,也就是說可以允許我的KV能掛掉一個(gè)而不影響業(yè)務(wù)寞宫。下面我們來測(cè)試一下三種的情況:
- 在三個(gè)kv的情況下,直接掛掉一個(gè)看下服務(wù)是否還正常拉鹃。
- 擴(kuò)容一個(gè)kv辈赋,看下regions和 leader的轉(zhuǎn)移的情況。
- 縮容一個(gè)kv膏燕,看下regions和 leader的轉(zhuǎn)移的情況钥屈,并查看能不能縮容成功。
組件 | CPU | 內(nèi)存 | IP地址 | 主機(jī)名 |
---|---|---|---|---|
TiDB | 2核+ | 4 GB+ | 192.168.113.20 | tidb01 |
PD | 2核+ | 4 GB+ | 192.168.113.20 | tidb01 |
TiKV | 2核+ | 4 GB+ | 192.168.113.21 | tikv01 |
TiKV | 2核+ | 4 GB+ | 192.168.113.22 | tikv02 |
TiKV | 2核+ | 4 GB+ | 192.168.113.23 | tikv03 |
1.1 模擬一個(gè)kv宕機(jī)的情況
我們的測(cè)試方法很簡(jiǎn)單坝辫,首先新建一個(gè)測(cè)試表并插入數(shù)據(jù)篷就;然后直接kill掉kv的進(jìn)程,模擬宕機(jī)近忙;然后再登錄TiDB看下數(shù)據(jù)是否還在竭业,能否做插入、刪除的操作银锻。
- 新建測(cè)試表永品,并插入數(shù)據(jù)做鹰。
use test;
create table tb_test1 (
id int,
user_name VARCHAR(20)
)
insert into tb_test1 VALUES (1,'test1');
insert into tb_test1 VALUES (2,'test2');
insert into tb_test1 VALUES (3,'test3');
select查詢確認(rèn)數(shù)據(jù)
select * from tb_test;
這時(shí)候我們看grafana的tv監(jiān)控頁(yè)面击纬,看到leader的分布是很不均勻的,這里我們不探討钾麸。下面我們把tikv_2給kill了看下更振。
-
kill掉tikv進(jìn)程模擬tikv掛掉的情況
在這里我們要kill的是tikv_2,這里剛好對(duì)應(yīng)的是我的tikv主機(jī)IP較小的那個(gè)(192.168.113.21)
ps aux |grep tikv-server|grep -v grep|awk '{print $2}'|xargs kill
這樣kill掉之后饭尝,很快tikv會(huì)自己重啟啟動(dòng)的肯腕,這樣的沒辦法很好地測(cè)試的。所以干脆钥平,我直接把tikv_1的服務(wù)器給shutdown了实撒,看下是什么樣的一個(gè)情況。
在grafana的監(jiān)控面板上我們可以看到有一個(gè)tikv down了,還有該服務(wù)器上的探測(cè)器知态。
我們看下tikv的leader的情況捷兰,可以看到已經(jīng)有部分的leader轉(zhuǎn)移到tikv_1和tikv_7上了,我們看下那個(gè)測(cè)試表的數(shù)據(jù)负敏。
在掛了一個(gè)kv的情況下贡茅,還是可以正常地插入和刪除數(shù)據(jù)的,也就是說TIDB還是正常運(yùn)作的其做。
select * from tb_test1;
insert into tb_test1 VALUES (4,'test4');
delete from tb_test1 where id=1;
select * from tb_test1;
測(cè)試結(jié)束后我們開啟虛擬機(jī)顶考,并重新把tikv01上的tikv的服務(wù)打開。
ansible-playbook start.yml -l 192.168.113.21
啟動(dòng)后我們還發(fā)現(xiàn)了kv的leader并沒有轉(zhuǎn)移回給tikv_2上妖泄,leader的分布還是很不均勻驹沿。
1.2 擴(kuò)容一個(gè)Tikv
這里我們新增一個(gè)kv,新增的一個(gè)虛擬機(jī)的配置情況如下
組件 | CPU | 內(nèi)存 | IP地址 | 主機(jī)名 |
---|---|---|---|---|
Tikv | 2核+ | 4 GB+ | 192.168.113.24 | tikv04 |
- 新增tikv實(shí)例
編輯hosts.ini以及inventory.ini文件蹈胡,增加一個(gè)tikv的IP地址甚负。
[servers]
192.168.113.20
192.168.113.21
192.168.113.22
192.168.113.23
192.168.113.24
...
[tikv_servers]
192.168.113.21
192.168.113.22
192.168.113.23
192.168.113.24
...
[monitored_servers]
192.168.113.20
192.168.113.21
192.168.113.22
192.168.113.23
192.168.113.24
...
使用ansible來初始化并部署tikv
#新建tidb用戶
ansible-playbook -i hosts.ini -l 192.168.113.24 create_users.yml -u root -k
#部署ntp服務(wù)
ansible-playbook -i hosts.ini -l 192.168.113.24 deploy_ntp.yml -u tidb -b
#初始化服務(wù)器配置
ansible-playbook bootstrap.yml -l 192.168.113.24
#部署tikv
ansible-playbook deploy.yml -l 192.168.113.24
#啟動(dòng)tikv
ansible-playbook start.yml -l 192.168.113.24
#更新 Prometheus 配置并重啟:
ansible-playbook rolling_update_monitor.yml --tags=prometheus
幾分鐘后我們就可以在grafana上看到新增的tikv實(shí)例了,我們看下他的實(shí)例名稱审残,以及l(fā)eader和regions的數(shù)量梭域。
從上圖我們可以看到新增的tikv的實(shí)例叫做tikv_2006,并且已經(jīng)有region轉(zhuǎn)移到這個(gè)實(shí)例上了搅轿,但是分布還是不均勻病涨,我們等待一段時(shí)間看下。
半個(gè)鐘之后璧坟,發(fā)現(xiàn)tikv_2006還只是獲得6個(gè)region既穆。這個(gè)問題我們后續(xù)再討論,這里繼續(xù)下面的縮容實(shí)驗(yàn)雀鹃。
1.3 縮容一個(gè)Tikv
現(xiàn)在我們有4個(gè)Tikv了幻工,下面我們縮容一個(gè),只保留三個(gè)黎茎。我們對(duì)實(shí)例名為tikv_1也就是192.168.113.22這臺(tái)服務(wù)器下手吧囊颅,縮容的過程也命令非常簡(jiǎn)單。
- 使用 pd-ctl 從集群中移除節(jié)點(diǎn):
查看 192.168.113.22節(jié)點(diǎn)的 store id傅瞻,查詢到的store id為1踢代,也就是tikv_1,這就是它的實(shí)例名稱嗅骄。
/home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://192.168.113.20:2379" -d store
從集群移除store id 為 1的tikv:
/home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://192.168.113.20:2379" -d store delete 1
使用 Grafana 或者 pd-ctl 檢查節(jié)點(diǎn)是否下線成功(下線需要一定時(shí)間胳挎,下線節(jié)點(diǎn)的狀態(tài)變?yōu)?Tombstone 就說明下線成功了,這個(gè)時(shí)間可能非常久):
/home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://192.168.113.20:2379" -d store 1
等待了幾分鐘,下線成功溺森。
下線成功后慕爬,停止192.168.113.22 上的服務(wù)窑眯,沒下線成功請(qǐng)不要進(jìn)行下面的操作,耐心等待医窿。
ansible-playbook stop.yml -l 192.168.113.22
編輯 inventory.ini 文件伸但,移除節(jié)點(diǎn)信息:
[tikv_servers]
192.168.113.21
#192.168.113.22
192.168.113.23
192.168.113.24
...
[monitored_servers]
192.168.113.20
192.168.113.21
#192.168.113.22
192.168.113.23
192.168.113.24
...
更新 Prometheus 配置并重啟:
ansible-playbook rolling_update_monitor.yml --tags=prometheus
打開瀏覽器訪問監(jiān)控平臺(tái):http://192.168.113.20:3000,監(jiān)控整個(gè)集群的狀態(tài)留搔。
1.4 處理 Tombstone Stores 監(jiān)控條目
在進(jìn)行tikv的縮容后更胖,grafana的頁(yè)面上會(huì)出現(xiàn)墓碑狀態(tài)數(shù)量為1的情況。在確認(rèn)下線之后隔显,我們還要處理這個(gè)監(jiān)控却妨,否則這里會(huì)干擾我們監(jiān)控的準(zhǔn)確性。一是這個(gè)狀態(tài)很礙眼括眠,明明我都下線成功了為什么這個(gè)狀態(tài)還沒有消除彪标;二是 Leader balance 和 Region Balance的判斷把墓碑狀態(tài)的實(shí)例數(shù)據(jù)也算進(jìn)去,導(dǎo)致這個(gè)數(shù)據(jù)一直都是100%掷豺。
去除這個(gè)監(jiān)控?cái)?shù)據(jù)的關(guān)鍵在于如何刪除pd上的墓碑節(jié)點(diǎn)捞烟,在舊版本(2.1.17及3.0.0版本)中,這樣的節(jié)點(diǎn)沒辦法刪除的当船,在新版本中我們可以使用pd-ctl工具進(jìn)行刪除题画。
./pd-ctl -u 192.168.113.20:2379 -d stores remove-tombstone
就這樣我們就可以把墓碑狀態(tài)的節(jié)點(diǎn)刪除了,但是刪除后 Leader balance和 Region Balance還沒有恢復(fù)正常德频,在prometheus中還是監(jiān)控到墓碑節(jié)點(diǎn)的數(shù)據(jù)苍息,最后重啟pd(生產(chǎn)環(huán)境下慎用)解決。