- 关于 TiDB
- 快速上手
- 部署集群
- 数据迁移
- 运维操作
- 监控与告警
- 故障诊断
- 性能调优
- 系统调优
- 软件调优
- SQL 性能调优
- SQL 性能调优概览
- 理解 TiDB 执行计划
- SQL 优化流程
- 控制执行计划
- 教程
- TiDB 工具
- 功能概览
- 适用场景
- 工具下载
- TiUP
- TiDB Operator
- Backup & Restore (BR)
- TiDB Binlog
- TiDB Lightning
- TiDB Data Migration
- TiCDC
- Dumpling
- sync-diff-inspector
- Loader
- Mydumper
- Syncer
- TiSpark
- 参考指南
- 架构
- 监控指标
- 安全加固
- 权限
- SQL
- SQL 语言结构和语法
- SQL 语句
ADD COLUMN
ADD INDEX
ADMIN
ADMIN CANCEL DDL
ADMIN CHECKSUM TABLE
ADMIN CHECK [TABLE|INDEX]
ADMIN SHOW DDL [JOBS|QUERIES]
ALTER DATABASE
ALTER INSTANCE
ALTER TABLE
ALTER USER
ANALYZE TABLE
BACKUP
BEGIN
CHANGE COLUMN
CHANGE DRAINER
CHANGE PUMP
COMMIT
CREATE [GLOBAL|SESSION] BINDING
CREATE DATABASE
CREATE INDEX
CREATE ROLE
CREATE SEQUENCE
CREATE TABLE LIKE
CREATE TABLE
CREATE USER
CREATE VIEW
DEALLOCATE
DELETE
DESC
DESCRIBE
DO
DROP [GLOBAL|SESSION] BINDING
DROP COLUMN
DROP DATABASE
DROP INDEX
DROP ROLE
DROP SEQUENCE
DROP STATS
DROP TABLE
DROP USER
DROP VIEW
EXECUTE
EXPLAIN ANALYZE
EXPLAIN
FLASHBACK TABLE
FLUSH PRIVILEGES
FLUSH STATUS
FLUSH TABLES
GRANT <privileges>
GRANT <role>
INSERT
KILL [TIDB]
LOAD DATA
LOAD STATS
MODIFY COLUMN
PREPARE
RECOVER TABLE
RENAME INDEX
RENAME TABLE
REPLACE
RESTORE
REVOKE <privileges>
REVOKE <role>
ROLLBACK
SELECT
SET DEFAULT ROLE
SET [NAMES|CHARACTER SET]
SET PASSWORD
SET ROLE
SET TRANSACTION
SET [GLOBAL|SESSION] <variable>
SHOW [BACKUPS|RESTORES]
SHOW ANALYZE STATUS
SHOW [GLOBAL|SESSION] BINDINGS
SHOW BUILTINS
SHOW CHARACTER SET
SHOW COLLATION
SHOW [FULL] COLUMNS FROM
SHOW CONFIG
SHOW CREATE SEQUENCE
SHOW CREATE TABLE
SHOW CREATE USER
SHOW DATABASES
SHOW DRAINER STATUS
SHOW ENGINES
SHOW ERRORS
SHOW [FULL] FIELDS FROM
SHOW GRANTS
SHOW INDEX [FROM|IN]
SHOW INDEXES [FROM|IN]
SHOW KEYS [FROM|IN]
SHOW MASTER STATUS
SHOW PLUGINS
SHOW PRIVILEGES
SHOW [FULL] PROCESSSLIST
SHOW PROFILES
SHOW PUMP STATUS
SHOW SCHEMAS
SHOW STATS_HEALTHY
SHOW STATS_HISTOGRAMS
SHOW STATS_META
SHOW STATUS
SHOW TABLE NEXT_ROW_ID
SHOW TABLE REGIONS
SHOW TABLE STATUS
SHOW [FULL] TABLES
SHOW [GLOBAL|SESSION] VARIABLES
SHOW WARNINGS
SHUTDOWN
SPLIT REGION
START TRANSACTION
TRACE
TRUNCATE
UPDATE
USE
- 数据类型
- 函数与操作符
- 约束
- 生成列
- SQL 模式
- 事务
- 垃圾回收 (GC)
- 视图
- 分区表
- 字符集和排序规则
- 系统表
mysql
- INFORMATION_SCHEMA
- Overview
ANALYZE_STATUS
CHARACTER_SETS
CLUSTER_CONFIG
CLUSTER_HARDWARE
CLUSTER_INFO
CLUSTER_LOAD
CLUSTER_LOG
CLUSTER_SYSTEMINFO
COLLATIONS
COLLATION_CHARACTER_SET_APPLICABILITY
COLUMNS
DDL_JOBS
ENGINES
INSPECTION_RESULT
INSPECTION_RULES
INSPECTION_SUMMARY
KEY_COLUMN_USAGE
METRICS_SUMMARY
METRICS_TABLES
PARTITIONS
PROCESSLIST
SCHEMATA
SEQUENCES
SESSION_VARIABLES
SLOW_QUERY
STATISTICS
TABLES
TABLE_CONSTRAINTS
TABLE_STORAGE_STATS
TIDB_HOT_REGIONS
TIDB_INDEXES
TIDB_SERVERS_INFO
TIFLASH_REPLICA
TIKV_REGION_PEERS
TIKV_REGION_STATUS
TIKV_STORE_STATUS
USER_PRIVILEGES
VIEWS
METRICS_SCHEMA
- UI
- CLI
- 命令行参数
- 配置文件参数
- 系统变量
- 存储引擎
- 遥测
- 错误码
- 通过拓扑 label 进行副本调度
- 常见问题解答 (FAQ)
- 版本发布历史
- 发布版本汇总
- v4.0
- v3.1
- v3.0
- v2.1
- v2.0
- v1.0
- 术语表
使用 TiDB Ansible 扩容缩容 TiDB 集群
TiDB 集群可以在不影响线上服务的情况下进行扩容和缩容。
对于生产环境,推荐使用 TiUP 进行集群扩缩容操作。自 v4.0 版本起,PingCAP 不再提供 TiDB Ansible 的扩缩容支持(废弃)。继续使用 TiDB Ansible 对 TiDB 集群进行扩缩容操作可能存在风险,因此不推荐该方式。
以下缩容示例中,被移除的节点没有混合部署其他服务;如果混合部署了其他服务,不能按如下操作。
假设拓扑结构如下所示:
Name | Host IP | Services |
---|---|---|
node1 | 172.16.10.1 | PD1 |
node2 | 172.16.10.2 | PD2 |
node3 | 172.16.10.3 | PD3, Monitor |
node4 | 172.16.10.4 | TiDB1 |
node5 | 172.16.10.5 | TiDB2 |
node6 | 172.16.10.6 | TiKV1 |
node7 | 172.16.10.7 | TiKV2 |
node8 | 172.16.10.8 | TiKV3 |
node9 | 172.16.10.9 | TiKV4 |
扩容 TiDB/TiKV 节点
例如,如果要添加两个 TiDB 节点(node101、node102),IP 地址为 172.16.10.101、172.16.10.102,可以进行如下操作:
编辑
inventory.ini
文件和hosts.ini
文件,添加节点信息。编辑
inventory.ini
:[tidb_servers] 172.16.10.4 172.16.10.5 172.16.10.101 172.16.10.102 [pd_servers] 172.16.10.1 172.16.10.2 172.16.10.3 [tikv_servers] 172.16.10.6 172.16.10.7 172.16.10.8 172.16.10.9 [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 172.16.10.7 172.16.10.8 172.16.10.9 172.16.10.101 172.16.10.102 [monitoring_servers] 172.16.10.3 [grafana_servers] 172.16.10.3
现在拓扑结构如下所示:
Name Host IP Services node1 172.16.10.1 PD1 node2 172.16.10.2 PD2 node3 172.16.10.3 PD3, Monitor node4 172.16.10.4 TiDB1 node5 172.16.10.5 TiDB2 node101 172.16.10.101 TiDB3 node102 172.16.10.102 TiDB4 node6 172.16.10.6 TiKV1 node7 172.16.10.7 TiKV2 node8 172.16.10.8 TiKV3 node9 172.16.10.9 TiKV4 编辑
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 172.16.10.7 172.16.10.8 172.16.10.9 172.16.10.101 172.16.10.102 [all:vars] username = tidb ntp_server = pool.ntp.org
初始化新增节点。
在中控机上配置部署机器 SSH 互信及 sudo 规则:
ansible-playbook -i hosts.ini create_users.yml -l 172.16.10.101,172.16.10.102 -u root -k
在部署目标机器上安装 NTP 服务:
ansible-playbook -i hosts.ini deploy_ntp.yml -u tidb -b
在部署目标机器上初始化节点:
ansible-playbook bootstrap.yml -l 172.16.10.101,172.16.10.102
注意如果
inventory.ini
中为节点配置了别名,如node101 ansible_host=172.16.10.101
,执行 ansible-playbook 时 -l 请指定别名,以下步骤类似。例如:ansible-playbook bootstrap.yml -l node101,node102
部署新增节点:
ansible-playbook deploy.yml -l 172.16.10.101,172.16.10.102
启动新节点服务:
ansible-playbook start.yml -l 172.16.10.101,172.16.10.102
更新 Prometheus 配置并重启:
ansible-playbook rolling_update_monitor.yml --tags=prometheus
打开浏览器访问监控平台:
http://172.16.10.3:3000
,监控整个集群和新增节点的状态。可使用同样的步骤添加 TiKV 节点。但如果要添加 PD 节点,则需手动更新一些配置文件。
扩容 PD 节点
例如,如果要添加一个 PD 节点(node103),IP 地址为 172.16.10.103,可以进行如下操作:
编辑
inventory.ini
文件,添加节点信息置于[pd_servers]
主机组最后一行:[tidb_servers] 172.16.10.4 172.16.10.5 [pd_servers] 172.16.10.1 172.16.10.2 172.16.10.3 172.16.10.103 [tikv_servers] 172.16.10.6 172.16.10.7 172.16.10.8 172.16.10.9 [monitored_servers] 172.16.10.4 172.16.10.5 172.16.10.1 172.16.10.2 172.16.10.3 172.16.10.103 172.16.10.6 172.16.10.7 172.16.10.8 172.16.10.9 [monitoring_servers] 172.16.10.3 [grafana_servers] 172.16.10.3
现在拓扑结构如下所示:
Name Host IP Services node1 172.16.10.1 PD1 node2 172.16.10.2 PD2 node3 172.16.10.3 PD3, Monitor node103 172.16.10.103 PD4 node4 172.16.10.4 TiDB1 node5 172.16.10.5 TiDB2 node6 172.16.10.6 TiKV1 node7 172.16.10.7 TiKV2 node8 172.16.10.8 TiKV3 node9 172.16.10.9 TiKV4 初始化新增节点:
ansible-playbook bootstrap.yml -l 172.16.10.103
部署新增节点:
ansible-playbook deploy.yml -l 172.16.10.103
登录新增的 PD 节点,编辑启动脚本:
{deploy_dir}/scripts/run_pd.sh
移除
--initial-cluster="xxxx" \
配置,注意这里不能在行开头加注释符 #。添加
--join="http://172.16.10.1:2379" \
,IP 地址 (172.16.10.1) 可以是集群内现有 PD IP 地址中的任意一个。在新增 PD 节点中启动 PD 服务:
{deploy_dir}/scripts/start_pd.sh
注意启动前,需要通过 PD Control 工具确认当前 PD 节点的
health
状态均为 "true",否则 PD 服务会启动失败,同时日志中报错["join meet error"] [error="etcdserver: unhealthy cluster"]
。使用
pd-ctl
检查新节点是否添加成功:/home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://172.16.10.1:2379" -d member
启动监控服务:
ansible-playbook start.yml -l 172.16.10.103
注意如果使用了别名(inventory_name),则也需要使用
-l
指定别名。更新集群的配置:
ansible-playbook deploy.yml
重启 Prometheus,新增扩容的 PD 节点的监控:
ansible-playbook stop.yml --tags=prometheus ansible-playbook start.yml --tags=prometheus
打开浏览器访问监控平台:
http://172.16.10.3:3000
,监控整个集群和新增节点的状态。
TiKV 中的 PD Client 会缓存 PD 节点列表,但目前不会定期自动更新,只有在 PD leader 发生切换或 TiKV 重启加载最新配置后才会更新;为避免 TiKV 缓存的 PD 节点列表过旧的风险,在扩缩容 PD 完成后,PD 集群中至少要包含两个扩缩容操作前就已经存在的 PD 节点成员,如果不满足该条件需要手动执行 PD transfer leader 操作,更新 TiKV 中的 PD 缓存列表。
缩容 TiDB 节点
例如,如果要移除一个 TiDB 节点(node5),IP 地址为 172.16.10.5,可以进行如下操作:
停止 node5 节点上的服务:
ansible-playbook stop.yml -l 172.16.10.5
编辑
inventory.ini
文件,移除节点信息:[tidb_servers] 172.16.10.4 #172.16.10.5 # 注释被移除节点 [pd_servers] 172.16.10.1 172.16.10.2 172.16.10.3 [tikv_servers] 172.16.10.6 172.16.10.7 172.16.10.8 172.16.10.9 [monitored_servers] 172.16.10.4 #172.16.10.5 # 注释被移除节点 172.16.10.1 172.16.10.2 172.16.10.3 172.16.10.6 172.16.10.7 172.16.10.8 172.16.10.9 [monitoring_servers] 172.16.10.3 [grafana_servers] 172.16.10.3
现在拓扑结构如下所示:
Name Host IP Services node1 172.16.10.1 PD1 node2 172.16.10.2 PD2 node3 172.16.10.3 PD3, Monitor node4 172.16.10.4 TiDB1 node5 172.16.10.5 TiDB2 已删除 node6 172.16.10.6 TiKV1 node7 172.16.10.7 TiKV2 node8 172.16.10.8 TiKV3 node9 172.16.10.9 TiKV4 更新 Prometheus 配置并重启:
ansible-playbook rolling_update_monitor.yml --tags=prometheus
打开浏览器访问监控平台:
http://172.16.10.3:3000
,监控整个集群的状态。
缩容 TiKV 节点
例如,如果要移除一个 TiKV 节点(node9),IP 地址为 172.16.10.9,可以进行如下操作:
使用
pd-ctl
从集群中移除节点:查看 node9 节点的 store id:
/home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://172.16.10.1:2379" -d store
从集群中移除 node9,假如 store id 为 10:
/home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://172.16.10.1:2379" -d store delete 10
使用 Grafana 或者
pd-ctl
检查节点是否下线成功(下线需要一定时间,下线节点的状态变为 Tombstone 就说明下线成功了):/home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://172.16.10.1:2379" -d store 10
下线成功后,停止 node9 上的服务:
ansible-playbook stop.yml -l 172.16.10.9
编辑
inventory.ini
文件,移除节点信息:[tidb_servers] 172.16.10.4 172.16.10.5 [pd_servers] 172.16.10.1 172.16.10.2 172.16.10.3 [tikv_servers] 172.16.10.6 172.16.10.7 172.16.10.8 #172.16.10.9 # 注释被移除节点 [monitored_servers] 172.16.10.4 172.16.10.5 172.16.10.1 172.16.10.2 172.16.10.3 172.16.10.6 172.16.10.7 172.16.10.8 #172.16.10.9 # 注释被移除节点 [monitoring_servers] 172.16.10.3 [grafana_servers] 172.16.10.3
现在拓扑结构如下所示:
Name Host IP Services node1 172.16.10.1 PD1 node2 172.16.10.2 PD2 node3 172.16.10.3 PD3, Monitor node4 172.16.10.4 TiDB1 node5 172.16.10.5 TiDB2 node6 172.16.10.6 TiKV1 node7 172.16.10.7 TiKV2 node8 172.16.10.8 TiKV3 node9 172.16.10.9 TiKV4 已删除 更新 Prometheus 配置并重启:
ansible-playbook rolling_update_monitor.yml --tags=prometheus
打开浏览器访问监控平台:
http://172.16.10.3:3000
,监控整个集群的状态。
缩容 PD 节点
例如,如果要移除一个 PD 节点(node2),IP 地址为 172.16.10.2,可以进行如下操作:
使用
pd-ctl
从集群中移除节点:查看 node2 节点的 name:
/home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://172.16.10.1:2379" -d member
从集群中移除 node2,假如 name 为 pd2:
/home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://172.16.10.1:2379" -d member delete name pd2
使用
pd-ctl
检查节点是否下线成功(PD 下线会很快,结果中没有 node2 节点信息即为下线成功):/home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://172.16.10.1:2379" -d member
下线成功后,停止 node2 上的服务:
ansible-playbook stop.yml -l 172.16.10.2
注意此示例中
172.16.10.2
服务器上只有 PD 节点才可以如上操作,如果该服务器上还有其他服务(例如TiDB
),则还需要使用-t
来指定服务(例如-t tidb
)。编辑
inventory.ini
文件,移除节点信息:[tidb_servers] 172.16.10.4 172.16.10.5 [pd_servers] 172.16.10.1 #172.16.10.2 # 注释被移除节点 172.16.10.3 [tikv_servers] 172.16.10.6 172.16.10.7 172.16.10.8 172.16.10.9 [monitored_servers] 172.16.10.4 172.16.10.5 172.16.10.1 #172.16.10.2 # 注释被移除节点 172.16.10.3 172.16.10.6 172.16.10.7 172.16.10.8 172.16.10.9 [monitoring_servers] 172.16.10.3 [grafana_servers] 172.16.10.3
现在拓扑结构如下所示:
Name Host IP Services node1 172.16.10.1 PD1 node2 172.16.10.2 PD2 已删除 node3 172.16.10.3 PD3, Monitor node4 172.16.10.4 TiDB1 node5 172.16.10.5 TiDB2 node6 172.16.10.6 TiKV1 node7 172.16.10.7 TiKV2 node8 172.16.10.8 TiKV3 node9 172.16.10.9 TiKV4 更新集群的配置:
ansible-playbook deploy.yml
重启 Prometheus,移除缩容的 PD 节点的监控:
ansible-playbook stop.yml --tags=prometheus ansible-playbook start.yml --tags=prometheus
打开浏览器访问监控平台:
http://172.16.10.3:3000
,监控整个集群的状态。
TiKV 中的 PD Client 会缓存 PD 节点列表,但目前不会定期自动更新,只有在 PD leader 发生切换或 TiKV 重启加载最新配置后才会更新;为避免 TiKV 缓存的 PD 节点列表过旧的风险,在扩缩容 PD 完成后,PD 集群中至少要包含两个扩缩容操作前就已经存在的 PD 节点成员,如果不满足该条件需要手动执行 PD transfer leader 操作,更新 TiKV 中的 PD 缓存列表。