一、硬件選型
1、測試環(huán)境推薦配置

2、生產(chǎn)環(huán)境推薦配置

3、 如果 tikv 服務(wù)器的 CPU及磁盤配置較高,可以考慮多實例部署,按照每個 tikv 實例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 配置較高的話,也可以考慮多實例部署,每個 tidb-server 分配20~32core,可以避免無謂的CPU上下文切換, 減少 system cpu 消耗。
5、pd 服務(wù)器的磁盤可以配置200~500G 的SSD 盤,主要用來保存源數(shù)據(jù)信息。在集群規(guī)模較大,源數(shù)據(jù)信息較多的時候,SSD 磁盤能夠避免源數(shù)據(jù)信息存取成為集群的瓶頸點。
二、部署安裝
1、操作系統(tǒng)版本要求
建議 centos 7.3及以上,支持 redhat 7.3版本及以上,不推薦其他版本的系統(tǒng)。
2、ansible、jinja 等軟件依賴包版本,只需要驗證中控機(jī)(運行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 的配置項 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ù)可以調(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ù)量 * 30%(多實例部署下配置,單實例部署不需要修改)
rocksdb writecf block-cache-size(GB)?= MEM * 80% / TiKV 實例數(shù)量 * 45%(多實例部署下配置,單實例部署不需要修改)
rocksdb lockcf block-cache-size(GB)?= MEM * 80% / TiKV 實例數(shù)量 * 2.5% (最小 128 MB)(多實例部署下配置,單實例部署不需要修改)
raftdb defaultcf block-cache-size(GB)?= MEM * 80% / TiKV 實例數(shù)量 * 2.5% (最小 128 MB)(多實例部署下配置,單實例部署不需要修改)
多實例情況下,需要修改?
readpool:
? coprocessor:
? high-concurrency
? normal-concurrency
? low-concurrency
三個參數(shù),推薦為實例數(shù)*參數(shù)值 = CPU 核數(shù) * 0.8。
?raftstore:
? ?capacity
?磁盤總?cè)萘?/ TiKV 實例數(shù)量,例如 “100GB”
修改完后,可以使用下面命令驗證
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)系原廠申請試用 lightning 工具,loader 導(dǎo)入數(shù)據(jù)平均速度是20G/小時,lightning 約為100~150G/小時
2、從 Oracle 遷移
目前有幾種方式可以參考
使用 OGG 做全量+增量同步
使用 Navicat Premium 版的 data transfer 功能,支持從 Oracle/SqlServer 遷移全量數(shù)據(jù)至 TiDB
通過 kafka 等消息隊列工具,解析 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,實時恢復(fù)采用商業(yè)版工具 reparo。
8、查看監(jiān)控數(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)計信息
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)計信息相關(guān),請參考:https://pingcap.com/docs-cn/sql/statistics/#統(tǒng)計信息簡介
五、常見問題
1、Transaction too large
TiDB 對于事務(wù)有限制,簡單來說以下幾點:
單個事務(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
長時間沒有訪問,也會收到這個報錯,一般是 tcp 超時導(dǎo)致的,tcp 長時間不用, 會被操作系統(tǒng) kill。