黄东旭解析 TiDB 的核心优势
572
2023-11-24
TiDB Data Migration (DM) 是一款便捷的数据迁移工具,支持从与 MySQL 协议兼容的数据库(MySQL、MariaDB、Aurora MySQL)到 TiDB 的全量数据迁移和增量数据同步。
在TOOLS的文件夹中,找到dm-master-v6.5.2-linux-amd64.tar.gz包,解压到本地
# tar zxvf dm-master-v6.5.2-linux-amd64.tar.gz
编写安装配置拓扑文件
# vim dmtopo.yaml
编辑如下内容,注意格式,这里测试时只用单节点来部署。
注意事项:要和TIDB的数据库拓扑IP区分开,否则会造成TIDB集群的granafa和dashboard监控因IP冲突而导致访问失效。
---
global:
user: "tidb"
ssh_port: 22
deploy_dir: "/home/tidb/dm/deploy"
data_dir: "/home/tidb/dm/data"
# arch: "amd64"
master_servers:
- host: 21.72.124.42
worker_servers:
- host: 21.72.124.42
monitoring_servers:
- host: 21.72.124.42
grafana_servers:
- host: 21.72.124.42
alertmanager_servers:
- host: 21.72.124.42
安装DM组件
# tiup dm deploy dm-test v6.5.2 ./dmtopo.yaml --user tidb
# tiup dm display dm-test
(1)加密数据源密码
# tiup dmctl encrypt abc!@#123
(2)编写数据源配置文件
source-id: "mysql-01" # 数据源 ID,在数据迁移任务配置和 dmctl 命令行中引用该 source-id 可以关联到对应的数据源
from:
host: "127.0.0.1"
port: 3306
user: "root"
password: "MKxn0Qo3m3XOyjCnhEMtsUCm83EhGQDZ/T4=" # 推荐使用 dmctl 对上游数据源的用户密码加密之后的密码
security: # 上游数据源 TLS 相关配置。如果没有需要则可以删除
ssl-ca: "/path/to/ca.pem"
ssl-cert: "/path/to/cert.pem"
ssl-key: "/path/to/key.pem"
# tiup dmctl --master-addr 21.72.124.42:8261 operate-source create
source-mysql-01.yaml
# vim dm-task.yaml
#注意文件格式
name: testdm
task-mode: all
target-database:
host: "127.0.0.1"
port: 4000
user: "root"
password: "" # 如果密码不为空,则推荐使用经过 dmctl 加密的密文
# 填写一个或多个所需同步的数据源信息
mysql-instances:
- source-id: "mysql-01"
block-allow-list: "ba-rule1"
block-allow-list:
ba-rule1:
do-dbs: ["testdm"]
任务配置文件分为以下几部分:
# 全局配置
## 基本信息配置
## 功能配置集
# 实例配置
完整配置文件实例请参考https://docs.pingcap.com/zh/tidb/v6.5/task-configuration-file-full
# tiup dmctl --master-addr 127.0.0.1:8261 start-task testdm-task.yaml
结果如下:
tiup is checking updates for component dmctl ...
Starting component `dmctl`: /root/.tiup/components/dmctl/v7.3.0/dmctl/dmctl --master-addr 127.0.0.1:8261 start-task testdm-task.yaml
{
"result": true,
"msg": "",
"sources": [
{
"result": true,
"msg": "",
"source": "mysql-01",
"worker": "dm-192.168.80.201-8262"
}
],
"checkResult": "pre-check is passed. "
}
query-status
示例:
# tiup dmctl --master-addr 127.0.0.1:8261 query-statustestdm
pause-task [-s "mysql-replica-01"] task-name
示例:
# tiup dmctl --master-addr 127.0.0.1:8261 pause-task testdm
resume-task [-s "mysql-replica-01"] task-name
示例:
# tiup dmctl --master-addr 127.0.0.1:8261 resume-task testdm
stop-task [-s "mysql-replica-01"] task-name
示例:
# tiup dmctl --master-addr 127.0.0.1:8261 stop-task testdm
(1)分库分表数据迁移
(2)上下游列数量不一致
(3)增量数据校验、迁移
使用数据导出工具 Dumpling,你可以把存储在 TiDB 或 MySQL 中的数据导出为 SQL 或 CSV 格式,用于逻辑全量备份。
[tidb@localhost] #cd /home/tidb_install/tidb-enterprise-server-v6.5.2-linux-amd64
[tidb@localhost] #tar -zxvf dumpling-v6.5.2-linux-amd64.tar.gz
会解压出一个dumpling文件
导出某库到本地文件夹语句如下:
[tidb@localhost]#tiup dumpling -uroot -P13390 -h21.72.124.42 -o /home/dump -B P6ODS
参数解释:
-u 导出数据库的用户名
-P 导出数据库的端口号
-h 导出数据库的IP地址
-o 要导入的文件夹,需有相应权限
-B 导出的数据库名称schema
-V 或 --version
输出 Dumpling 版本并直接退出
-B 或 --database
导出指定数据库
-T 或 --tables-list
导出指定数据表
-f 或 --filter
导出能匹配模式的表,语法可参考 table-filter
--case-sensitive
table-filter 是否大小写敏感
-h 或 --host
连接的数据库主机的地址
-t 或 --threads
备份并发线程数
-r 或 --rows
用于开启表内并发加速导出。默认值是 0,表示不开启。取值大于 0 表示开启,取值是 INT 类型。当数据源为 TiDB 时,设置 -r 参数大于 0 表示使用 TiDB region 信息划分区间,同时减少内存使用。具体取值不影响划分算法。对数据源为 MySQL 且表的主键是 INT 的场景,该参数也有表内并发效果。
-L 或 --logfile
日志输出地址,为空时会输出到控制台
--loglevel
日志级别 {debug,info,warn,error,dpanic,panic,fatal}
--logfmt
日志输出格式 {text,json}
-d 或 --no-data
不导出数据,适用于只导出 schema 场景
--no-header
导出 csv 格式的 table 数据,不生成 header
-W 或 --no-views
不导出 view
-m 或 --no-schemas
不导出 schema,只导出数据
-s 或--statement-size
控制 INSERT SQL 语句的大小,单位 bytes
-F 或 --filesize
将 table 数据划分出来的文件大小,需指明单位(如 128B, 64KiB, 32MiB, 1.5GiB)
--filetype
导出文件类型(csv/sql)
-o 或 --output
导出本地文件路径或外部存储 URL 格式
-S 或 --sql
根据指定的 sql 导出数据,该选项不支持并发导出
--consistency
flush: dump 前用 FTWRLsnapshot: 通过 TSO 来指定 dump 某个快照时间点的 TiDB 数据lock: 对需要 dump 的所有表执行 lock tables read 命令none: 不加锁 dump,无法保证一致性auto: 对 MySQL 使用 --consistency flush;对 TiDB 使用 --consistency snapshot
--snapshot
snapshot tso,只在 consistency=snapshot 下生效
--where
对备份的数据表通过 where 条件指定范围
-p 或 --password
连接的数据库主机的密码
-P 或 --port
连接的数据库主机的端口
-u 或 --user
连接的数据库主机的用户名
--dump-empty-database
导出空数据库的建库语句
--ca
用于 TLS 连接的 certificate authority 文件的地址
--cert
用于 TLS 连接的 client certificate 文件的地址
--key
用于 TLS 连接的 client private key 文件的地址
--csv-delimiter
csv 文件中字符类型变量的定界符
--csv-separator
csv 文件中各值的分隔符,如果数据中可能有逗号,建议源文件导出时分隔符使用非常见组合字符
--csv-null-value
csv 文件空值的表示
--escape-backslash
使用反斜杠 (\) 来转义导出文件中的特殊字符
--output-filename-template
以 golang template 格式表示的数据文件名格式支持 {{.DB}}、{{.Table}}、{{.Index}} 三个参数分别表示数据文件的库名、表名、分块 ID
--status-addr
Dumpling 的服务地址,包含了 Prometheus 拉取 metrics 信息及 pprof 调试的地址
--tidb-mem-quota-query
单条 dumpling 命令导出 SQL 语句的内存限制,单位为 byte。对于 v4.0.10 或以上版本,若不设置该参数,默认使用 TiDB 中的 mem-quota-query 配置项值作为内存限制值。对于 v4.0.10 以下版本,该参数值默认为 32 GB
--params
为需导出的数据库连接指定 session 变量,可接受的格式: "character_set_client=latin1,character_set_connection=latin1"
-c 或 --compress
压缩 Dumpling 导出的 CSV、SQL 数据与表结构文件为指定格式,支持 "gzip"、"snappy" 和 "zstd" 压缩算法
TiDB Lightning 是用于从静态文件导入 TB 级数据到 TiDB 集群的工具,常用于 TiDB 集群的初始化数据导入。
下载 TiDB Lightning 安装包
解压 Lightning 压缩包即可获得 tidb-lightning 可执行文件。
tar -zxvf tidb-lightning-${version}-linux-amd64.tar.gz
chmod +x tidb-lightning
特性
作用域
所需权限
备注
必需
基本功能
目标 table
CREATE,SELECT,INSERT,UPDATE,DELETE,DROP,ALTER
DROP 仅 tidb-lightning-ctl 在执行 checkpoint-destroy-all 时需要
目标 database
CREATE
必需
Logical Import Mode
information_schema.columns
SELECT
Physical Import Mode
mysql.tidb
SELECT
-
SUPER
-
RESTRICTED_VARIABLES_ADMIN,RESTRICTED_TABLES_ADMIN
当目标 TiDB 开启 SEM
推荐
冲突检测,max-error
lightning.task-info-schema-name 配置的 schema
SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
如不需要,该值必须设为""
可选
并行导入
lightning.meta-schema-name 配置的 schema
SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
如不需要,该值必须设为""
可选
checkpoint.driver = "mysql"
checkpoint.schema 设置
SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
使用数据库而非文件形式存放 checkpoint 信息时需要
目标 TiKV 集群必须有足够空间接收新导入的数据。除了标准硬件配置以外,目标 TiKV 集群的总存储空间必须大于 数据源大小 × 副本数量 × 2。例如集群默认使用 3 副本,那么总存储空间需为数据源大小的 6 倍以上。公式中的 2 倍可能难以理解,其依据是以下因素的估算空间占用:
索引会占据额外的空间
RocksDB 的空间放大效应
目前无法精确计算 Dumpling 从 MySQL 导出的数据大小,但你可以用下面 SQL 语句统计信息表的 data_length 字段估算数据量:
统计所有 schema 大小,单位 MiB,注意修改 ${schema_name}
SELECT table_schema, SUM(data_length)/1024/1024 AS data_length, SUM(index_length)/1024/1024 AS index_length, SUM(data_length+index_length)/1024/1024 AS sum FROM information_schema.tables WHERE table_schema = "${schema_name}" GROUP BY table_schema;
统计最大单表,单位 MiB,注意修改 ${schema_name}
SELECT table_name, table_schema, SUM(data_length)/1024/1024 AS data_length, SUM(index_length)/1024/1024 AS index_length, SUM(data_length+index_length)/1024/1024 AS sum FROM information_schema.tables WHERE table_schema = "${schema_name}" GROUP BY table_name,table_schema ORDER BY sum DESC LIMIT 5;
TiDB Lightning 支持从多种类型的文件导入数据到 TiDB 集群。
通过以下配置为 TiDB Lightning 指定数据文件所在位置。
[mydumper]
# 本地源数据目录或 S3 等外部存储 URL
data-source-dir = "/data/my_database"
TiDB Lightning 运行时将查找 data-source-dir 中所有符合命令规则的文件。
数据源命名规则如下:
${db_name}.${table_name}-schema.sql
${db_name}-schema-create.sql
${db_name}.${table_name}.${csv|sql|parquet}
${db_name}.${table_name}.001.${csv|sql|parquet}
${db_name}.${table_name}.${csv|sql|parquet}.{compress}
CSV格式的数据
CSV 格式可在 tidb-lightning.toml 文件中 [mydumper.csv] 下配置。大部分设置项在 MySQL [LOAD DATA] 语句中都有对应的项目。
SQL格式的数据
TiDB Lightning 在处理 SQL 文件时,由于无法对单个文件进行快速分割,因此无法通过增加并发提高单个文件的导入速度。鉴于此,导出数据为 SQL 文件时应尽量避免单个 SQL 文件过大,通常单文件在 256MiB 左右可以达到最佳性能。
Physical Import Mode 不经过 SQL 接口,而是直接将数据以键值对的形式插入 TiKV 节点,是一种高效、快速的导入模式。使用 Physical Import Mode 时,单个 Lightning 实例可导入的数据量为 10 TiB
Physical Import Mode 对应的后端模式为 local。
使用限制:
▪TiDB Lightning 不支持导入数据到已有业务写入的数据表;
▪请勿直接使用 Physical Import Mode 向已经投入生产的 TiDB 集群导入数据,这将对在线业务产生严重影响;
▪不应同时启动多个 TiDB Lightning 实例向同一 TiDB 集群导入数据,而应考虑使用并行导入特性。
▪不可同时使用 Physical Import Mode 和 Logical Import Mode 导入同一 TiDB 集群。
▪导入数据的过程中,请勿在目标表进行 DDL 和 DML 操作,否则会导致导入失败或数据不一致。
▪单个 TiDB Lightning 进程导入单表不应超过 10 TB。
在 Logical Import Mode 下,TiDB Lightning 先将数据编码成 SQL,然后直接运行这些 SQL 语句进行数据导入。对于已有数据、对外提供服务的 TiDB 集群,推荐使用 Logical Import Mode 导入数据。Logical Import Mode 的行为与正常执行 SQL 并无差异,可保证 ACID。
Logical Import Mode 对应的后端模式为 tidb。
使用限制:
▪不可同时使用 Physical Import Mode 和 Logical Import Mode 导入同一 TiDB 集群。
[lightning]
# 日志
level = "info"
file = "tidb-lightning.log"
max-size = 128 # MB
max-days = 28
max-backups = 14
# 启动之前检查集群是否满足最低需求。
check-requirements = true
[mydumper]
# 本地源数据目录或外部存储 URL
data-source-dir = "/data/my_database"
[tikv-importer]
# 导入模式配置,设为 local 即使用 Physical Import Mode
backend = "local"
# 冲突数据处理方式
duplicate-resolution = remove
# 本地进行 KV 排序的路径。
sorted-kv-dir = "./some-dir"
# 限制 TiDB Lightning 向每个 TiKV 节点写入的带宽大小,默认为 0,表示不限制。
# store-write-bwlimit = "128MiB"
[tidb]
# 目标集群的信息。tidb-server 的地址,填一个即可。
host = "172.16.31.1"
port = 4000
user = "root"
# 设置连接 TiDB 的密码,可为明文或 Base64 编码。
password = ""
# 必须配置。表结构信息从 TiDB 的“status-port”获取。
status-port = 10080
# 必须配置。pd-server 的地址,填一个即可。
pd-addr = "172.16.31.4:2379"
# tidb-lightning 引用了 TiDB 库,并生成产生一些日志。
# 设置 TiDB 库的日志等级。
log-level = "error"
# 注意:
# 1. Checksum 对比失败通常表示导入异常(数据丢失或数据不一致),因此建议总是开启 Checksum。
# 2. 考虑到与旧版本的兼容性,依然可以在本配置项设置 `true` 和 `false` 两个布尔值,其效果与 `required` 和 `off` 相同。
checksum = "required"
# 配置是否在 CHECKSUM 结束后对所有表逐个执行 `ANALYZE TABLE <table>` 操作。
# 此配置的可选配置项与 `checksum` 相同,但默认值为 "optional"。
analyze = "optional"
[lightning]
# 日志
level = "info"
file = "tidb-lightning.log"
max-size = 128 # MB
max-days = 28
max-backups = 14
# 启动之前检查集群是否满足最低需求。
check-requirements = true
[mydumper]
# 本地源数据目录或外部存储 URL
data-source-dir = "/data/my_database"
[tikv-importer]
# 导入模式配置,设为 tidb 即使用 Logical Import Mode
backend = "tidb"
# Logical Import Mode 插入重复数据时执行的操作。
# - replace:新数据替代已有数据
# - ignore:保留已有数据,忽略新数据
# - error:中止导入并报错
on-duplicate = "replace"
[tidb]
# 目标集群的信息。tidb-server 的地址,填一个即可。
host = "172.16.31.1"
port = 4000
user = "root"
# 设置连接 TiDB 的密码,可为明文或 Base64 编码。
password = ""
# tidb-lightning 引用了 TiDB 库,并生成产生一些日志。
# 设置 TiDB 库的日志等级。
log-level = "error"
[checkpoint]
# 启用断点续传。
# 导入时,TiDB Lightning 会记录当前进度。
# 若 TiDB Lightning 或其他组件异常退出,在重启时可以避免重复再导入已完成的数据。
enable = true
# 存储断点的方式
# - file:存放在本地文件系统(要求 v2.1.1 或以上)
# - mysql:存放在兼容 MySQL 的数据库服务器
driver = "file"
# 存储断点的架构名称(数据库名称)
# 仅在 driver = "mysql" 时生效
# schema = "tidb_lightning_checkpoint"
# 断点的存放位置
# 若 driver = "file",此参数为断点信息存放的文件路径。
# 如果不设置该参数则默认为 `/tmp/CHECKPOINT_SCHEMA.pb`
# 若 driver = "mysql",此参数为数据库连接参数 (DSN),格式为“用户:密码@tcp(地址:端口)/”。
# 默认会重用 [tidb] 设置目标数据库来存储断点。
# 为避免加重目标集群的压力,建议另外使用一个兼容 MySQL 的数据库服务器。
# dsn = "/tmp/tidb_lightning_checkpoint.pb"
# 导入成功后是否保留断点。默认为删除。
# 保留断点可用于调试,但有可能泄漏数据源的元数据。
# keep-after-success = false
--checkpoint-error-destroy
该命令会让失败的表从头开始整个导入过程.
示例:tidb-lightning-ctl --checkpoint-error-destroy=`schema`.`table`
tidb-lightning-ctl --checkpoint-error-destroy=all
--checkpoint-error-ignore
这条命令会清除出错状态
示例:tidb-lightning-ctl --checkpoint-error-ignore=`schema`.`table`
tidb-lightning-ctl --checkpoint-error-ignore=all
--checkpoint-remove
无论是否有出错,把表的断点清除。
示例:tidb-lightning-ctl --checkpoint-remove=`schema`.`table`
tidb-lightning-ctl --checkpoint-remove=all
--checkpoint-dump
将所有断点备份到传入的文件夹,主要用于技术支持。此选项仅于 driver = "mysql" 时有效。
示例:tidb-lightning-ctl --checkpoint-dump=output/directory
通过支持同步启动多个实例,并行导入不同的单表或多表的不同数据,使 TiDB Lightning 具备水平扩展的能力,可大大降低导入大量数据所需的时间。
注意
▪并行导入只支持初始化 TiDB 的空表,不支持导入数据到已有业务写入的数据表,否则可能会导致数据不一致的情况。
▪并行导入一般用于Physical Import模式,需要设置 incremental-import = true
▪并行导入一般用于Physical Import模式;虽然也能用于 Logical Import 模式,但是一般不会带来明显的性能提升。
使用 TiDB Lightning 并行导入需要设置 incremental-import = true。TiDB Lightning 在启动时,会在下游 TiDB 中注册元信息,并自动检测是否有其他实例向目标集群导入数据。如果有,则自动进入并行导入模式。
使用限制
TiDB Lightning 在运行时,需要独占部分资源,因此如果需要在单台机器上面部署多个 TiDB Lightning 实例(不建议生产环境使用)或多台机器共享磁盘存储时,需要注意如下使用限制:
每个 TiDB Lightning 实例的 tikv-importer.sorted-kv-dir 必须设置为不同的路径。多个实例共享相同的路径会导致非预期的行为,可能导致导入失败或数据出错。
每个 TiDB Lightning 的 checkpoint 需要分开存储。checkpoint 的详细配置见 TiDB Lightning 断点续传。
如果设置 checkpoint.driver = "file"(默认值),需要确保每个实例设置的 checkpoint 的路径不同。
如果设置 checkpoint.driver = "mysql",需要为每个实例设置不同的 schema。
每个 TiDB Lightning 的 log 文件应该设置为不同的路径。共享同一个 log 文件将不利于日志的查询和排查问题。
如果开启Web 界面或 Debug API,需要为每个实例的lightning.status-addr设置不同地址,否则,TiDB Lightning 进程会由于端口冲突无法启动。
TiCDC 是一款 TiDB 增量数据同步工具,通过拉取上游 TiKV 的数据变更日志,TiCDC 可以将数据解析为有序的行级变更数据输出到下游。
在使用 TiUP 部署全新 TiDB 集群时,支持同时部署 TiCDC 组件。你需要在 TiUP 启动 TiDB 集群时的配置文件中加入 TiCDC 相关的部分,以下是一个示例:
cdc_servers:
- host: 10.0.1.20
gc-ttl: 86400
data_dir: "/cdc-data"
- host: 10.0.1.21
gc-ttl: 86400
data_dir: "/cdc-data"
使用 TiUP 可以方便地终止和启动 TiCDC 节点,命令如下:
终止 TiCDC 节点:tiup cluster stop -R cdc
启动 TiCDC 节点:tiup cluster start -R cdc
重启 TiCDC 节点:tiup cluster restart -R cdc
查看cdc集群运行状态
tiup ctl:v<CLUSTER_VERSION> cdc capture list --server=http://10.0.10.25:8300
使用以下命令来创建同步任务:
cdc cli changefeed create \
--server=http://10.0.10.25:8300 \
--sink-uri="s3://logbucket/storage_test?protocol=canal-json" \
--changefeed-id="simple-replication-task"
参数解释:
--server:TiCDC 集群中任意一个 TiCDC 服务器的地址。
--changefeed-id:同步任务的 ID。格式需要符合正则表达式 ^[a-zA-Z0-9]+(\-[a-zA-Z0-9]+)*$。如果不指定该 ID,TiCDC 会自动生成一个 UUID(version 4 格式)作为 ID。
--sink-uri:同步任务下游的地址。具体可参考配置 Sink URI。
--start-ts:指定 changefeed 的开始 TSO。TiCDC 集群将从这个 TSO 开始拉取数据。默认为当前时间。
--target-ts:指定 changefeed 的目标 TSO。TiCDC 集群拉取数据直到这个 TSO 停止。默认为空,即 TiCDC 不会自动停止。
--config:指定 changefeed 配置文件
NFS 配置样例如下:
--sink-uri="file:///my-directory/prefix?protocol=canal-json"
TiDB Binlog 是一个用于收集 TiDB 的 binlog,并提供准实时备份和同步功能的商业工具。
TiDB Binlog 支持以下功能场景:
数据同步:同步 TiDB 集群数据到其他数据库
实时备份和恢复:备份 TiDB 集群数据,同时可以用于 TiDB 集群故障时恢复
TiDB Binlog 集群主要分为 Pump 和 Drainer 两个组件,以及 binlogctl 工具:
Pump
Pump 用于实时记录 TiDB 产生的 Binlog,并将 Binlog 按照事务的提交时间进行排序,再提供给 Drainer 进行消费。
Drainer
Drainer 从各个 Pump 中收集 Binlog 进行归并,再将 Binlog 转化成 SQL 或者指定格式的数据,最终同步到下游。
binlogctl 工具
binlogctl 是一个 TiDB Binlog 配套的运维工具,具有如下功能:
获取 TiDB 集群当前的 TSO
查看 Pump/Drainer 状态
修改 Pump/Drainer 状态
暂停/下线 Pump/Drainer
(1)工具包
TiDB Binlog 安装包位于 TiDB 离线工具包中。解压后使用
pump-v6.5.2-linux-amd64.tar.gz
drainer-v6.5.2-linux-amd64.tar.gz
tar -zxvf pump-v6.5.2-linux-amd64.tar.gz
tar -zxvf drainer-v6.5.2-linux-amd64.tar.gz
(2)使用TIUP部署:
在TIDB的配置文件中,配置BINLOG
场景
配置任务
配置文件模板
拓扑说明
使用 TiDB Binlog 进行增量同步
部署 TiDB Binlog 拓扑架构
简单 TiDB Binlog 配置模板(下游为 MySQL)简单 TiDB Binlog 配置模板(下游为 file)详细 TiDB Binlog 配置模板
在最小拓扑的基础上部署 TiDB Binlog。
参考配置如下:
server_configs:
tidb:
binlog.enable: true
binlog.ignore-error: true
pump_servers:
- host: 10.0.1.1
- host: 10.0.1.2
- host: 10.0.1.3
drainer_servers:
- host: 10.0.1.12
# drainer meta data directory path
data_dir: "/path/to/save/data"
config:
syncer.db-type: "file"
# directory to save binlog file, default same as data-dir(save checkpoint file) if this is not configured.
# syncer.to.dir: "/path/to/save/binlog"
详细配置请参考(github网站访问不稳定,可使用加速工具,如Watt Toolkit):
https://github.com/pingcap/docs-cn/blob/master/config-templates/complex-tidb-binlog.yaml
Pump/Drainer 的使用
Pump/Drainer 中状态的定义:
online:正常运行中
pausing:暂停中
paused:已暂停
closing:下线中
offline:已下线
依赖包:epel-release gcc systemd-devel
cpp.x86_64 0:4.8.5-44.el7
glibc-devel.x86_64 0:2.17-326.el7_9
glibc-headers.x86_64 0:2.17-326.el7_9
kernel-headers.x86_64 0:3.10.0-1160.71.1.el7
libmpc.x86_64 0:1.0.1-3.el7
mpfr.x86_64 0:3.1.1-4.el7
gcc-4.8.5-44.el7.x86_64.rpm
以上依赖包的附属依赖包太多,所以此处只下载以上依赖包,强制安装
# rpm -ivh *.rpm --force --nodeps
https://github.com/haproxy/haproxy/archive/refs/tags/v2.5.0.zip
此处下载2.5版本的zip包
安装
解压zip包,进入对应文件夹目录,编译,安装,配置
前提make和make cc可用
# cd haproxy-2.5.0
# make clean
# make -j 8 TARGET=linux-glibc USE_THREAD=1
# make PREFIX=/usr/local/haproxy_v2.5.0 SBINDIR=/usr/local/haproxy_v2.5.0/bin install
# ln -s /usr/local/haproxy_v2.5.0 /usr/local/haproxy
# echo export PATH=/usr/local/haproxy/bin:$PATH >> /etc/profile
# source /etc/profile
# which haproxy
/usr/local/haproxy/bin/haproxy
编辑haproxy.cfg文件,离线安装在解压包下目录examples里不会自动生成haproxy.cfg文件,需自行创建。
haproxy.cfg配置文件按照TIDB官方文档配置
注意:以下的全局部署中的/var/lib/haproxy文件夹如过启动时报错,需手动创建,按报错提示信息进行处理。
global
log 127.0.0.1 local1
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4096
nbthread 48
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
log global
retries 2
timeout connect 2s
timeout client 30000s
timeout server 30000s
listen admin_stats
bind 0.0.0.0:8080
mode http
option httplog
maxconn 10
stats refresh 30s
stats uri /haproxy
stats realm HAProxy
stats auth admin:admin
stats hide-version
stats admin if TRUE
listen tidb-cluster
bind 0.0.0.0:13390
mode tcp
balance leastconn
server tidb-1 10.9.18.229:4000 check inter 2000 rise 2 fall 3 server tidb-2 10.9.39.208:4000 check inter 2000 rise 2 fall 3
server tidb-3 10.9.64.166:4000 check inter 2000 rise 2 fall 3
具体设置字段解释请参考https://docs.pingcap.com/zh/tidb/v6.5/haproxy-best-practices#haproxy-%E5%9C%A8-tidb-%E4%B8%AD%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5
# /usr/local/haproxy/bin/haproxy -f haproxy.cfg
设置开机自启动
~]# cp /root/haproxy-2.5.0/examples/haproxy.init /etc/init.d/haproxy
~]# chmod +x /etc/init.d/haproxy
~]# ln -s /usr/local/haproxy/bin/haproxy /usr/sbin/
~]# chkconfig --add haproxy
~]# chkconfig haproxy on
~]# systemctl enable haproxy
~]# systemctl restart haproxy
~]# systemctl status haproxy
~]# systemctl start haproxy
~]# systemctl stop haproxy
TiDB侧配置文件加入proxy协议
需要配置使用 PROXY 协议连接 TiDB,配置后单节点tidb将无法直接登录
[tidb@tidb1]# tiup cluster edit-config tidb
在server_configs>>tidb中加入如下内容
server_configs:
tidb:
proxy-protocol.networks:21.72.124.42
其中,21.72.124.42为HAproxy安装地址。
配置完成后,重启tidb节点,检测是否生效
重启:
tiup cluster restart tidb -R tidb或者
tiup cluster restart tidb -N 21.72.124.38:4000,21.72.124.45:4000
其中,-R代表需要重启的角色,-N代表需要重启的节点
检测是否生效:
[tidb@tidb2 tidb]# mysql -uroot -h21.72.124.42 -P 13390 -e "select @@hostname;"
+------------+
| @@hostname |
+------------+
| tidb2 |
+------------+
[tidb@tidb2 tidb]# mysql -uroot -h21.72.124.42 -P 13390 -e "select @@hostname;"
+------------+
| @@hostname |
+------------+
| tidb3 |
+------------+
前提是修改各tidb节点的hostname
使用root登录各tidb节点,
# hostnamectl set-hostname tidb1
主控机上安装了tidb的alertmanager\grafana\prometheus组件,运行正常,页面运行正常,今天,在主控机上安装DM时,配置安装文件时将DM的alertmanager\grafana\prometheus组件和tidb的IP:PORT写成一样的了,安装DM完成后发现不对,查询tidb集群的上述组件状态正常,于是使用tiup dm destory dm删除了dm,再次查询TIDB的组件,已经Down了。
组件Down了以后,尝试tiup start tidb -R grafana和tiup satrt tidb -N ip:port,均无法启动起来,报错如下:
Error: Failed to start alertmanger:failed to start :21.72.124.43 alertmanager-9093,service,please check the instance’s log(/tidb-deploy/alertmanager-9093/log) for more detail,:excutor.ssh.execute_failed:Failed to execute command over SSH for ‘tidb@21.72.124.43:22’ {ssh_stderr:Failed to start alertmanger-9093.server: Unit not found.,ssh_stdout: , ssh_command: export LANG=C; PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin /usr/bin/sudo -H bash -c “systemctl deamon-reload && systemctl start alertmanager-9093.service”},cause:Process exited with status 5
有业务和数据在跑,所以我没法删除TIDB集群重建,也没办法停TIDB其他模块。
考虑到数据库正在运行,且其他模块正常运行,想尝试重新安装down掉的组件,安装时提示端口已被占用,于是,准备先下线Down掉的组件再重新安装,成功恢复了组件和页面状态。
组件ID
grafana组件 21.72.124.43:3000
altermanager组件 21.72.124.43:9093
prometheus组件 21.72.124.43:9090
下线处理:
# tiup cluster scale-in tidb -N 21.72.124.43:3000
# tiup cluster scale-in tidb -N 21.72.124.43:9093
# tiup cluster scale-in tidb -N 21.72.124.43:9090
观察状态
# tiup cluster display tidb
编辑yaml文件
vim grafana-scaleout.yaml
monitoring_servers:
- host: 21.72.124.43
grafana_servers:
- host: 21.72.124.43
alertmanager_servers:
- host: 21.72.124.43
重新安装上线
# tiup cluster scale-out tidb grafana-scaleout.yaml
检查状态&登录grafana和Dashboard页面
# tiup cluster display tidb
状态正常,页面正常(需等待一分钟左右刷新数据)
重新安装上线 scale-out 时,报错,根据报错提示显示,ssh互信失败,需重新配置互信,再执行扩容,一切正常
PS:DM安装过程中,执行的语句里有用户名密码,估计在安装中使上述三个组件模块的互信失效。
可能不需要下线重装组件,只需重新配置互信后,start一下可能就会正常,此方法暂未测试。
由于业务原因,需重新分配数据盘目录,操作思路:4个TiKV节点每两个下线,重新写好配置文件,重新上线。
同时下线2个KV节点
# tiup cluster scale-in tidb --node 21.72.124.40:20160
# tiup cluster scale-in tidb --node 21.72.124.50:20160
命令开始执行后,观察上述节点日志和pd、tidb日志,发现GC在给PD节点任务后,两个KV节点均未马上有日志产生,约10分钟后,KV日志报错,大概意思为要执行数据迁移到其他节点,但未连接到PD节点,使用命令tiup cluster display tidb观察,两KV节点一直处于OFFLINE状态,前台面板观察TIKV storge状态也未发生变化,此状态持续约2小时
思路:是否因为同时执行了2个节点下线任务,导致GC任务繁重,决定先恢复其中一个TIKV节点,然后修改GC检查时间,等待下线。
以下为操作流程:
1.处于offline状态的节点未成为tombstone前可以通过以下命令终止其下线过程(需在PD所在节点执行),使tikv重新成为UP状态,不适用已经删除tikv 数据目录或宕机的情况,部分情况该tikv可能需要重启。
终止下线:
curl -X POST http://pd_ip:pd_port/pd/api/v1/store/{store_id}/state\?state=Up
2. 通过pd-ctl config set 命令可以增大leader-schedule-limit、replica-schedule-limit、region-schedule-limit等参数增加leader/region的调度速度,加快下线过程,上述命令是用于控制PD侧调度命令的产生速度,实际的执行还收tikv侧的消费速度限制,通过pd-ctl store limit <store_id> <limit> 增加消费速度。
3. 再次观察下线过程
调整完的下线任务只剩一个节点,观察KV日志和PD日志,开始正常跑下线流程了,大约5分钟,下线完成,继续下线其他节点,约2-5分钟不等。
(1)系统部署时对于单机多tikv的情况一定要打上label标签,保障同一服务器上不同的tikv实例在isolation-level具有相同的label,避免将相同region的多个副本调度到同一服务器,从而因服务器故障造成多副本丢失。
(2)缩容tikv时应尽量提前进行leader/region转移,使缩容过程更加可控。
(3)缩容时、store处于offline状态时禁止使用--force参数,仅对宕机无法修复、数据目录被删除的场景使用。
(4)缩容多个tikv时要尽量一个一个的进行处理,避免一次下线多个时出现问题,尤其是同一服务器上的多个tikv。
(5)缩容时要保障其他的tikv节点有足够的磁盘空间接收转移的region。
(6)如果允许尽量使用高版本数据量。
(7)做完多副本失败恢复后要检查数据是否一致。
(8)注意使用tikv-ctl等工具时要不同的版本会有不一样的参数,如--db或--data-dir。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。