天天看點

TiDB跨版本更新--新人首次嘗試?

作者: 天藍色的小九 ​

更新背景

  1. 原叢集版本過低,運維難度大,決定進行版本更新
  2. 經過測試發現,v5.4.0版本相對于v3.0.10版本性能有很大提升
  3. 決定将TiDB v3.0.10更新到TiDB v5.4.0

更新方式

本次更新采用Dumpling+Lighting+TiDB binlog進行

【更新方式劃分】 大體分為​​停機更新​​​ 與​​不停機更新​​ 根據字面意思了解,我們可以根據業務的要求來進行選擇,如果業務允許進行停機更新,那相對來說我們選擇停機更新 會更加的安全,快速,如果業務不允許停機的話我們主要選擇就是不停機更新

​​不停機更新​​ 根據官方文檔來看,需要通過特定方式來進行滾動更新 滾動更新對于我們來說或許是一個很好的選擇,但問題就是: 1、業務需求復原,我們的復原方案通常需要針對于全備+增量的方式來進行復原,復原進度較慢 2、因版本差距過大的話,連續進行滾動更新,不可控因素增多 3、老版本通常采用Ansible安裝,又想讓新版本适用tiup進行管理,操作起來較為複雜 #因為種種因素原因,最終決定采用Dumpling+Lightning+TiDB Binlog的方式,可以有效的規避一系列繁瑣問題。

  • 擷取相關資訊
  • 建立TiDB v5.3.0的目标叢集
  • Dumpling對原叢集進行資料導出
  • Lightning對目标叢集進行資料導入
  • 啟動Drainer進行增量同步
  • sync-diff-inspector進行資料校驗
  • 搭建復原鍊路
  • 切換業務

更新步驟

Ansible安裝3.0.8版本TiDB

一、在中控機上安裝系統依賴包
yum -y install epel-release git curl sshpass && \
yum -y install python2-pip      
二、在中控機上建立使用者,并生成SSH Key
1、建立使用者
useradd -m -d /home/tidb tidb

2、設定使用者密碼
passwd tidb

3、配置使用者sudo免密碼,将tidb ALL=(ALL) NOPASSWD: ALL 添加到檔案末尾即可
visudo
tidb ALL=(ALL) NOPASSWD: ALL

4、生成SSH Key
su - tidb
ssh-keygen -t rsa      
三、在中控機器上下載下傳TiDB Ansible
1、以建立的使用者登入中控機器并進入到/home/tidb目錄,使用指令從TiDB Ansible項目上下載下傳相應版本
git clone -b 版本 https://github.com/pingcap/tidb-ansible.git
#部署和更新 TiDB 叢集需使用對應的 tidb-ansible 版本,通過改 inventory.ini 檔案中的版本來混用可能會産生一些錯誤。
#請務必按文檔操作,将 tidb-ansible 下載下傳到 /home/tidb 目錄下,權限為 tidb 使用者,不要下載下傳到 /root 下,否則會遇到權限問題。      
四、在中控機器上安裝TiDB Ansible及其依賴
1、在中控機器上安裝TiDB Ansible及其依賴
cd /home/tidb/tidb-ansible && \
sudo pip install -r ./requirements.txt

2、檢視Ansible的版本
ansible --version      
五、在中控機器上配置部署機器SSH互信及sudo規則
1、将部署的目标機器ip添加到hosts.ini檔案的[servers]區塊下
cd /home/tidb/tidb-ansible && \
vi hosts.ini

[servers]
172.16.10.1
172.16.10.2
172.16.10.3
172.16.10.4
172.16.10.5
172.16.10.6

[all:vars]
username = tidb
ntp_server = pool.ntp.org

2、執行指令,按提示輸入部署目标機器的root使用者密碼
ansible-playbook -i hosts.ini create_users.yml -u root -k      
六、在部署目标機器上安裝NTP服務
1、登入中控機器執行指令
cd /home/tidb/tidb-ansible && \
ansible-playbook -i hosts.ini deploy_ntp.yml -u tidb -b

#該步驟将在部署目标機器上使用系統自帶軟體源聯網安裝并啟動 NTP 服務,服務使用安裝包預設的 NTP server 清單,見配置檔案 /etc/ntp.conf 中 server 參數。如果使用預設的 NTP server,你的機器需要連接配接外網。

#為了讓 NTP 盡快開始同步,啟動 NTP 服務前,系統會執行 ntpdate 指令,與使用者在 hosts.ini 檔案中指定的 ntp_server 同步日期與時間。預設的伺服器為 pool.ntp.org,也可替換為你的 NTP server。      
七、在部署的目标機器上配置CPUfreq調節器模式
#為了讓 CPU 發揮最大性能,請将 CPUfreq 調節器模式設定為 performance 模式。
1、檢視系統支援的調節器模式
cpupower frequency-info --governors
#如果傳回 Not Available,表示目前系統不支援配置 CPUfreq,跳過該步驟即可。

2、檢視系統目前的CPUfreq調節器模式
cpupower frequency-info --policy

3、修改調節器模式
(1)使用cpupower frequency-set --governor指令來修改
cpupower frequency-set --governor performance
(2)使用指令在部署目标機器上批量設定
ansible -i hosts.ini all -m shell -a "cpupower frequency-set --governor performance" -u tidb -b      
八、在部署的目标機器上添加資料盤ext4檔案系統挂在參數
#使用 root 使用者登入目标機器,将部署目标機器資料盤格式化成 ext4 檔案系統,挂載時添加 nodelalloc 和 noatime 挂載參數。nodelalloc 是必選參數,否則 Ansible 安裝時檢測無法通過;noatime 是可選建議參數

#如果你的資料盤已經格式化成 ext4 并挂載了磁盤,可先執行 umount /dev/nvme0n1p1 指令解除安裝,從編輯 /etc/fstab 檔案步驟開始執行,添加挂載參數重新挂載即可。
1、檢視資料盤
fdisk -l

2、建立分區表
parted -s -a optimal /dev/nvme0n1 mklabel gpt -- mkpart primary ext4 1 -1

3、格式化檔案系統
mkfs.ext4 /dev/nvme0n1p1

4、檢視資料盤分區UUID
lsblk -f

5、編輯/etc/fstab檔案,添加nodelalloc參數
vi /etc/fstab
UUID=第4步檢視到的ID /data1 ext4 defaults,nodelalloc,noatime 0 2

6、挂載資料盤
mkdir /data1 && \
mount -a

7、執行以下指令,如果檔案系統為ext4,并且挂載參數中包含nodelalloc,則表示生效
mount -t ext4
/dev/nvme0n1p1 on /data1 type ext4 (rw,noatime,nodelalloc,data=ordered)      
九、編輯inventory.ini檔案,配置設定機器資源
#請使用内網 IP 來部署叢集,如果部署目标機器 SSH 端口非預設的 22 端口,需添加 ansible_port 變量,如 TiDB1 ansible_host=172.16.10.1 ansible_port=5555。
1、單機單TiKV執行個體叢集拓撲
Name  Host IP              Services
node1 172.16.10.1          PD1, TiDB1
node2 172.16.10.2          PD2, TiDB2
node3 172.16.10.3          PD3
node4 172.16.10.4          TiKV1
node5 172.16.10.5          TiKV2
node6 172.16.10.6          TiKV3

[tidb_servers]
172.16.10.1
172.16.10.2

[pd_servers]
172.16.10.1
172.16.10.2
172.16.10.3

[tikv_servers]
172.16.10.4
172.16.10.5
172.16.10.6

[monitoring_servers]
172.16.10.1

[grafana_servers]
172.16.10.1

[monitored_servers]
172.16.10.1
172.16.10.2
172.16.10.3
172.16.10.4
172.16.10.5
172.16.10.6

2、單機多TiKV執行個體叢集拓撲
Name  Host IP     Services
node1 172.16.10.1   PD1, TiDB1
node2 172.16.10.2   PD2, TiDB2
node3 172.16.10.3   PD3
node4 172.16.10.4   TiKV1-1, TiKV1-2
node5 172.16.10.5   TiKV2-1, TiKV2-2
node6 172.16.10.6   TiKV3-1, TiKV3-2

[tidb_servers]
172.16.10.1
172.16.10.2

[pd_servers]
172.16.10.1
172.16.10.2
172.16.10.3

# 注意:要使用 TiKV 的 labels,必須同時配置 PD 的 location_labels 參數,否則 labels 設定不生效。
[tikv_servers]
TiKV1-1 ansible_host=172.16.10.4 deploy_dir=/data1/deploy tikv_port=20171 labels="host=tikv1"
TiKV1-2 ansible_host=172.16.10.4 deploy_dir=/data2/deploy tikv_port=20172 labels="host=tikv1"
TiKV2-1 ansible_host=172.16.10.5 deploy_dir=/data1/deploy tikv_port=20171 labels="host=tikv2"
TiKV2-2 ansible_host=172.16.10.5 deploy_dir=/data2/deploy tikv_port=20172 labels="host=tikv2"
TiKV3-1 ansible_host=172.16.10.6 deploy_dir=/data1/deploy tikv_port=20171 labels="host=tikv3"
TiKV3-2 ansible_host=172.16.10.6 deploy_dir=/data2/deploy tikv_port=20172 labels="host=tikv3"

# 部署 3.0 版本的 TiDB 叢集時,多執行個體場景需要額外配置 status 端口,示例如下:
# TiKV1-1 ansible_host=172.16.10.4 deploy_dir=/data1/deploy tikv_port=20171 tikv_status_port=20181 labels="host=tikv1"
# TiKV1-2 ansible_host=172.16.10.4 deploy_dir=/data2/deploy tikv_port=20172 tikv_status_port=20182 labels="host=tikv1"
# TiKV2-1 ansible_host=172.16.10.5 deploy_dir=/data1/deploy tikv_port=20171 tikv_status_port=20181 labels="host=tikv2"
# TiKV2-2 ansible_host=172.16.10.5 deploy_dir=/data2/deploy tikv_port=20172 tikv_status_port=20182 labels="host=tikv2"
# TiKV3-1 ansible_host=172.16.10.6 deploy_dir=/data1/deploy tikv_port=20171 tikv_status_port=20181 labels="host=tikv3"
# TiKV3-2 ansible_host=172.16.10.6 deploy_dir=/data2/deploy tikv_port=20172 tikv_status_port=20182 labels="host=tikv3"

[monitoring_servers]
172.16.10.1

[grafana_servers]
172.16.10.1

[monitored_servers]
172.16.10.1
172.16.10.2
172.16.10.3
172.16.10.4
172.16.10.5
172.16.10.6

# 注意:為使 TiKV 的 labels 設定生效,部署叢集時必須設定 PD 的 location_labels 參數。
[pd_servers:vars]
location_labels = ["host"]

3、服務配置檔案參數調整
#多執行個體情況下,需要修改 tidb-ansible/conf/tikv.yml 中 block-cache-size 下面的 capacity 參數:
storage:
  block-cache:
    capacity: "1GB"
#TiKV 執行個體數量指每個伺服器上 TiKV 的程序數量。
#推薦設定:capacity = MEM_TOTAL * 0.5 / TiKV 執行個體數量

#多執行個體情況下,需要修改 tidb-ansible/conf/tikv.yml 中 high-concurrency、normal-concurrency 和 low-concurrency 三個參數:
readpool:
  coprocessor:
    # Notice: if CPU_NUM > 8, default thread pool size for coprocessors
    # will be set to CPU_NUM * 0.8.
    # high-concurrency: 8
    # normal-concurrency: 8
    # low-concurrency: 8
#推薦配置:TiKV 執行個體數量 * 參數值 = CPU 核心數量 * 0.8

#如果多個 TiKV 執行個體部署在同一塊實體磁盤上,需要修改 conf/tikv.yml 中的 capacity 參數:
raftstore:
  capacity: 0
#推薦配置:capacity = 磁盤總容量 / TiKV 執行個體數量,例如:capacity: "100GB"。      
十、調整inventory.ini檔案中的變量
1、調整部署目錄
#部署目錄通過 deploy_dir 變量控制,預設全局變量已設定為 /home/tidb/deploy,對所有服務生效。如資料盤挂載目錄為 /data1,可設定為 /data1/deploy,樣例如下
## Global variables
[all:vars]
deploy_dir = /data1/deploy
#如為某一服務單獨設定部署目錄,可在配置服務主機清單時配置主機變量,以 TiKV 節點為例,其他服務類推,請務必添加第一列别名,以免服務混布時混淆
TiKV1-1 ansible_host=172.16.10.4 deploy_dir=/data1/deploy      

2、調節其他變量(可選)

#以下控制變量開啟請使用首字母大寫 ​

​True​

​​,關閉請使用首字母大寫 ​

​False​

變量 含義

​cluster_name​

叢集名稱,可調整

​tidb_version​

TiDB 版本,TiDB Ansible 各分支預設已配置

​process_supervision​

程序監管方式,預設為 ​

​systemd​

​​,可選 ​

​supervise​

​timezone​

新安裝 TiDB 叢集第一次啟動 bootstrap(初始化)時,将 TiDB 全局預設時區設定為該值。TiDB 使用的時區後續可通過 ​

​time_zone​

​​ 全局變量和 session 變量來修改,參考​​時區支援​​​。預設為 ​

​Asia/Shanghai​

​​,可選值參考 ​​timzone 清單​​。

​enable_firewalld​

開啟防火牆,預設不開啟,如需開啟,請将​​部署建議-網絡要求​​ 中的端口加入白名單

​enable_ntpd​

檢測部署目标機器 NTP 服務,預設為 ​

​True​

​,請勿關閉

​set_hostname​

根據 IP 修改部署目标機器主機名,預設為 ​

​False​

​enable_binlog​

是否部署 Pump 并開啟 binlog,預設為 ​

​False​

​​,依賴 Kafka 叢集,參見 ​

​zookeeper_addrs​

​ 變量

​zookeeper_addrs​

binlog Kafka 叢集的 zookeeper 位址

​deploy_without_tidb​

KV 模式,不部署 TiDB 服務,僅部署 PD、TiKV 及監控服務,請将 ​

​inventory.ini​

​​ 檔案中 ​

​tidb_servers​

​ 主機組的 IP 設定為空。

​alertmanager_target​

可選:如果你已單獨部署 alertmanager,可配置該變量,格式:​

​alertmanager_host:alertmanager_port​

​grafana_admin_user​

Grafana 管理者帳号使用者名,預設為 admin

​grafana_admin_password​

Grafana 管理者帳号密碼,預設為 admin,用于 Ansible 導入 Dashboard 和建立 API Key,如後期通過 grafana web 修改了密碼,請更新此變量

​collect_log_recent_hours​

采集日志時,采集最近幾個小時的日志,預設為 2 小時

​enable_bandwidth_limit​

在中控機上從部署目标機器拉取診斷資料時,是否限速,預設為 ​

​True​

​​,與 ​

​collect_bandwidth_limit​

​ 變量結合使用

​collect_bandwidth_limit​

在中控機上從部署目标機器拉取診斷資料時限速多少,機關: Kbit/s,預設 10000,即 10Mb/s,如果是單機多 TiKV 執行個體部署方式,需除以單機執行個體個數

​prometheus_storage_retention​

Prometheus 監控資料的保留時間(預設為 30 天);2.1.7、3.0 以及之後的 tidb-ansible 版本中,​

​group_vars/monitoring_servers.yml​

​ 檔案裡新增的配置
十一、部署TiDB叢集
#ansible-playbook 執行 Playbook 時,預設并發為 5。部署目标機器較多時,可添加 -f 參數指定并發數,例如 ansible-playbook deploy.yml -f 10。以下示例使用 tidb 使用者作為服務運作使用者:
1、在 tidb-ansible/inventory.ini 檔案中,确認 ansible_user = tidb
## Connection
# ssh via normal user
ansible_user = tidb
#不要将 ansible_user 設定為 root 使用者,因為 tidb-ansible 限制了服務以普通使用者運作。
執行以下指令,如果所有server傳回tidb,表示SSH互信配置成功:
ansible -i inventory.ini all -m shell -a 'whoami'
執行以下指令,如果所有server傳回root,表示tidb使用者sudo免密碼配置成功
ansible -i inventory.ini all -m shell -a 'whoami' -b

2、執行local_prepare.yml playbook,聯網下載下傳 TiDB binary 到中控機。
ansible-playbook local_prepare.yml

3、初始化系統環境,修改核心參數。
ansible-playbook bootstrap.yml

4、部署 TiDB 叢集軟體。
ansible-playbook deploy.yml
#Grafana Dashboard 上的 Report 按鈕可用來生成 PDF 檔案,此功能依賴 fontconfig 包和英文字型。如需使用該功能,登入 grafana_servers 機器,用以下指令安裝:
>
sudo yum install fontconfig open-sans-fonts

5、啟動TiDB叢集
ansible-playbook start.yml      
十二、測試叢集
#TiDB 相容 MySQL,是以可使用 MySQL 用戶端直接連接配接 TiDB。推薦配置負載均衡以提供統一的 SQL 接口。
1、使用 MySQL 用戶端連接配接 TiDB 叢集。TiDB 服務的預設端口為 4000。
mysql -u root -h 172.16.10.1 -P 4000

2、通過浏覽器通路監控平台
位址:http://ip:端口
預設帳号與密碼:admin;admin      

使用TiUP部署TiDB5.4.0叢集

一、在TiKV部署目标機器上添加資料盤EXT4檔案系統挂載參數
#使用 root 使用者登入目标機器,将部署目标機器資料盤格式化成 ext4 檔案系統,挂載時添加 nodelalloc 和 noatime 挂載參數。nodelalloc 是必選參數,否則 TiUP 安裝時檢測無法通過;noatime 是可選建議參數。
1、檢視資料盤
fdisk -l

2、建立分區
parted -s -a optimal /dev/nvme0n1 mklabel gpt -- mkpart primary ext4 1 -1
#使用 lsblk 指令檢視分區的裝置号:對于 nvme 磁盤,生成的分區裝置号一般為 nvme0n1p1;對于普通磁盤(例如 /dev/sdb),生成的分區裝置号一般為 sdb1

3、格式化檔案系統
mkfs.ext4 /dev/nvme0n1p1

4、檢視資料盤分區UUID
lsblk -f

5、編輯 /etc/fstab 檔案,添加 nodelalloc 挂載參數。
vi /etc/fstab
UUID=第四步查的UUID /data1 ext4 defaults,nodelalloc,noatime 0 2

6、挂載資料盤
mkdir /data1 && \
mount -a

7、執行指令,如果檔案系統為 ext4,并且挂載參數中包含 nodelalloc,則表示已生效。
mount -t ext4      
二、檢測及關閉系統swap
echo "vm.swappiness = 0">> /etc/sysctl.conf
swapoff -a && swapon -a
sysctl -p
#一起執行 swapoff -a 和 swapon -a 指令是為了重新整理 swap,将 swap 裡的資料轉儲回記憶體,并清空 swap 裡的資料。不可省略 swappiness 設定而隻執行 swapoff -a;否則,重新開機後 swap 會再次自動打開,使得操作失效。
#執行 sysctl -p 指令是為了在不重新開機的情況下使配置生效      
三、檢測即關閉目标部署機器的防火牆
1、檢查防火牆狀态
sudo firewall-cmd --state
sudo systemctl status firewalld.service

2、關閉防火牆服務
sudo systemctl stop firewalld.service

3、關閉防火牆自動啟動服務
sudo systemctl disable firewalld.service

4、檢查防火牆狀态
sudo systemctl status firewalld.service      
四、檢測及安裝NTP服務
1、執行以下指令,如果輸出running表示NTP服務正在運作
sudo systemctl status ntpd.service

ntpd.service - Network Time Service
Loaded: loaded (/usr/lib/systemd/system/ntpd.service; disabled; vendor preset: disabled)
Active: active (running) since 一 2017-12-18 13:13:19 CST; 3s ago
#若傳回報錯資訊 Unit ntpd.service could not be found.,請嘗試執行以下指令,以檢視與 NTP 進行時鐘同步所使用的系統配置是 chronyd 還是 ntpd
sudo systemctl status chronyd.service
#若發現系統既沒有配置 chronyd 也沒有配置 ntpd ,則表示系統尚未安裝任一服務。此時,應先安裝其中一個服務,并保證它可以自動啟動,預設使用 ntpd
#如果你使用的系統配置是 chronyd,請直接執行步驟 3。

2、執行 ntpstat 指令檢測是否與 NTP 伺服器同步
ntpstat
#如果輸出 synchronised to NTP server,表示正在與 NTP 伺服器正常同步
synchronised to NTP server (85.199.214.101) at stratum 2
time correct to within 91 ms
polling server every 1024 s
#以下情況表示 NTP 服務未正常同步:
unsynchronised
#以下情況表示 NTP 服務未正常運作:
Unable to talk to NTP daemon. Is it running?

3、執行 chronyc tracking 指令檢視 Chrony 服務是否與 NTP 伺服器同步。
#該操作僅适用于使用 Chrony 的系統,不适用于使用 NTPd 的系統
chronyc tracking
#如果該指令傳回結果為 Leap status : Normal,則代表同步過程正常
Reference ID    : 5EC69F0A (ntp1.time.nl)
Stratum         : 2
Ref time (UTC)  : Thu May 20 15:19:08 2021
System time     : 0.000022151 seconds slow of NTP time
Last offset     : -0.000041040 seconds
RMS offset      : 0.000053422 seconds
Frequency       : 2.286 ppm slow
Residual freq   : -0.000 ppm
Skew            : 0.012 ppm
Root delay      : 0.012706812 seconds
Root dispersion : 0.000430042 seconds
Update interval : 1029.8 seconds
Leap status     : Normal
#如果該指令傳回結果如下,則表示同步過程出錯:
Leap status    : Not synchronised
#如果該指令傳回結果如下,則表示 Chrony 服務未正常運作:
506 Cannot talk to daemon
#如果要使 NTP 服務盡快開始同步,執行以下指令。可以将 pool.ntp.org 替換為你的 NTP 伺服器:
sudo systemctl stop ntpd.service && \
sudo ntpdate pool.ntp.org && \
sudo systemctl start ntpd.service
#如果要在 CentOS 7 系統上手動安裝 NTP 服務,可執行以下指令:
sudo yum install ntp ntpdate && \
sudo systemctl start ntpd.service && \
sudo systemctl enable ntpd.service      
五、檢查和配置作業系統優化參數
#在生産系統的 TiDB 中,建議對作業系統進行如下的配置優化:
(1)關閉透明大頁(即 Transparent Huge Pages,縮寫為 THP)。資料庫的記憶體通路模式往往是稀疏的而非連續的。當高階記憶體碎片化比較嚴重時,配置設定 THP 頁面會出現較高的延遲。
(2)将存儲媒體的 I/O 排程器設定為 noop。對于高速 SSD 存儲媒體,核心的 I/O 排程操作會導緻性能損失。将排程器設定為 noop 後,核心不做任何操作,直接将 I/O 請求下發給硬體,以擷取更好的性能。同時,noop 排程器也有較好的普适性。
(3)為調整 CPU 頻率的 cpufreq 子產品選用 performance 模式。将 CPU 頻率固定在其支援的最高運作頻率上,不進行動态調節,可擷取最佳的性能。

1、執行指令檢視透明大頁的開啟狀态
cat /sys/kernel/mm/transparent_hugepage/enabled
#[always] madvise never 表示透明大頁處于啟用狀态,需要關閉。

2、執行以下指令檢視資料目錄所在磁盤的 I/O 排程器。假設在 sdb、sdc 兩個磁盤上建立了資料目錄
cat /sys/block/sd[bc]/queue/scheduler
noop [deadline] cfq
noop [deadline] cfq
#noop [deadline] cfq 表示磁盤的 I/O 排程器使用 deadline,需要進行修改。

3、執行以下指令檢視磁盤的唯一辨別 ID_SERIAL
udevadm info --name=/dev/sdb | grep ID_SERIAL

E: ID_SERIAL=36d0946606d79f90025f3e09a0c1f9e81
E: ID_SERIAL_SHORT=6d0946606d79f90025f3e09a0c1f9e81
#如果多個磁盤都配置設定了資料目錄,需要多次執行以上指令,記錄所有磁盤各自的唯一辨別。

4、執行以下指令檢視cpufreq子產品選用的節能政策
cpupower frequency-info --policy

analyzing CPU 0:
current policy: frequency should be within 1.20 GHz and 3.10 GHz.
              The governor "powersave" may decide which speed to use within this range.
#The governor "powersave" 表示 cpufreq 的節能政策使用 powersave,需要調整為 performance 政策。如果是虛拟機或者雲主機,則不需要調整,指令輸出通常為 Unable to determine current policy。

5、配置系統參數
#方法一:使用tuned(推薦)
(1)、執行tuned-adm list指令檢視目前作業系統的tuned政策
tuned-adm list

Available profiles:
- balanced                    - General non-specialized tuned profile
- desktop                     - Optimize for the desktop use-case
- hpc-compute                 - Optimize for HPC compute workloads
- latency-performance         - Optimize for deterministic performance at the cost of increased power consumption
- network-latency             - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
- network-throughput          - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks
- powersave                   - Optimize for low power consumption
- throughput-performance      - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
- virtual-guest               - Optimize for running inside a virtual guest
- virtual-host                - Optimize for running KVM guests
Current active profile: balanced
#Current active profile: balanced 表示目前作業系統的 tuned 政策使用 balanced,建議在目前政策的基礎上添加作業系統優化配置

(2)、建立新的tuned政策
mkdir /etc/tuned/balanced-tidb-optimal/
vi /etc/tuned/balanced-tidb-optimal/tuned.conf

[main]
include=balanced
[cpu]
governor=performance
[vm]
transparent_hugepages=never
[disk]
devices_udev_regex=(ID_SERIAL=36d0946606d79f90025f3e09a0c1fc035)|(ID_SERIAL=36d0946606d79f90025f3e09a0c1f9e81)
elevator=noop
#include=balanced 表示在現有的 balanced 政策基礎上添加作業系統優化配置。

(3)、應用新的 tuned 政策
tuned-adm profile balanced-tidb-optimal

#方法二:使用腳本方式。如果已經使用 tuned 方法,請跳過本方法
(1)、執行grubby指令檢視預設核心版本
#需安裝 grubby 軟體包。
grubby --default-kernel

(2)、執行 grubby --update-kernel 指令修改核心配置
grubby --args="transparent_hugepage=never" --update-kernel /boot/vmlinuz-3.10.0-957.el7.x86_64
#--update-kernel 後需要使用實際的預設核心版本

(3)、執行 grubby --info 指令檢視修改後的預設核心配置
grubby --info /boot/vmlinuz-3.10.0-957.el7.x86_64
#--info 後需要使用實際的預設核心版本
index=0
kernel=/boot/vmlinuz-3.10.0-957.el7.x86_64
args="ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF-8 transparent_hugepage=never"
root=/dev/mapper/centos-root
initrd=/boot/initramfs-3.10.0-957.el7.x86_64.img
title=CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)

(4)、修改目前的核心配置立即關閉透明大頁
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

(5)、配置udev腳本應用IO排程器政策
vi /etc/udev/rules.d/60-tidb-schedulers.rules

ACTION=="add|change", SUBSYSTEM=="block", ENV{ID_SERIAL}=="36d0946606d79f90025f3e09a0c1fc035", ATTR{queue/scheduler}="noop"
ACTION=="add|change", SUBSYSTEM=="block", ENV{ID_SERIAL}=="36d0946606d79f90025f3e09a0c1f9e81", ATTR{queue/scheduler}="noop"

(6)、應用udev腳本
udevadm control --reload-rules
udevadm trigger --type=devices --action=change

(7)、建立CPU節能政策配置服務
cat  >> /etc/systemd/system/cpupower.service << EOF
[Unit]
Description=CPU performance
[Service]
Type=oneshot
ExecStart=/usr/bin/cpupower frequency-set --governor performance
[Install]
WantedBy=multi-user.target
EOF

(8)、應用CPU節能政策配置服務
systemctl daemon-reload
systemctl enable cpupower.service
systemctl start cpupower.service

6、執行以下指令驗證透明大頁的狀态
cat /sys/kernel/mm/transparent_hugepage/enabled

7、執行以下指令驗證資料目錄所在磁盤的IO排程器
cat /sys/block/sd[bc]/queue/scheduler

8、執行以下指令檢視cpufreq子產品選用的節能政策
cpupower frequency-info --policy

9、執行以下指令修改sysctl參數
echo "fs.file-max = 1000000">> /etc/sysctl.conf
echo "net.core.somaxconn = 32768">> /etc/sysctl.conf
echo "net.ipv4.tcp_tw_recycle = 0">> /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies = 0">> /etc/sysctl.conf
echo "vm.overcommit_memory = 1">> /etc/sysctl.conf
sysctl -p

10、執行以下指令配置使用者的limits.conf檔案
cat << EOF >>/etc/security/limits.conf
tidb           soft    nofile          1000000
tidb           hard    nofile          1000000
tidb           soft    stack          32768
tidb           hard    stack          32768
EOF      
六、安裝numactl工具
#NUMA 綁核是用來隔離 CPU 資源的一種方法,适合高配置實體機環境部署多執行個體使用。
#通過 tiup cluster deploy 完成部署操作,就可以通過 exec 指令來進行叢集級别管理工作
安裝numa工具有兩種方法:
方法一、登入到目标節點進行安裝
sudo yum -y install numactl

方法二、通過 tiup cluster exec 在叢集上批量安裝 NUMA
#安裝叢集之後進行
1、執行 tiup cluster exec 指令,以 sudo 權限在 tidb-test 叢集所有目标主機上安裝 NUMA
tiup cluster exec tidb-test --sudo --command "yum -y install numactl"
#你可以執行 tiup cluster exec --help 檢視的 tiup cluster exec 指令的說明資訊      
七、在中控機上部署TiUP元件
1、執行如下指令安裝tiup工具
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh

2、執行如下步驟設定tiup環境變量
(1)重新聲明全局環境變量
source .bash_profile
(2)确認tiup工具是否安裝
which tiup

3、安裝tiup cluster元件
tiup cluster

4、如果已經安裝,則更新 TiUP cluster 元件至最新版本
tiup update --self && tiup update cluster

5、驗證目前 TiUP cluster 版本資訊。執行如下指令檢視 TiUP cluster 元件版本
tiup --binary cluster      
八、初始化叢集拓撲檔案
1、執行指令,生成叢集初始化配置檔案
tiup cluster template > topology.yaml
#針對兩種常用的部署場景,也可以通過以下指令生成建議的拓撲模闆
  (1)混合部署場景:單台機器部署多個執行個體
  tiup cluster template --full > topology.yaml
  (2)跨機房部署場景:跨機房部署 TiDB 叢集
  tiup cluster template --multi-dc > topology.yaml
#對于需要全局生效的參數,請在配置檔案中 server_configs 的對應元件下配置。
#對于需要某個節點生效的參數,請在具體節點的 config 中配置。      
九、執行部署指令
#如果是密鑰方式,可以通過 -i 或者 --identity_file 來指定密鑰的路徑
#如果是密碼方式,可以通過 -p 進入密碼互動視窗
#如果已經配置免密登入目标機,則不需填寫認證
1、檢查叢集存在的潛在風險
tiup cluster check ./topology.yaml --user root [-p] [-i /home/root/.ssh/gcp_rsa]

2、自動修複叢集存在的潛在風險
tiup cluster check ./topology.yaml --apply --user root [-p] [-i /home/root/.ssh/gcp_rsa]

3、部署TiDB叢集
tiup cluster deploy tidb-test v5.4.0 ./topology.yaml --user root [-p] [-i /home/root/.ssh/gcp_rsa]      
十、檢視tiup管理的叢集情況
tiup cluster list      
十一、檢查部署的TiDB叢集情況
tiup cluster display tidb-test      
十二、啟動叢集
#使用安全啟動方式後,不能通過無密碼的 root 使用者登入資料庫,你需要記錄指令行傳回的密碼進行後續操作。
#自動生成的密碼隻會傳回一次,如果沒有記錄或者忘記該密碼,請參照忘記 root 密碼修改密碼
方式一、安全啟動
tiup cluster start tidb-test --init

方式二、普通啟動
tiup cluster start tidb-test      
十三、驗證叢集運作狀态
tiup cluster display tidb-test      

部署資料導出工具Dumpling

1、下載下傳包含Dumpling的tidb-toolkit安裝包
wget https://download.pingcap.org/tidb-toolkit-v5.4.2-linux-amd64.tar.gz      
2、從TiDB導出資料
1、需要的權限
SELECT
RELOAD
LOCK TABLES
REPLICATION CLIENT
PROCESS

2、導出為SQL檔案
#本文假設在 127.0.0.1:4000 有一個 TiDB 執行個體,并且這個 TiDB 執行個體中有無密碼的 root 使用者
#Dumpling 預設導出資料格式為 SQL 檔案。也可以通過設定 --filetype sql 導出資料到 SQL 檔案
dumpling -u root -P 4000 -h 127.0.0.1 --filetype sql -t 8 -o /tmp/test -r 200000 -F256MiB
#以上指令中:

-h、-P、-u 分别代表位址、端口、使用者。如果需要密碼驗證,可以使用 -p $YOUR_SECRET_PASSWORD 将密碼傳給 Dumpling。
-o 用于選擇存儲導出檔案的目錄,支援本地檔案路徑或外部存儲 URL 格式。
-t 用于指定導出的線程數。增加線程數會增加 Dumpling 并發度提高導出速度,但也會加大資料庫記憶體消耗,是以不宜設定過大。一般不超過 64。
-r 用于指定單個檔案的最大行數,指定該參數後 Dumpling 會開啟表内并發加速導出,同時減少記憶體使用。當上遊為 TiDB 且版本為 v3.0 或更新版本時,該參數大于 0 表示使用 TiDB region 資訊劃分表内并發,具體取值将不再生效。
-F 選項用于指定單個檔案的最大大小,機關為 MiB,可接受類似 5GiB 或 8KB 的輸入。如果你想使用 TiDB Lightning 将該檔案加載到 TiDB 執行個體中,建議将 -F 選項的值保持在 256 MiB 或以下。
#如果導出的單表大小超過 10 GB,強烈建議使用 -r 和 -F 參數。

3、導出為CSV檔案
#當你導出 CSV 檔案時,你可以使用 --sql <SQL> 導出指定 SQL 選擇出來的記錄。例如,導出 test.sbtest1 中所有 id < 100 的記錄
./dumpling -u root -P 4000 -h 127.0.0.1 -o /tmp/test --filetype csv --sql 'select * from `test`.`sbtest1` where id < 100' -F 100MiB --output-filename-template 'test.sbtest1.{{.Index}}'
#以上指令中:

--sql 選項僅僅可用于導出 CSV 檔案的場景。上述指令将在要導出的所有表上執行 SELECT * FROM <table-name> WHERE id < 100 語句。如果部分表沒有指定的字段,那麼導出會失敗。
使用 --sql 配置導出時,Dumpling 無法獲知導出的表庫資訊,此時可以使用 --output-filename-template 選項來指定 CSV 檔案的檔案名格式,以友善後續使用 TiDB Lightning 導入資料檔案。例如 --output-filename-template='test.sbtest1.{{.Index}}' 指定導出的 CSV 檔案為 test.sbtest1.000000000、test.sbtest1.000000001 等。
你可以使用 --csv-separator、--csv-delimiter 等選項,配置 CSV 檔案的格式。具體資訊可查閱 Dumpling 主要選項表。
#Dumpling 導出不區分字元串與關鍵字。如果導入的資料是 Boolean 類型的 true 和 false,導出時會被轉換為 1 和 0 。

#通過并發提高Dumpling的導出效率
-t 用于指定導出的線程數。增加線程數會增加 Dumpling 并發度提高導出速度,但也會加大資料庫記憶體消耗,是以不宜設定過大。
-r 選項用于指定單個檔案的最大記錄數,或者說,資料庫中的行數。開啟後 Dumpling 會開啟表内并發,提高導出大表的速度。當上遊為 TiDB 且版本為 v3.0 或更新版本時,該參數大于 0 表示使用 TiDB region 資訊劃分表内并發,具體取值将不再生效。
--compress gzip 選項可以用于壓縮導出的資料。壓縮可以顯著降低導出資料的大小,同時如果存儲的寫入 I/O 帶寬不足,可以使用該選項來加速導出。但該選項也有副作用,由于該選項會對每個檔案單獨壓縮,是以會增加 CPU 消耗

#調整 Dumpling 的資料一緻性選項
預設auto

#導出大規模資料時的TiDB GC設定
提前調長GC時間,避免因為導出過程中發生GC導緻出失敗
SET GLOBAL tidb_gc_life_time = '720h';
操作結束之後在恢複GC時間預設是10m
SET GLOBAL tidb_gc_life_time = '10m';      

部署資料導入工具TiDB Lightning

1、下載下傳軟體包
wget https://download.pingcap.org/tidb-toolkit-v5.4.2-linux-amd64.tar.gz      
2、配置tidb-lightning.toml
[lightning]

# 轉換資料的并發數,預設為邏輯 CPU 數量,不需要配置。
# 混合部署的情況下可以配置為邏輯 CPU 的 75% 大小。
# region-concurrency =

# 日志
level = "info"
file = "tidb-lightning.log"

[tikv-importer]
# backend 設定為 local 模式
backend = "local"
# 設定本地臨時存儲路徑
sorted-kv-dir = "/mnt/ssd/sorted-kv-dir"

[mydumper]
# 源資料目錄。
data-source-dir = "/data/my_database"

[tidb]
# 目标叢集的資訊。tidb-server 的監聽位址,填一個即可。
host = "172.16.31.1"
port = 4000
user = "root"
password = ""
# 表架構資訊在從 TiDB 的“狀态端口”擷取。
status-port = 10080
# pd-server 的位址,填一個即可
pd-addr = "172.16.31.4:2379"

[checkpoint]
# 是否啟用斷點續傳。
# 導入資料時,TiDB Lightning 會記錄目前表導入的進度。
# 是以即使 TiDB Lightning 或其他元件異常退出,在重新開機時也可以避免重複再導入已完成的資料。
enable = true
# 存儲斷點的資料庫名稱。
schema = "tidb_lightning_checkpoint"
# 存儲斷點的方式。
#  - file:存放在本地檔案系統。
#  - mysql:存放在相容 MySQL 的資料庫伺服器。
driver = "file"      
3、運作 tidb-lightning。如果直接在指令行中用 nohup 啟動程式,可能會因為 SIGHUP 信号而退出,建議把 nohup 放到腳本裡面
#!/bin/bash
nohup ./tidb-lightning -config tidb-lightning.toml > nohup.out &      

部署TiDBbinlog進行增量同步

一、部署Pump
1、修改tidb-ansible/inventory.ini檔案
  (1)設定enable_binlog = True,表示 TiDB 叢集開啟 binlog
## binlog trigger
enable_binlog = True
  (2)為 pump_servers 主機組添加部署機器 IP
## Binlog Part
[pump_servers]
172.16.10.72
172.16.10.73
172.16.10.74

#預設 Pump 保留 7 天資料,如需修改可修改 tidb-ansible/conf/pump.yml(TiDB 3.0.2 及之前版本中為 tidb-ansible/conf/pump-cluster.yml)檔案中 gc 變量值,并取消注釋。
global:
  # an integer value to control the expiry date of the binlog data, which indicates for how long (in days) the binlog data would be stored
  # must be bigger than 0
   gc: 7
#請確定部署目錄有足夠空間存儲 binlog,詳見調整部署目錄,也可為 Pump 設定單獨的部署目錄。
## Binlog Part
[pump_servers]
pump1 ansible_host=172.16.10.72 deploy_dir=/data1/pump
pump2 ansible_host=172.16.10.73 deploy_dir=/data2/pump
pump3 ansible_host=172.16.10.74 deploy_dir=/data3/pump      
二、部署并啟動Pump元件的TiDB叢集
#在已有的TiDB叢集上增加Pump元件
1、部署 pump_servers 和 node_exporters
ansible-playbook deploy.yml --tags=pump -l ${pump1_ip},${pump2_ip},[${alias1_name},${alias2_name}]
#以上指令中,逗号後不要加空格,否則會報錯。

2、啟動pump_servers
ansible-playbook start.yml --tags=pump

3、更新并重新開機tidb叢集
ansible-playbook rolling_update.yml --tags=tidb

4、更新監控資訊
ansible-playbook rolling_update_monitor.yml --tags=prometheus      
三、部署Drainer
1、可以在導出目錄中找到 metadata 檔案,其中的 Pos 字段值即全量備份的時間戳。metadata 檔案示例如下:
Started dump at: 2019-12-30 13:25:41
SHOW MASTER STATUS:
        Log: tidb-binlog
        Pos: 413580274257362947
        GTID:

Finished dump at: 2019-12-30 13:25:41

2、修改tidb-ansible/inventory.ini檔案
#為 drainer_servers 主機組添加部署機器 IP,initial_commit_ts 請設定為擷取的 initial_commit_ts,僅用于 Drainer 第一次啟動
[drainer_servers]
drainer_tidb ansible_host=172.16.10.71 initial_commit_ts="402899541671542785"

3、修改配置檔案
配置檔案名命名規則為 别名_drainer.toml,否則部署時無法找到自定義配置檔案。 但是需要注意 v3.0.0,v3.0.1 的配置檔案命名規則與其餘版本略有不同,為 别名_drainer-cluster.toml。
[syncer]
# downstream storage, equal to --dest-db-type
# Valid values are "mysql", "file", "tidb", "kafka".
db-type = "mysql"

4、部署Draniner
ansible-playbook deploy_drainer.yml

5、啟動Draniner
ansible-playbook start_drainer.yml      

部署復原鍊路使用tiup部署TiDB Binlog

1、編輯擴容檔案.yaml
pump_server:
- host: 10.0.0.202
drainer_server:
- host: 10.0.0.201
config:
syncer.db-type: "mysql"
syncer.to.host: "10.0.0.201"
syncer.to.user: "root"
syncer.to.password: "mysql"
syncer.to.port:      
2、使用tiup對Pump和Drainer元件進行擴容
tiup cluster scale-out tidb-test  擴容檔案.yaml  -uroot -p      
3、開啟TiDB叢集的binlog
tiup cluster edit-config 叢集名
server_configs:
  tidb:
    binlog.enable: true
    binlog.lgnore-error: true      
4、使用指令來載入新的配置
tiup cluster reload 叢集名      

部署sync-diff-inspector進行資料比對

sync-diff-inspector的使用限制
1、對于 MySQL 和 TiDB 之間的資料同步不支援線上校驗,需要保證上下遊校驗的表中沒有資料寫入,或者保證某個範圍内的資料不再變更,通過配置 range 來校驗這個範圍内的資料。

2、不支援 JSON 類型的資料,在校驗時需要設定 ignore-columns 忽略檢查這些類型的資料。

3、FLOAT、DOUBLE 等浮點數類型在 TiDB 和 MySQL 中的實作方式不同,在計算 checksum 時會分别取 6 位和 15 位有效數字。如果不使用該特性,需要設定 ignore-columns 忽略這些列的檢查。

4、支援對不包含主鍵或者唯一索引的表進行校驗,但是如果資料不一緻,生成的用于修複的 SQL 可能無法正确修複資料。      
sync-diff-inspector所需的資料庫權限
#sync-diff-inspector需要擷取表結構資訊,查詢資料,需要的資料庫權限如下:
上遊資料庫
  SELECT(查詢資料進行對比)
  SHOW_DATABASES(檢視庫名)
  RELOAD(檢視表結構)
下遊資料庫
  SELECT(查詢資料進行對比)
  SHOW_DATABASES(檢視庫名)
  RELOAD(檢視表結構)      
配置檔案說明
#sync-diff-inspector 的配置總共分為五個部分:
1、Global config:通用配置,包括校驗的線程數量、是否輸出修複SQL、是否比對資料等
2、Datasource config:配置上下遊資料庫執行個體
3、Routes:上遊多表名通過正則比對下遊單表明的規則(可選)
4、T ask config:配置校驗哪些表,如果有的表在上下遊有一定的映射關系或者有一些特殊要求,則需要對指定的表進行配置
5、Table config:對具體表的特殊配置,例如指定範圍,忽略的列等等(可選)
#提示:配置名後帶 s 的配置項允許擁有多個配置值,是以需要使用方括号 [] 來包含配置值
# Diff Configuration.

######################### Global config #########################

# 檢查資料的線程數量,上下遊資料庫的連接配接數會略大于該值
check-thread-count = 4

# 如果開啟,若表存在不一緻,則輸出用于修複的 SQL 語句。
export-fix-sql = true

# 隻對比表結構而不對比資料
check-struct-only = false


######################### Datasource config #########################
[data-sources]
[data-sources.mysql1] # mysql1 是該資料庫執行個體唯一辨別的自定義 id,用于下面 task.source-instances/task.target-instance 中
    host = "127.0.0.1"
    port = 3306
    user = "root"
    password = ""

    #(可選)使用映射規則來比對上遊多個分表,其中 rule1 和 rule2 在下面 Routes 配置欄中定義
    route-rules = ["rule1", "rule2"]

[data-sources.tidb0]
    host = "127.0.0.1"
    port = 4000
    user = "root"
    password = ""
    #(可選)使用 TiDB 的 snapshot 功能,如果開啟的話會使用曆史資料進行對比
    # snapshot = "386902609362944000"

########################### Routes ###########################
# 如果需要對比大量的不同庫名或者表名的表的資料,或者用于校驗上遊多個分表與下遊總表的資料,可以通過 table-rule 來設定映射關系
# 可以隻配置 schema 或者 table 的映射關系,也可以都配置
[routes]
[routes.rule1] # rule1 是該配置的唯一辨別的自定義 id,用于上面 data-sources.route-rules 中
schema-pattern = "test_*"      # 比對資料源的庫名,支援通配符 "*" 和 "?"
table-pattern = "t_*"          # 比對資料源的表名,支援通配符 "*" 和 "?"
target-schema = "test"         # 目标庫名
target-table = "t" # 目标表名

[routes.rule2]
schema-pattern = "test2_*"      # 比對資料源的庫名,支援通配符 "*" 和 "?"
table-pattern = "t2_*"          # 比對資料源的表名,支援通配符 "*" 和 "?"
target-schema = "test2"         # 目标庫名
target-table = "t2" # 目标表名

######################### Task config #########################
# 配置需要對比的*目标資料庫*中的表
[task]
    # output-dir 會儲存如下資訊
    # 1 sql: 檢查出錯誤後生成的修複 SQL 檔案,并且一個 chunk 對應一個檔案
    # 2 log: sync-diff.log 儲存日志資訊
    # 3 summary: summary.txt 儲存總結
    # 4 checkpoint: a dir 儲存斷點續傳資訊
    output-dir = "./output"

    # 上遊資料庫,内容是 data-sources 聲明的唯一辨別 id
    source-instances = ["mysql1"]

    # 下遊資料庫,内容是 data-sources 聲明的唯一辨別 id
    target-instance = "tidb0"

    # 需要比對的下遊資料庫的表,每個表需要包含資料庫名和表名,兩者由 `.` 隔開
    # 使用 ? 來比對任意一個字元;使用 * 來比對任意;詳細比對規則參考 golang regexp pkg: https://github.com/google/re2/wiki/Syntax
    target-check-tables = ["schema*.table*", "!c.*", "test2.t2"]

    #(可選)對部分表的額外配置,其中 config1 在下面 Table config 配置欄中定義
    target-configs = ["config1"]

######################### Table config #########################
# 對部分表進行特殊的配置,配置的表必須包含在 task.target-check-tables 中
[table-configs.config1] # config1 是該配置的唯一辨別自定義 id,用于上面 task.target-configs 中
# 目标表名稱,可以使用正則來比對多個表,但不允許存在一個表同時被多個特殊配置比對。
target-tables = ["schema*.test*", "test2.t2"]
#(可選)指定檢查的資料的範圍,需要符合 sql 中 where 條件的文法
range = "age > 10 AND age < 20"
#(可選)指定用于劃分 chunk 的列,如果不配置該項,sync-diff-inspector 會選取一些合适的列(主鍵/唯一鍵/索引)
index-fields = ["col1","col2"]
#(可選)忽略某些列的檢查,例如 sync-diff-inspector 目前還不支援的一些類型(json,bit,blob 等),
# 或者是浮點類型資料在 TiDB 和 MySQL 中的表現可能存在差異,可以使用 ignore-columns 忽略檢查這些列
ignore-columns = ["",""]
#(可選)指定劃分該表的 chunk 的大小,若不指定可以删去或者将其配置為 0。
chunk-size = 0
#(可選)指定該表的 collation,若不指定可以删去或者将其配置為空字元串。
collation = ""      
一、運作sync-diff-inspector
./sync_diff_inspector --config=名字.toml

#該指令最終會在 config.toml 中的 output-dir 輸出目錄輸出本次比對的檢查報告 summary.txt 和日志 sync_diff.log。在輸出目錄下還會生成由 config.toml 檔案内容哈希值命名的檔案夾,該檔案夾下包括斷點續傳 checkpoint 結點資訊以及資料存在不一緻時生成的 SQL 修複資料。      
二、輸出檔案目錄結構
output/
|-- checkpoint # 儲存斷點續傳資訊
| |-- bbfec8cc8d1f58a5800e63aa73e5 # config hash 占位檔案,辨別該輸出目錄(output/)對應的配置檔案
│ |-- DO_NOT_EDIT_THIS_DIR
│ └-- sync_diff_checkpoints.pb # 斷點續傳資訊
|
|-- fix-on-target # 儲存用于修複不一緻的 SQL 檔案
| |-- xxx.sql
| |-- xxx.sql
| └-- xxx.sql
|
|-- summary.txt # 儲存校驗結果的總結
└-- sync_diff.log # 儲存 sync-diff-inspector 執行過程中輸出的日志資訊      
三、綜合結果
#日志
sync-diff-inspector 的日志存放在 ${output}/sync_diff.log 中,其中 ${output} 是 config.toml 檔案中 output-dir 的值。
#校驗進度
sync-diff-inspector 會在運作時定期(間隔 10s)輸出校驗進度到checkpoint中(位于 ${output}/checkpoint/sync_diff_checkpoints.pb 中,其中 ${output} 是 config.toml 檔案中 output-dir 的值。
#校驗結果
當校驗結束時,sync-diff-inspector 會輸出一份校驗報告,位于 ${output}/summary.txt 中,其中 ${output} 是 config.toml 檔案中 output-dir 的值。

+---------------------+--------------------+----------------+
|        TABLE        | STRUCTURE EQUALITY | DATA DIFF ROWS |
+---------------------+--------------------+----------------+
| `sbtest`.`sbtest99` | true               | +97/-97        |
| `sbtest`.`sbtest96` | true               | +0/-101        |
+---------------------+--------------------+----------------+
Time Cost: 16.75370462s
Average Speed: 113.277149MB/s

TABLE:該清單示對應的資料庫及表明
STRUCTURE EQUALITY:表結構是否相同
DATA DIFF ROWS:即rowAdd / rowDelete,表示該表修複需要增加/删除的行數      
四、SQL修複
#校驗過程中遇到不同的行,會生成修複資料的 SQL 語句。一個chunk如果出現資料不一緻,就會生成一個以 chunk.Index 命名的 SQL 檔案。檔案位于 ${output}/fix-on-${instance} 檔案夾下。其中 ${instance} 為 config.toml 中 task.target-instance 的值。
#一個 SQL 檔案會包含該 chunk 的所屬表以及表示的範圍資訊。對每個修複 SQL 語句,有三種情況:
下遊資料庫缺失行,則是 REPLACE 語句
下遊資料庫備援行,則是 DELETE 語句
下遊資料庫行部分資料不一緻,則是 REPLACE 語句,但會在 SQL 檔案中通過注釋的方法标明不同的列

-- table: sbtest.sbtest99
-- range in sequence: (3690708) < (id) <= (3720581)
/*
  DIFF COLUMNS ╏   `K`   ╏                `C`                 ╏               `PAD`
╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╋╍╍╍╍╍╍╍╍╍╋╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╋╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍
  source data  ╏ 2501808 ╏ 'hello'                            ╏ 'world'
╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╋╍╍╍╍╍╍╍╍╍╋╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╋╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍
  target data  ╏ 5003616 ╏ '0709824117-9809973320-4456050422' ╏ '1714066100-7057807621-1425865505'
╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╋╍╍╍╍╍╍╍╍╍╋╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╋╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍
*/
REPLACE INTO `sbtest`.`sbtest99`(`id`,`k`,`c`,`pad`) VALUES (3700000,2501808,'hello','world');      

更新總結

#相對于v3.0.8版本,v5.4.0版本性能上更加穩定,運維起來也更加友善
  針對于這種跨版本的資料庫更新,我相信它會是一種操作比較多也是比較重要的項目。在這裡隻是簡單的介紹了方法的流程與步驟
具體的操作執行,還需要自己進行相應的測試,畢竟對于我們來說,安全、穩定更為重要。
#有幾個地方是我們需要值得注意的:
1、Dumpling導出資料之前一定要開啟Pump和Drainer
2、Dumpling導出資料之前GC時間要進行調整
3、Lightning導入資料會有部分由于版本差距過大導緻的不相容問題,盡量提前測試提前進行避免
4、sync-diff-inspector資料校驗,針對于不支援的列提前找出并過濾,進行手工比對
5、記着擷取原叢集的使用者資訊導入到目标叢集
6、復原鍊路隻需要配置好檔案在切換業務時候擴容即可
7、需求復原之時把原業務反向切換      

繼續閱讀