原文地址:https://alphahinex.github.io/2022/12/25/tidb-v6-pcta-303/
description: "通過這門課程像吻,學(xué)員可以學(xué)習 TiDB 數(shù)據(jù)庫的體系架構(gòu)、設(shè)計理念與各個組件的運行原理。學(xué)習并掌握 TiDB 數(shù)據(jù)庫的管理。掌握 TiDB 的數(shù)據(jù)遷移垢夹、同步、復(fù)制和備份恢復(fù)方法。熟悉主要生態(tài)工具的適用范圍建车、場景和基本使用方法。"
date: 2022.12.25 10:26
categories:
- Database
tags: [Database, TiDB]
keywords: TiDB, PD, TiDB Server, TiKV, TiFlash, Raft, RocksDB, Region, HTAP, OLTP, OLAP, MVCC
在線學(xué)習地址:https://learn.pingcap.com/learner/course/1110001
軟件包下載地址:https://cn.pingcap.com/product-community/
Lesson 01 TiDB Cluster 部署
- TiUP 是從 TiDB 4.0 引入的包管理器
- TiUP 在執(zhí)行時椒惨,命令 <command> 和組件 < component > 可以同時出現(xiàn)
- TiDB 集群啟動順序:PD => TiKV => TiDB => TiFlash缤至;停止順序是啟動順序倒序
-
tiup cluster start tidb-test --init
安全啟動,為 root 用戶生成初始密碼 -
set password = password('new pwd');
可修改密碼
Lesson 02 TiDB 的連接管理
- 100% 兼容 MySQL 5.7 協(xié)議
- 支持 MySQL 5.7 常用的功能及語法
- 不支持的功能特性:存儲過程與函數(shù)康谆、觸發(fā)器领斥、外鍵、函數(shù)沃暗、全文索引月洛、CREATE TABLE AS SELECT
- TiDB 默認端口 4000
- 查看 TiDB 版本:
select tidb_version()\G
Lesson 03 TiDB 的配置
- TiDB 配置分兩類
- 系統(tǒng)配置:TiDB Server,跟 SQL 有關(guān)的孽锥,存在 TiKV 里嚼黔,更新配置不需要重啟细层,可以通過 MySQL 客戶端進行修改,有作用域
- 集群配置:TiKV唬涧、PD今艺、一部分的 TiDB Server,存在自己節(jié)點的配置文件中爵卒,重啟節(jié)點方可生效,沒有作用域
- TiDB 系統(tǒng)參數(shù)的作用域:SESSION(會話級別撵彻,默認)钓株、GLOBAL(全局級別)、INSTANCE(實例級別)
- 修改集群配置:
tiup cluster edit-config tidb-test
陌僵,之后tiup cluster reload tidb-test
重啟所有節(jié)點應(yīng)用新配置轴合。tiup cluster show-config tidb-test
查看配置。 - 6.0 有在線修改集群配置碗短,但是實驗特性受葛,所以集群配置的修改還是需要重啟節(jié)點才能生效
Lesson 04 用戶管理與安全
- 查看用戶信息
select user, host, authentication_string from mysql.user;
- 創(chuàng)建/刪除用戶
create user 'jack'@'172.31.0.%' identified by 'pingcap';
drop user 'user3'@'localhost';
- 修改密碼
SET PASSWORD FOR 'test'@'localhost'=password('mypass');
ALTER USER 'test'@'localhost' IDENTIFIED BY 'mypass';
- 創(chuàng)建/刪除角色
create role r_emp@'172.31.0.159';
create role r_emp@'%';
create role r_emp;
drop role 'r_admin','r_dev'@'localhost';
- 授權(quán)
grant select,insert on test.emp to 'jack'@'172.31.0.159'; grant select,insert on test.emp to 'r_emp'; -- 賦予用戶全部權(quán)限 grant all privileges on *.* to 'user2'@'localhost' with grant option; -- 將角色賦予用戶 grant r_emp to 'jack'@'172.31.0.%'; -- 擁有角色的用戶登錄后,需開啟角色 set role all; -- 查看授權(quán) show grants; show grants for 'admin'@'localhost'; -- 回收用戶全部權(quán)限 revoke all privileges on *.* from 'user2'@'localhost';
- 角色與用戶相似之處為:
- 是被鎖踪怂(locked)的(不能用于登錄)
- 沒有密碼
- 被存儲在 mysql.user 表中
- 當用戶登錄后总滩,必須使用
set role all
命令開啟用戶被賦予的角色
- 忘記 root 密碼的解決辦法:
- 修改配置文件
[security]
skip-grant-table = true
- 重啟數(shù)據(jù)庫后生效
mysql -h 127.0.0.1 -P 4000 -u root
Lesson 05 監(jiān)控 TiDB
- 兩套體系:
- Grafana + Prometheus —— http://{grafana-ip}:3000,用戶名密碼默認 admin / admin
- TiDB Dashboard —— http://{pd-ip}:2379/dashboard巡雨,root / tidb
- 確認 TiDB 集群狀態(tài)
$ tiup cluster display didb-test
- 報警項由低到高分為:警告闰渔、嚴重、緊急 三個級別
Lesson 06 TiDB 集群管理
- TiDB/TiKV/PD 在線擴容步驟:
- 編輯配置文件
- 執(zhí)行擴容命令
tiup cluster scale-out tidb-test scale-out-tikv.yaml -uroot -p
- 確認新節(jié)點是否加入
tiup cluster display tidb-test
- TiFlash 在線擴容
- 確認當前 TiDB 的版本支持 TiFlash
- Enable-plcaement-rules 開啟參數(shù)
- 編輯配置文件
- 執(zhí)行擴容命令
- 確認新節(jié)點加入
- TiDB/TiKV/PD 在線縮容步驟:
- 查看節(jié)點 ID 信息
tiup cluster display tidb-test
- 執(zhí)行縮容操作
tiup cluster scale-in tidb --node <node-IP>:<node-Port>
铐望,執(zhí)行后節(jié)點變?yōu)?Tombstone
狀態(tài)冈涧,可繼續(xù)通過tiup cluster prune tidb-test
命令清理節(jié)點 - 檢查集群狀態(tài)
- TiFlash 在線縮容
- 根據(jù) TiFlash 剩余節(jié)點數(shù)調(diào)整數(shù)據(jù)表的副本數(shù)
alter table <db-name>.<table-name> set tiflash replica 0;
- 確認表的副本已經(jīng)被刪除
SELECT * FROM information_schema.tiflash_replica WHERE TABLE_SCHEMA='<db_name>' and TABLE_NAME='<table_name>'
- 查看節(jié)點 ID 信息
- 通過 TiUP 縮容 TiFlash 節(jié)點
- 檢查集群狀態(tài)
- 重命名集群
tiup cluster rename ${cluster-name} ${new-name}
- 清理集群數(shù)據(jù)
tiup cluster clean ${clust4er-name} --xxx
,清理會停庫正蛙,再使用需要重新啟動 TiDB督弓,清理后 root 用戶沒有密碼了,可以直接登錄
-
--log
清理日志 -
--data
清理數(shù)據(jù) -
--all
清理日志和數(shù)據(jù)
- 銷毀集群
tiup cluster destroy tidb-test
- 查看全局和 session 的時區(qū):
select @@global.time_zone, @@session.time_zone;
- 設(shè)置 session 級別時區(qū)
set session time_zone='UTC';
- Datetime 類型不受時區(qū)影響乒验,timestamp 類型受時區(qū)影響
Lesson 07 升級 TiDB Cluster
- 升級集群上的所有 TiDB 實例愚隧,
-R
指定要升級的組件,tidb徊件、tikv奸攻、pd 等
$ tiup cluster patch ${cluster-name} /tmp/tidb-hotfix.tar.gz -R tidb
- 替換其中一個 TiDB 實例
$ tiup cluster patch ${cluster-name} /tmp/tidb-hotfix.tar.gz -N ${Node_IP}:${Node_Port}
- 升級 TiDB 集群分為不停機升級和停機升級
- 版本升級流程:升級 TiUP => 修改 TiUP Cluster 拓撲配置文件 => 檢查當前集群健康狀況 => 將集群升級到指定版本 => 驗證
- 5.3 之前 TiFlash 不支持在線升級
- 升級時報錯中斷,處理完報錯后如何繼續(xù)
# 查看操作記錄虱痕,找到失敗的升級操作記錄的 ID
$ tiup cluster audit
# 重試上次的升級操作記錄
$ tiup cluster replay <audit-id>
- 升級過程中 evict leader 等待時間過長睹耐,如何跳過該步驟快速升級
$ tiup cluster upgrade <cluster-name> <version> --force
Lesson 08 備份恢復(fù)策略
- 備份的類型
- 熱備份:允許讀寫,對性能有影響部翘,TiDB 采用 MVCC 方式實現(xiàn)
- 冷備份:不允許讀寫
- 溫備份:允許讀硝训,不允許寫
- 按輸出分類:
- 邏輯備份:SQL、CSV,可讀性好窖梁,速度慢赘风,支持異構(gòu)數(shù)據(jù)遷移
- 物理備份:二進制副本,恢復(fù)速度快纵刘,不可讀邀窃,只能同構(gòu)恢復(fù)
- 基于復(fù)制增量備份:主從模式,對主庫影響小假哎,主庫出問題備庫能立即提供服務(wù)
- BR 是熱備份 & 物理備份
Lesson 09 數(shù)據(jù)導(dǎo)出工具 Dumpling
- 用于完成邏輯上的全量備份或者導(dǎo)出瞬捕,不支持增量導(dǎo)出
- 支持 table-filter,篩選數(shù)據(jù)導(dǎo)出
- 適用于數(shù)據(jù)量小于 50G 的導(dǎo)出場景
- 導(dǎo)出數(shù)據(jù)的一致性:通過 --consistency <consistency level> 標識控制導(dǎo)出數(shù)據(jù)舵抹,默認是
Snapshot
級別(獲取指定時間戳的一致性快照)肪虎,還有Flush
(全庫加只讀鎖),Lock
(給要導(dǎo)出的表加讀鎖),None
(不要一致性),Auto
(根據(jù)數(shù)據(jù)庫類型,如果是 TiDB惧蛹,設(shè)置為 Snapshot扇救,如果是 MySQL,設(shè)置為 Flush)
$ ./dumpling --snapshot 417773951312461825
$ ./dumpling --snapshot "2020-07-02 17:12:45"
Lesson 10 使用 TiDB Lightning 導(dǎo)入數(shù)據(jù)
- TiDB Lightning 是導(dǎo)入 SQL香嗓、CSV 至 TiDB 的工具
- TiDB Lightning 的兩種導(dǎo)入模式:
- Physical Import Mode
-
Logical Import Mode:連到 TiDB Server 上執(zhí)行 SQL
- Physical Import Mode 原理
- 切換 TiKV 為導(dǎo)入模式
- Schema & 表創(chuàng)建
- 分割源數(shù)據(jù)
- 讀取 dump 文件
- 寫入本地臨時文件(轉(zhuǎn)換成 key-value 格式迅腔,并排序)
- 導(dǎo)入臨時文件到 TiKV 集群
- 檢驗與分析
- 切換回普通模式
- 并行導(dǎo)入時,TiDB Lightning 實例數(shù)不宜超過 10 個
- 支持斷點續(xù)傳陶缺,斷點可以存儲在文件或數(shù)據(jù)庫中
- 邏輯模式不直接寫 TiKV钾挟,是向 TiDB Server 執(zhí)行 SQL
Lesson 11 使用 BR 進行備份恢復(fù)
- BR —— Backup & Restore
- BR 直接與 PD 和 TiKV 交互,不經(jīng)過 TiDB Server
- BR 是二進制備份饱岸,只能恢復(fù)到 TiDB 數(shù)據(jù)庫中
- 備份輸出文件:SST 文件掺出、backupmeta 文件、backup.lock 文件
- TiDB 5.4 版本之后才開始支持 GBK 字符集
- BR 恢復(fù)的工具無法通過 TiCDC 或 TiDB Binlog 同步到下游
- 備份時苫费,每個 TiKV 備份自己 TiKV 節(jié)點里存儲的數(shù)據(jù)
- 恢復(fù)時汤锨,要將各個節(jié)點的數(shù)據(jù)先進行匯總,保證每個節(jié)點都有全量的恢復(fù)數(shù)據(jù)百框,才能進行恢復(fù)
$ br backup/restore full/db/table \ --pd "${PDIP}:2379" \ --db test \ --table usertable \ --storage "s3://backup-data/table/" \ --ratelimit 128 \ --log-file backup.log
- 增量備份需先獲得最近一次備份的時間點闲礼,并傳入備份指令
- BR 是熱備份,物理備份铐维,支持增量備份 & 恢復(fù)
Lesson 12 使用 sync-diff-inspector 校驗數(shù)據(jù)
- 原理:并行切分數(shù)據(jù)并行比較柬泽,比較時采用二分法,縮小逐行比較的范圍
- 限制:
- 不支持 JSON嫁蛇、BIT锨并、BINARY、BLOG 等類型的數(shù)據(jù)
- FLOAT睬棚、DOUBLE 等浮點數(shù)類型無法在 TiDB 和 MySQL 之間進行校驗
- 不包含主鍵或者唯一索引的表可以進行校驗第煮,但修復(fù) SQL 可能無法正確修復(fù)數(shù)據(jù)
- MySQL 與 TiDB 之間或者 MySQL 與 MySQL 之間的數(shù)據(jù)校驗不支持數(shù)據(jù)同步在線校驗
-
sharding
選項默認打開解幼,支持源端分表分庫目標并表的驗證
Lesson 13 使用 TiDB DataMigration(DM)同步數(shù)據(jù)
- 一個 DM worker 對應(yīng)上游的一個數(shù)據(jù)庫實例,讀取上游 binlog 進行同步
- 數(shù)據(jù)源多于 worker 數(shù)量時包警,多出的 worker 空閑
- DM 的目標端只能是 TiDB撵摆,源端可以是多個兼容 MySQL 協(xié)議的數(shù)據(jù)庫
- DM 依賴源端數(shù)據(jù)庫開啟 binlog,可以通過 binlog event filter 過濾某些操作不進行復(fù)制
- 用戶通過 dmctl 命令行工具向 DM master 發(fā)送指令害晦,DM master 再操作 DM worker 進行同步
- 支持全量及增量同步特铝、源庫表與目標庫異構(gòu)表的同步、進行分表分庫的合并同步
- DM 可以支持一定程度的異構(gòu)表遷移壹瘟,只要異構(gòu)表存在包含關(guān)系(源庫不能選擇列苟呐,需要復(fù)制全部列;目標表的列可以多于源庫表的列)
- DM 部署相關(guān)命令
$ tiup install dm dmctl
$ tiup dm display dm-test
$ tiup dm start dm-test
$ tiup dm list
# DM 集群縮容
$ tiup dm scale-in dm-test -N 172.31.0.175:8262
# DM 集群擴容
$ tiup dm scale-out dm-test dm-scale.yaml -uroot -p
$ tiup dm stop dm-test
$ tiup dm destory dm-test
-
DM 的任務(wù)包含:源端俐筋、目標端、數(shù)據(jù)過濾(黑白名單严衬、事件過濾)和表路由
# 檢查與啟動任務(wù)
$ tiup dmctl --master-addr=172.31.0.49:8261 start-task dm-task.yaml
# 暫停任務(wù)
$ tiup dmctl --master-addr=172.31.0.49:8261 pause-task dm-task.yaml
# 恢復(fù)任務(wù)
$ tiup dmctl --master-addr=172.31.0.49:8261 resume-task dm-task.yaml
# 查詢?nèi)蝿?wù)
$ tiup dmctl --master-addr=172.31.0.49:8261 query-status dm-task.yaml
# 停止任務(wù)
$ tiup dmctl --master-addr=172.31.0.49:8261 stop-task dm-task.yaml
Lesson 14 使用 TiCDC 同步數(shù)據(jù)
- 數(shù)據(jù)源是 TiDB澄者,下游是兼容 MySQL 協(xié)議的數(shù)據(jù)庫或 kafka 等,與 DM 是反向的
- TiCDC 集群中的一個節(jié)點負責多個 TiKV
- TiCDC 讀取的是 TiKV 的 changelog请琳,比 TiDB Binlog 的效率高
- TiCDC 是異步復(fù)制粱挡,目標端與源端有時間延遲;源頭數(shù)據(jù)庫出現(xiàn)災(zāi)難后依然有丟失數(shù)據(jù)的可能
- TiCDC 只能同步至少存在一個有效索引的表
- 同步任務(wù)不能在線修改配置俄精,需要先 pause询筏,然后 update,再 resume
- TiCDC capture 可以有多個竖慧,并行從 TiKV 讀取 changelog嫌套;導(dǎo)入目標端時,一個 capture 對應(yīng)一個目標端圾旨,但是會將其他 capture 中的數(shù)據(jù)復(fù)制到自己這再向下游同步踱讨。只有負責匯聚數(shù)據(jù)的 capture 里才有全量的 changelog 數(shù)據(jù)
- TiCDC 目標端不支持 Oracle
- Changelog 抽取到 TiCDC 中時,會在本地進行排序
- TiCDC 可以通過 TiDB 集群的拓撲文件進行部署及擴縮容
Lesson 15 使用 TiDB Binlog 同步數(shù)據(jù)
- TiDB Binlog 的作用與 TiCDC 類似砍的,TiDB 5.0 版本后痹筛,推薦使用 TiCDC 替代 TiDB Binlog
- 只能做增量復(fù)制,不能做全量復(fù)制
- 可以使用 tiup 工具為 TiDB 集群增加 TiDB Binlog 所使用的 pump 和 drainer 節(jié)點
- Pump 會先將數(shù)據(jù)進行排序廓鞠,之后發(fā)送給 drainer帚稠,drainer 再進行合并排序
- TiDB Binlog 類似 MySQL row 格式的 binlog,記錄的是已經(jīng)提交的事務(wù)床佳,默認未開啟
- Pump 不是從 TiKV 讀取滋早,是直接從 TiDB 讀取 TiDB 產(chǎn)生的 binlog 日志
- 一個 drainer 對應(yīng)一個目標端
Lesson 16 數(shù)據(jù)庫高可用概述
- 恢復(fù)時間目標(Recovery Time Objective,RTO)
- 恢復(fù)點目標(Recovery Point Objective夕土,RPO)
- TiDB 支持 CP馆衔,不支持 AP瘟判,出現(xiàn)網(wǎng)絡(luò)隔離時,保證一致性角溃,不保證可用性
- TiDB 數(shù)據(jù)庫提供強一致性拷获,如不能保證強一致性,則拒絕服務(wù)
- 故障解決會伴隨有服務(wù)的降級
Lesson 17 TiDB 數(shù)據(jù)庫常用高可用架構(gòu)
- 同城三中心:網(wǎng)絡(luò)延遲小减细,RTO 較小匆瓜,RPO 為 0
- 同城兩中心(50km 內(nèi)),中心之間同步復(fù)制未蝌,DR AutoSync驮吱,建議四副本,3 voter 1 leaner萧吠,非極端情況可保證 RPO = 0
- 兩地三中心左冬,城市之間是異步復(fù)制,不能保證 RPO = 0 和一致性恢復(fù)
- 異步復(fù)制是通過 TiDB Binlog 或 CDC 組件完成纸型,會丟失數(shù)據(jù)(RPO 不為 0)拇砰,有損恢復(fù)后,保證一致性