一祭刚、硬件選型
1、測試環(huán)境推薦配置
2、生產(chǎn)環(huán)境推薦配置
3、 如果 tikv 服務(wù)器的 CPU及磁盤配置較高扔亥,可以考慮多實(shí)例部署柒瓣,按照每個 tikv 實(shí)例16~20core + 64G 內(nèi)存 + 800G 磁盤的比例分配硬件資源褪秀。
同時需要注意 inventory.ini 及 ansible/conf/tikv.yml 的相關(guān)配置。
4捶牢、tidb 服務(wù)器視業(yè)務(wù)類型,如果業(yè)務(wù)邏輯有偏 AP 類的 SQL杏慰,需要考慮配置大內(nèi)存擎颖,防止出現(xiàn) OOM聋丝。
如果是純 TP 類業(yè)務(wù)焦读,tidb 服務(wù)器 CPU 配置較高的話,也可以考慮多實(shí)例部署羡亩,每個 tidb-server 分配20~32core瓦灶,可以避免無謂的CPU上下文切換眨层, 減少 system cpu 消耗捺疼。
5卧秘、pd 服務(wù)器的磁盤可以配置200~500G 的SSD 盤赶促,主要用來保存源數(shù)據(jù)信息鸥滨。在集群規(guī)模較大橘券,源數(shù)據(jù)信息較多的時候毯焕,SSD 磁盤能夠避免源數(shù)據(jù)信息存取成為集群的瓶頸點(diǎn)。
二、部署安裝
1蜀铲、操作系統(tǒng)版本要求
建議 centos 7.3及以上边琉,支持 redhat 7.3版本及以上,不推薦其他版本的系統(tǒng)记劝。
2变姨、ansible、jinja 等軟件依賴包版本厌丑,只需要驗(yàn)證中控機(jī)(運(yùn)行ansible 機(jī)器)上軟件版本滿足條件即可
中控機(jī):
ansible --version
ansible 2.5.0
pip -V
pip 8.1.2
pip show jinja2
Metadata-Version: 2.0
Name: Jinja2
Version: 2.10
pip show jmespath
Metadata-Version: 2.0
Name: jmespath
Version: 0.9.3
監(jiān)控機(jī)(grafana):
rpm -qa | grep fontconfig
fontconfig-2.10.95-11.el7.x86_64
rpm -qa | grep open-sans-fonts
open-sans-fonts-1.10-1.el7.noarch
3定欧、測試環(huán)境磁盤 IO 不滿足需求
ansible-playbook bootstrap.yml --extra-vars "dev_mode=True"
加上 dev_mode=True 可以在部署時,繞過系統(tǒng)磁盤相關(guān)的 benchmark
4怒竿、關(guān)閉防火墻砍鸠、開啟時鐘同步
systemctl status firewalld
systemctl status chronyd/ntpd
5、集群下所有服務(wù)器要配置不同的 hostname
如果否耕驰,可以編輯 inventory.ini 的配置項(xiàng) set_hostname=True 來自動修改 hostname
6爷辱、調(diào)整參數(shù)
參數(shù)在 ansible/conf/目錄下,tidb.yml,tikv.yml饭弓,常見的可能需要調(diào)整的參數(shù)
tidb.yml:
grpc-connection-count: 如果服務(wù)器 CPU 配置較高双饥,tikv 實(shí)例個數(shù)較多,該參數(shù)可以調(diào)整至20~32之間
slow-threshold:slow-query 記錄的閾值示启,默認(rèn)300ms
level:日志級別兢哭,默認(rèn) info,可以視情況調(diào)整為 debug 或 error
tikv.yml:
sync-log:raft-log sync配置夫嗓,默認(rèn)值true迟螺,對于磁盤 io 消耗較高,測試/非金融生產(chǎn)環(huán)境建議設(shè)置為 false
region-split-check-diff:檢測 region 分裂的閾值舍咖,非 SSD 磁盤建議調(diào)大至32MB
rocksdb defaultcf block-cache-size(GB)?= MEM * 80% / TiKV 實(shí)例數(shù)量 * 30%(多實(shí)例部署下配置矩父,單實(shí)例部署不需要修改)
rocksdb writecf block-cache-size(GB)?= MEM * 80% / TiKV 實(shí)例數(shù)量 * 45%(多實(shí)例部署下配置,單實(shí)例部署不需要修改)
rocksdb lockcf block-cache-size(GB)?= MEM * 80% / TiKV 實(shí)例數(shù)量 * 2.5% (最小 128 MB)(多實(shí)例部署下配置排霉,單實(shí)例部署不需要修改)
raftdb defaultcf block-cache-size(GB)?= MEM * 80% / TiKV 實(shí)例數(shù)量 * 2.5% (最小 128 MB)(多實(shí)例部署下配置窍株,單實(shí)例部署不需要修改)
多實(shí)例情況下,需要修改?
readpool:
? coprocessor:
? high-concurrency
? normal-concurrency
? low-concurrency
三個參數(shù)攻柠,推薦為實(shí)例數(shù)*參數(shù)值 = CPU 核數(shù) * 0.8球订。
?raftstore:
? ?capacity
?磁盤總?cè)萘?/ TiKV 實(shí)例數(shù)量,例如 “100GB”
修改完后瑰钮,可以使用下面命令驗(yàn)證
cat tidb-ansible/conf/tikv.yml |grep -Ev "^$|#"
無誤后執(zhí)行?
ansible-playbook rolling_update.yml --tags=tidb/tikv
滾動升級冒滩,tags 可選
7、官網(wǎng)有比較完善的在線+離線部署方案浪谴、在線升級指導(dǎo)开睡、在線擴(kuò)容縮容文檔,具體參考:
https://pingcap.com/docs-cn/op-guide/ansible-deployment/
https://pingcap.com/docs-cn/op-guide/offline-ansible-deployment/
https://pingcap.com/docs-cn/op-guide/ansible-deployment-scale/
三苟耻、數(shù)據(jù)遷移
1篇恒、從 MySQL 遷移
TiDB 兼容 MySQL 語法,小數(shù)據(jù)量建議直接使用 mysqldump凶杖、mydumper 來全量導(dǎo)出數(shù)據(jù)胁艰,再通過 source、myloader 的方式導(dǎo)入 TiDB官卡。
./bin/mydumper -h?127.0.0.1 -P?3306?-u root -t?16?-F?64?-B test -T t1,t2 --skip-tz-utc -o ./var/test
./bin/loader -h?127.0.0.1 -u root -P?4000?-t?32?-d ./var/test
詳情請參考:https://pingcap.com/docs-cn/op-guide/migration/#使用-mydumper-loader-全量導(dǎo)入數(shù)據(jù)
如果數(shù)據(jù)量較大蝗茁,超過幾百 G,可以聯(lián)系原廠申請?jiān)囉?lightning 工具寻咒,loader 導(dǎo)入數(shù)據(jù)平均速度是20G/小時哮翘,lightning 約為100~150G/小時
2、從 Oracle 遷移
目前有幾種方式可以參考
使用 OGG 做全量+增量同步
使用 Navicat Premium 版的 data transfer 功能毛秘,支持從 Oracle/SqlServer 遷移全量數(shù)據(jù)至 TiDB
通過 kafka 等消息隊(duì)列工具饭寺,解析 OGG 的日志阻课,開發(fā)寫入 TiDB/MySQL 的工具
目前我們也在積極跟專業(yè)的數(shù)據(jù)異構(gòu)平臺合作,爭取能夠盡快在更多的數(shù)據(jù)遷移工具中兼容 TiDB 數(shù)據(jù)源艰匙。
四限煞、常用操作
1、啟動集群
ansible-playbook start.yml --tags=tidb/tikv/pd
在正確的 ansible 目錄下员凝,確保 inventory.ini 里的配置正確署驻,tags 可選
2、停止集群
ansible-playbook stop.yml --tags=tidb/tikv/pd
在正確的 ansible 目錄下健霹,確保 inventory.ini 里的配置正確旺上,tags 可選
3、停止單個 tidb-server / tikv-server
ansible-playbook stop.yml --tags=tidb/tikv/pd -l IP
-l 后面接 inventory.ini 配置的IP 或別名
4糖埋、訪問 tidb
TiDB 兼容 MySQL 協(xié)議宣吱,所有連接 MySQL 的方式都適用于TiDB
mysql -uroot -h127.0.0.1 -P4000 -p
常見的圖形化界面工具,navicat 等都可以直接訪問 tidb
同時也支持jdbc瞳别、odbc 等征候,需要注意的是 mysql 8.0版本的客戶端,及 mariadb 客戶端可能存在兼容性問題祟敛,不建議使用
SQL 語法基本兼容 MySQL疤坝,某些不兼容的場景見:https://pingcap.com/docs-cn/sql/mysql-compatibility/#與-mysql-兼容性對比
5、修改參數(shù)
可以通過修改 tidb-ansible/conf/tidb.yml 配置文件馆铁,然后執(zhí)行
ansible-playbook rolling_update.yml --tags=tidb/tikv
也可以直接登錄服務(wù)器卒煞,找到deploy_dir/conf/tidb.toml,直接編輯文件叼架,然后 pkill tidb-server 來重啟服務(wù)
6、查看 tidb 版本信息
select tidb_version();
Release Version: v2.1.0-rc.3-24-g23f90a6
Git Commit Hash: 23f90a68be321e724280da6033a2b63ebf6cc7dd
Git Branch: HEAD
UTC Build Time: 2018-10-10 09:18:39
GoVersion: go version go1.11 linux/amd64
Race Enabled: false
TiKV Min Version: 2.1.0-alpha.1-ff3dd160846b7d1aed9079c389fc188f7f5ea13e
Check Table Before Drop: false
7衣撬、備份 tidb 數(shù)據(jù)
全量備份可以采用 mydumper乖订,增量備份需要開啟 binlog,實(shí)時恢復(fù)采用商業(yè)版工具 reparo具练。
8乍构、查看監(jiān)控?cái)?shù)據(jù)
在 ansible 的配置文件 inventory.ini 里,有一個監(jiān)控服務(wù)器的配置
[monitoring_servers]
10.1.163.87
deploy 的時候會默認(rèn)在這個配置服務(wù)器上部署 grafana 組件扛点,通過
http://10.1.163.87:3000admin/admin? 訪問
具體一些常見的監(jiān)控指標(biāo)哥遮,請參考:https://pingcap.com/docs-cn/op-guide/dashboard-overview-info/
9、收集統(tǒng)計(jì)信息
set @@tidb_build_stats_concurrency=20;
set @@tidb_distsql_scan_concurrency=100;
set @@tidb_index_serial_scan_concurrency=20;
analyze table xxx index xxx;
修改上面三個參數(shù)可以提升 scan 效率陵究。
具體統(tǒng)計(jì)信息相關(guān)眠饮,請參考:https://pingcap.com/docs-cn/sql/statistics/#統(tǒng)計(jì)信息簡介
五、常見問題
1铜邮、Transaction too large
TiDB 對于事務(wù)有限制仪召,簡單來說以下幾點(diǎn):
單個事務(wù)的SQL 語句數(shù)量不能超過5000寨蹋,( 在 tidb.yml 可配 stmt-count-limit )
單條 KV entry 不超過 6MB
KV entry 的總條數(shù)不超過 30w
KV entry 的總大小不超過 100MB
備注:假設(shè)某張表有4個索引,那么一條數(shù)據(jù)對應(yīng)的 kv entry 為數(shù)據(jù)+索引扔茅,一共5個kv 記錄已旧。
如果是批量 insert 或delete,建議先修改
set tidb_batch_insert = 1;?
set?tidb_batch_delete = 1;
update mysql.tidb set variable_value='24h' where variable_name='tikv_gc_life_time';
再執(zhí)行 SQL召娜。
如果是批量 update运褪,建議采用 limit 循環(huán)的方式執(zhí)行。
2玖瘸、GC life time is shorter than transaction duration
GC Life Time?間隔時間過短秸讹,長事務(wù)本應(yīng)讀到的數(shù)據(jù)可能被清理了,可使用如下命令增加?GC Life Time?:
update mysql.tidb set variable_value='30m' where variable_name='tikv_gc_life_time';
3店读、Lost connection to MySQL server during query
log 中是否有 panic
dmesg 中是否有 oom嗦枢,命令:?dmesg -T | grep -i oom
長時間沒有訪問,也會收到這個報(bào)錯屯断,一般是 tcp 超時導(dǎo)致的文虏,tcp 長時間不用, 會被操作系統(tǒng) kill。