背景
TiDB 是一個(gè)分布式關(guān)系型數(shù)據(jù)庫,可以無縫對(duì)接 MySQL。考慮到產(chǎn)品數(shù)據(jù)量大的情況下,單機(jī) MySQL 可能無法支撐,而無縫切換到 TiDB 集群也比較方便,所以領(lǐng)導(dǎo)讓我調(diào)研了一天遷移過程。
本文將記錄使用 mydumper 工具導(dǎo)出 MySQL 數(shù)據(jù)庫數(shù)據(jù),并使用 TiDB Lightning 將數(shù)據(jù)遷移到 TiDB 集群的流程。對(duì)比以前部署測(cè)試 MyCat 時(shí)的經(jīng)歷,發(fā)現(xiàn) TiDB 遷移時(shí)不需要配置分庫分表規(guī)則,遷移過程更方便,對(duì)得起“無縫”二字!
第一步,部署 TiDB Lightning
TiDB Lightning 部署包是一個(gè)壓縮文件,解壓后可直接使用,部署流程非常簡(jiǎn)單:
(一)確定 TiDB 版本
用 MySQL 客戶端連接到 TiDB 集群后,執(zhí)行 select version() 語句得到版本號(hào):
(二)下載工具包
根據(jù)版本號(hào),確定下載連接:https://download.pingcap.org/tidb-toolkit-{version}-linux-amd64.tar.gz 替換為具體的版本號(hào)后的地址。
下載文件:
wget https://download.pingcap.org/tidb-toolkit-v4.0.0-linux-amd64.tar.gz
(三)解壓
進(jìn)入部署包所在目錄,解壓:
tar -xzf tidb-toolkit-v4.0.0-linux-amd64.tar.gz
進(jìn)入解壓后的 bin 目錄,查看它提供的工具:
mydumper 和 tidb-lightning 就是一對(duì)導(dǎo)出、導(dǎo)入工具,其中 mydumper 跟 MySQL 的 mysqldump 功能是一樣的。
但是據(jù)我測(cè)試導(dǎo)出 3.9G 的數(shù)據(jù)耗時(shí)來看,mydumper 比 mysqldump 快很多。
建議使用 mydumper,原因是用它導(dǎo)出的數(shù)據(jù)時(shí),會(huì)自動(dòng)創(chuàng)建 xxx-schema-create.sql 建庫文件,而且建表和插入 SQL 文件分開,不用額外操作,配套用 tidb-lightning 執(zhí)行導(dǎo)入,不容易出錯(cuò)。
如果用 mysqldumper 則需要注意導(dǎo)出建庫語句,是否需要添加 use database 之類的語句,用 MySQL 的 source 導(dǎo)入時(shí)容易出現(xiàn)的問題,都需要注意。不是配套的工具,這種方式?jīng)]有測(cè)試過。
第二步,導(dǎo)出 MySQL 數(shù)據(jù)
進(jìn)入 bin 目錄,用 mydumper 工具,連接到目標(biāo)數(shù)據(jù)庫上導(dǎo)出,命令如下:
./mydumper -h IP -P 3306 -u root -p 123456 -t 16 -F 128 -B targetDatabase -o /tidb-data/mydumpersql/
參數(shù)說明:
- -B, --database 需要備份的數(shù)據(jù)庫
- -t,–threads 備份執(zhí)行的線程數(shù),默認(rèn)4個(gè)線程
- -F,–chunk-filesize 行塊分割表的文件大小,單位是MB
- -o,–outputdir 備份文件目錄
注意,最后一個(gè) outputdir 的值,后面導(dǎo)入的時(shí)候需要使用。因?yàn)槭褂枚嗑€程,所以就不難理解為何它的效率會(huì)比 mysqldumper 高了。
第三步,導(dǎo)入 TiDB 集群
最后一步,利用 tidb-lightning 工具將第二步導(dǎo)出的數(shù)據(jù),導(dǎo)入到 TiDB 集群中。
官網(wǎng)的操作流程不是很清楚,而且給出的 tidb-lightning 里面有一項(xiàng)配置對(duì) 4.0.0 版本來說會(huì)報(bào)錯(cuò),這里提供糾正后的完整配置。
(一)創(chuàng)建配置文件
在 bin 目錄下創(chuàng)建一個(gè)配置文件 tidb-lightning.toml【文件名稱任意】,并打開:
touch tidb-lightning.toml
vi tidb-lightning.toml
寫入如下配置信息:
[lightning]
# 轉(zhuǎn)換數(shù)據(jù)的并發(fā)數(shù),默認(rèn)為邏輯 CPU 數(shù)量,不需要配置。
# 混合部署的情況下可以配置為邏輯 CPU 的 75% 大小。
# region-concurrency =
# 日志
level = "info"
file = "tidb-lightning.log"
[tikv-importer]
# backend 設(shè)置為 local 模式
backend = "tidb"
# 設(shè)置本地臨時(shí)存儲(chǔ)路徑
# sorted-kv-dir = "/mnt/ssd/sorted-kv-dir"
[mydumper]
# Mydumper 源數(shù)據(jù)目錄。
data-source-dir = "/tidb-data/mydumpersql"
[tidb]
# 目標(biāo)集群的信息。tidb-server 的監(jiān)聽地址,填一個(gè)即可。
host = "192.168.xxx.xxx"
port = 4000
user = "root"
password = "root"
# 表架構(gòu)信息在從 TiDB 的“狀態(tài)端口”獲取。
status-port = 10080
# pd-server 的地址,填一個(gè)即可
# pd-addr = "192.168.xxx.xxx:2379"
說明:
- data-source-dir 就是第二步導(dǎo)出時(shí) -o 的參數(shù)值;
- host 是 TiDB 集群地址和端口;
- sorted-kv-dir 這個(gè)配置不支持,放開后會(huì)報(bào)錯(cuò):unknown configuration options: tikv-importer.sorted-kv-dir。
- pd-addr 這個(gè)配置沒啥用,去掉也不影響導(dǎo)入
(二)執(zhí)行導(dǎo)入命令
由于數(shù)據(jù)庫全量導(dǎo)入,操作耗時(shí)較長(zhǎng),官方建議將導(dǎo)入命令封裝成腳本。
先在 bin 目錄下創(chuàng)建一個(gè) loaddata.sh 文件,內(nèi)容如下:
#!/bin/bash
nohup ./tidb-lightning -config ./tidb-lightning.toml > nohup.out &
執(zhí)行腳本,然后查看 TiDB 的集群日志 tidb.log ,查看導(dǎo)入進(jìn)度。
導(dǎo)入完成后,用 MySQL 客戶端連接到 TiDB 集群的一個(gè)主機(jī),查看數(shù)據(jù)。
啟示錄
將 MySQL 數(shù)據(jù)遷移到 TiDB 的過程,直接參考官方文檔進(jìn)行操作就可以了。但是,涉及到 tidb-lightning 工具的那一章節(jié),內(nèi)容跟數(shù)據(jù)遷移章節(jié)有一些看不懂,其中涉及到 tikv-importer,它和 tidb-lightning 的關(guān)系沒有詳細(xì)說明,還有一些配置項(xiàng)會(huì)導(dǎo)致導(dǎo)入報(bào)錯(cuò)。
實(shí)踐證明,只用 tidb-lightning 工具就可以完成數(shù)據(jù)遷入過程。
去年 8 月份調(diào)研過 MyCat 集群,由于它的分片分庫規(guī)則比較復(fù)雜,而目前這個(gè)產(chǎn)品涉及的表比較多,而且很多都是動(dòng)態(tài)創(chuàng)建的,所以只做了技術(shù)調(diào)研,一直沒有技術(shù)落地。
MyCat 和 TiDB 都不會(huì)對(duì)應(yīng)用端代碼產(chǎn)生影響,JDBC 連接只需要修改 IP 和端口就好,幾乎沒有工作量。庫表遷移就不一樣了,TiDB 可以直接遷移。
MyCat 由于 Schema 和表創(chuàng)建涉及到分庫分表策略,需要自己設(shè)計(jì)數(shù)據(jù)分布規(guī)則,當(dāng)初也只是簡(jiǎn)單寫了一個(gè)生成配置的小程序,不敢保證能夠數(shù)據(jù)能夠無縫正確遷移。