TiDB的操作维护相较其它开源数据库如MySQL要简便很多,安装升级等操作基本可以一键完成,本文简要介绍了TiDB的版本升级、扩缩容以及日常操作维护等。


1、TiDB版本升级

在这里插入图片描述

TiDB支持滚动升级,使用TiUP可以在线升级,也可以使用TiUP进行离线升级。如果是基于K8S部署的,也可以使用TiDB Operator进行升级。TiDB 4.0之前的版本则使用TiDB Ansible的方式进行升级。本部分主要介绍使用TiUP进行在线和离线升级。

1.1 使用TiUP升级
1.1.1 将集群升级到指定版本

使用如下命令在线升级:

tiup cluster upgrade <cluster-name> <version>

以升级到 v4.0.0 版本为例:

tiup cluster upgrade tidb-test v4.0.0

滚动升级会逐个升级所有的组件,升级TiKV期间,会逐个将TiKV上的所有leader切走再停止该TiKV实例。默认超时时间为 5分钟,超过后会直接停止实例。

  • 如果不希望驱逐leader,而希望立刻升级,可以在命令中指定 --force,该方式会造成性能抖动,但是不会造成数据损失。
  • 如果希望保持性能稳定,则需要保证TiKV上的所有leader驱逐完成后再停止该TiKV实例,可以指定–transfer-timeout为一个超大值,如 --transfer-timeout 100000000,单位为s。
1.1.2 升级后验证

执行 display 命令来查看最新的集群版本 TiDB Version:

[root@tango-01 ~]# tiup cluster display tidb-test
Starting component `cluster`: /root/.tiup/components/cluster/v1.2.3/tiup-cluster display tidb-test
Cluster type:    tidb
Cluster name:    tidb-test
Cluster version: v4.0.0
SSH type:        builtin
1.2 使用TiUP离线升级
1.2.1 更新TiUP离线镜像
  1. 下载部署新版本的TiUP离线镜像
  2. 在执行 local_install.sh 后,TiUP会完成覆盖升级。

此时离线镜像已经更新成功。如果覆盖后发现TiUP运行报错,可能是manifest未更新导致,可尝试 rm -rf ~/.tiup/manifests 后再使用TiUP。

1.2.2 升级TiDB集群

在更新本地镜像后,可参考1.1部分内容升级TiDB集群。

2、TiDB扩缩容

在这里插入图片描述

TiDB集群可以在不中断线上服务的情况下进行扩容和缩容,扩缩容根据部署方式和版本不同有不同的方法,本部分介绍如何使用TiUP扩容缩容集群中的TiDB、TiKV、PD节点。

例如,集群原拓扑结构如下所示:

主机IP服务
192.168.112.101TiDB +PD+TiKV
192.168.112.102TiDB +PD+TiKV
192.168.112.103TiDB +PD+TiKV
192.168.112.10Monitor
2.1 扩容TiDB/PD/TiKV节点

如果要添加一个TiDB节点,IP 地址为192.168.112.10,可以按照如下步骤进行操作。

注意:添加PD节点和添加TiDB节点的步骤类似。添加TiKV节点前,建议预先根据集群的负载情况调整PD调度参数。

2.1.1 编写扩容拓扑配置

1)在scale-out.yaml文件添加扩容拓扑配置:

vi scale-out.yaml
tidb_servers:
  - host: 192.168.112.10
    ssh_port: 22
    port: 4000
    status_port: 10080
    deploy_dir: /data/deploy/install/deploy/tidb-4000
    log_dir: /data/deploy/install/log/tidb-4000

2)TiKV 配置文件参考:

tikv_servers:
  - host: 192.168.112.10
    ssh_port: 22
    port: 20160
    status_port: 20180
    deploy_dir: /data/deploy/install/deploy/tikv-20160
    data_dir: /data/deploy/install/data/tikv-20160
    log_dir: /data/deploy/install/log/tikv-20160

3)PD 配置文件参考:

pd_servers:
  - host: 192.168.112.10
    ssh_port: 22
    name: pd-1
    client_port: 2379
    peer_port: 2380
    deploy_dir: /data/deploy/install/deploy/pd-2379
    data_dir: /data/deploy/install/data/pd-2379
    log_dir: /data/deploy/install/log/pd-2379
2.1.2 执行扩容命令
tiup cluster scale-out tidb-test scale-out.yaml

预期输出 Scaled cluster tidb-test out successfully信息,表示扩容操作成功。

2.1.3 检查集群状态
tiup cluster display tidb-test

打开浏览器访问监控平台http://192.168.112.10:3000,监控整个集群和新增节点的状态。扩容后,集群拓扑结构如下所示:

主机IP服务
192.168.112.101TiDB +PD+TiKV
192.168.112.102TiDB +PD+TiKV
192.168.112.103TiDB +PD+TiKV
192.168.112.10Monitor+TiKV
2.2 缩容TiDB/PD/TiKV节点

如果要移除IP地址为192.168.112.10的一个 TiKV节点,可以按照如下步骤进行操作。

2.2.1 查看节点ID信息
[root@tango-01 src]# tiup cluster display tidb-test
Starting component `cluster`: /root/.tiup/components/cluster/v1.2.3/tiup-cluster display tidb-test
Cluster type:    tidb
Cluster name:    tidb-test
Cluster version: v4.0.0
SSH type:        builtin
ID                     Role          Host             Ports        OS/Arch       Status  Data Dir                      Deploy Dir
--                     ----          ----             -----        -------       ------  --------                      ----------
192.168.112.10:9093    alertmanager  192.168.112.10   9093/9094    linux/x86_64  Up      /tidb-data/alertmanager-9093  /tidb-deploy/alertmanager-9093
192.168.112.10:3000    grafana       192.168.112.10   3000         linux/x86_64  Up      -                             /tidb-deploy/grafana-3000
192.168.112.101:2379   pd            192.168.112.101  2379/2380    linux/x86_64  Up|L    /tidb-data/pd-2379            /tidb-deploy/pd-2379
192.168.112.102:2379   pd            192.168.112.102  2379/2380    linux/x86_64  Up|UI   /tidb-data/pd-2379            /tidb-deploy/pd-2379
192.168.112.103:2379   pd            192.168.112.103  2379/2380    linux/x86_64  Up      /tidb-data/pd-2379            /tidb-deploy/pd-2379
192.168.112.10:9090    prometheus    192.168.112.10   9090         linux/x86_64  Up      /tidb-data/prometheus-9090    /tidb-deploy/prometheus-9090
192.168.112.101:4000   tidb          192.168.112.101  4000/10080   linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
192.168.112.102:4000   tidb          192.168.112.102  4000/10080   linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
192.168.112.103:4000   tidb          192.168.112.103  4000/10080   linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
192.168.112.10:20160  tikv          192.168.112.10  20160/20180  linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
192.168.112.101:20160  tikv          192.168.112.101  20160/20180  linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
192.168.112.102:20160  tikv          192.168.112.102  20160/20180  linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
192.168.112.103:20160  tikv          192.168.112.103  20160/20180  linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
Total nodes: 13
2.2.2 执行缩容操作
tiup cluster scale-in tidb-test --node 192.168.112.10:20160

其中 --node 参数为需要下线节点的 ID。预期输出Scaled cluster tidb-test out successfully信息,表示缩容操作成功。

2.2.3 检查集群状态

下线需要一定时间,下线节点的状态变为 Tombstone 就说明下线成功。
执行如下命令检查节点是否下线成功:

tiup cluster display <cluster-name>
3、TiDB数据库管理操作

在这里插入图片描述

3.1 TiUP常见运维操作

使用TiUP运维TiDB集群的常见操作,包括查看集群列表、启动集群、查看集群状态、修改配置参数、关闭集群、销毁集群等。

3.1.1 查看集群列表

TiUP cluster组件可以用来管理多个TiDB集群,在每个TiDB集群部署完毕后,该集群会出现在TiUP的集群列表里,可以使用 list 命令来查看。

[root@tango-01 ~]# tiup cluster list
Starting component `cluster`: /root/.tiup/components/cluster/v1.2.3/tiup-cluster list
Name       User  Version  Path                                            PrivateKey
----       ----  -------  ----                                            ----------
tidb-test  tidb  v4.0.0   /root/.tiup/storage/cluster/clusters/tidb-test  /root/.tiup/storage/cluster/clusters/tidb-test/ssh/id_rsa
3.1.2 启动集群

启动集群操作会按PD -> TiKV -> Pump -> TiDB -> TiFlash -> Drainer的顺序启动整个TiDB集群所有组件(同时也会启动监控组件):

tiup cluster start ${cluster-name}

该命令支持通过-R和-N参数来只启动部分组件。例如,下列命令只启动PD组件:

tiup cluster start ${cluster-name} -R pd

注意:若通过-R和-N启动指定组件,需要保证启动顺序正确(例如需要先启动PD才能启动TiKV),否则可能导致启动失败。

3.1.3 查看集群状态

集群启动之后需要检查每个组件的运行状态,以确保每个组件工作正常。TiUP提供了display命令,节省了登陆到每台机器上去查看进程的时间。

tiup cluster display tidb-test
3.1.4 修改配置参数

集群运行过程中,如果需要调整某个组件的参数,可以使用 edit-config 命令来编辑参数。具体的操作步骤如下:

1)以编辑模式打开该集群的配置文件:

tiup cluster edit-config ${cluster-name}

2)设置参数:

首先确定配置的生效范围,有以下两种生效范围:

  • 如果配置的生效范围为该组件全局,则配置到 server_configs。例如:
server_configs:
  tidb:
    log.slow-threshold: 300
  • 如果配置的生效范围为某个节点,则配置到具体节点的 config 中。例如:
tidb_servers:
- host: 192.168.112.10
    port: 4000
    config:
        log.slow-threshold: 300

3)执行 reload 命令滚动分发配置、重启相应组件:

tiup cluster reload ${cluster-name} [-N <nodes>] [-R <roles>]
3.1.5 Hotfix版本替换

在某些场景下(例如Debug),可能需要用一个临时的包替换正在运行的组件,此时可以用 patch命令:

tiup cluster patch <cluster-name> <package-path> [flags]

例如,有一个TiDB实例的hotfix包放在/tmp/tidb-hotfix.tar.gz目录下。如果此时想要替换集群上的所有TiDB实例,则可以执行以下命令:

tiup cluster patch test-cluster /tmp/tidb-hotfix.tar.gz -R tidb

或者只替换其中一个TiDB实例:

tiup cluster patch test-cluster /tmp/tidb-hotfix.tar.gz -N 192.168.112.101:4000
3.1.6 重命名集群

部署并启动集群后,可以通过tiup cluster rename命令来对集群重命名:

tiup cluster rename ${cluster-name} ${new-name}

注意:

  • 重命名集群会重启监控(Prometheus 和 Grafana)
  • 重命名集群之后Grafana可能会残留一些旧集群名的面板,需要手动删除这些面板
3.1.7 关闭集群

关闭集群操作会按Drainer -> TiFlash -> TiDB -> Pump -> TiKV -> PD的顺序关闭整个TiDB集群所有组件(同时也会关闭监控组件):

tiup cluster stop ${cluster-name}

和 start 命令类似,stop 命令也支持通过-R和-N参数来只停止部分组件。例如,下列命令只停止TiDB组件:

tiup cluster stop ${cluster-name} -R tidb
3.1.8 清除集群数据

此操作会关闭所有服务,并清空其数据目录或/和日志目录,并且无法恢复,需要谨慎操作。

1)清空集群所有服务的数据,但保留日志:

tiup cluster clean ${cluster-name} --data

2)清空集群所有服务的日志,但保留数据:

tiup cluster clean ${cluster-name} --log

3)清空集群所有服务的数据和日志:

tiup cluster clean ${cluster-name} --all

4)清空Prometheus以外的所有服务的日志和数据:

tiup cluster clean ${cluster-name} --all --ignore-role prometheus

5)清空节点192.168.112.101:9000 以外的所有服务的日志和数据:

tiup cluster clean ${cluster-name} --all --ignore-node  192.168.112.101:9000

6)清空部署在192.168.112.101以外的所有服务的日志和数据:

tiup cluster clean ${cluster-name} --all --ignore-node  192.168.112.101
3.1.9 销毁集群

销毁集群操作会关闭服务,清空数据目录和部署目录,并且无法恢复,需要谨慎操作。

tiup cluster destroy ${cluster-name}
3.2 权限管理
3.2.1 与MySQL安全特性差异

除以下功能外,TiDB支持与MySQL 5.7类似的安全特性。

  • 仅支持 mysql_native_password 密码验证或证书验证登陆方案。
  • 不支持外部身份验证方式(如 LDAP)。
  • 不支持列级别权限设置。
  • 不支持密码过期,最后一次密码变更记录以及密码生存期。
  • 不支持权限属性max_questions,max_updated,max_connections 以及 max_user_connections。
  • 不支持密码验证。
3.2.2 TiDB权限管理

1)TiDB的权限管理包括授权GRANT、收回权限Revoke、查看用户权限Show Grants等。TiDB用户目前拥有的权限可以在INFORMATION_SCHEMA.USER_PRIVILEGES表中查找到。
在这里插入图片描述

2)TiDB权限相关的表全部存储在这几张表内

  • mysql.user:用户账户,全局权限
  • mysql.db:数据库级别的权限
  • mysql.tables_priv:表级别的权限
  • mysql.columns_priv:列级别的权限,当前暂不支持

这几张表包含了数据的生效范围和权限信息。例如,mysql.user表的部分数据:

SELECT User,Host,Select_priv,Insert_priv FROM mysql.user LIMIT 1;
+------|------|-------------|-------------+
| User | Host | Select_priv | Insert_priv |
+------|------|-------------|-------------+
| root | %    | Y           | Y           |
+------|------|-------------|-------------+

这条记录中,Host和User决定了root用户从任意主机(%)发送过来的连接请求可以被接受,而Select_priv和Insert_priv表示用户拥有全局的Select和Insert权限。mysql.user这张表里面的生效范围是全局的。

3.2.3 TiDB用户账户管理

TidB用户账户管理包括创建用户CREATE USER、删除用户DROP USER以及修改用户密码等。

3.3 数据误操作保护

当出现数据误操作如drop table的时候,可以通过flashback的方法进行数据恢复。

1)测试表误删除恢复

mysql -uroot -P4000 -h127.0.0.1 -e "drop table sbtest.sbtest1"
mysql -uroot -P4000 -h127.0.0.1 -e "flashback table sbtest.sbtest1"

2)测试表截断操作恢复

mysql -uroot -P4000 -h127.0.0.1 -e "truncate table sbtest.sbtest1"
mysql -uroot -P4000 -h127.0.0.1 -e "flashback table sbtest.sbtest1 to sbtest.sbtest1_tmp"

3)测试数据误删、误更新恢复

mysql -uroot -P4000 -h127.0.0.1 -e "delete from sbtest.sbtest1 limit 100000"

进入 MySQL 客户端执行如下 SQL,校验数据完整:

set tidb_snapshot='2020/07/10 15:00:00';
select count(*) from sbtest.sbtest1;
3.4 开启审计日志功能
3.4.1 创建用户审计规则

1)使用root登录,创建用户userA的审计规则

drop user 'userA';
drop user 'userB';
create user 'userA'@'%' identified by '123456'; 
grant create user on *.* to 'userA'@'%' with grant option;
grant select,update,delete,insert,reload on test.* to 'userA'@'%' with grant option;
grant create,alter,drop on test.* to 'userA'@'%' with grant option;
flush privileges;
insert into mysql.tidb_audit_table_access (user, db, tbl, access_type) values ("userA", 'test', '.*', 'Delete,Truncate,DropTable');

2)登录userA,并在一段时间后退出,观察tidb-audit.log 日志输出信息

3.4.2 用户管理审计

1)使用userA用户登录数据库,执行创建用户操作

create user 'userB'@'%' identified by '123456';
grant select on test.* to 'userB'@'%';

2)观察tidb-audit.log日志输出信息,EVENT_CLASS=GENERAL 的事件会审计userA用户执行的创建用户及授权的操作。

3.4.3 分布式数据库操作审计

1)使用root登录,创建用户root用户的审计规则

insert into mysql.tidb_audit_table_access (user, db, tbl, access_type) values ("root", '.*', '.*','');

2)使用root用户执行DML、DDL、DCL及DQL语句。

set global connect_timeout=100;
select * from test.t1;
delete from test.t1 limit 1;
truncate table test.t1;
drop table test.t1;
create table test.t2(id int prmary key);
alter table test.t2 add c varchar(10);
create user 'userC'@'%' identified by '123456';
grant all on *.* to 'userC'@'%';

3)查看tidb-audit.log审计日志

在这里插入图片描述

3.5 慢查询日志

TiDB会将执行时间超过slow-threshold(默认值为 300 毫秒)的语句输出到slow-query-file(默认值:“tidb-slow.log”)日志文件中,用于帮助用户定位慢查询语句,分析和解决SQL执行的性能问题。TiDB默认启用慢查询日志,可以修改配置enable-slow-log来启用或禁用它。

3.5.1 慢日志内存映射表

用户可通过查询INFORMATION_SCHEMA.SLOW_QUERY表来查询慢查询日志中的内容,表中列名和慢日志中字段名一一对应,表结构可查看SLOW_QUERY表 中的介绍。

注意:每次查询SLOW_QUERY表时,TiDB都会去读取和解析一次当前的慢查询日志。

TiDB 4.0 中,SLOW_QUERY已经支持查询任意时间段的慢日志,即支持查询已经被rotate的慢日志文件的数据。用户查询时只需要指定TIME时间范围即可定位需要解析的慢日志文件。如果查询不指定时间范围,则仍然只解析当前的慢日志文件,示例如下:

1)不指定时间范围时,只会解析当前 TiDB 正在写入的慢日志文件的慢查询数据:

select count(*),
       min(time),
       max(time)
from slow_query;
+----------+----------------------------+----------------------------+
| count(*) | min(time)                  | max(time)                  |
+----------+----------------------------+----------------------------+
| 122492   | 2020-03-11 23:35:20.908574 | 2020-03-25 19:16:38.229035 |
+----------+----------------------------+----------------------------+

2)指定查询2020-03-10 00:00:00到2020-03-11 00:00:00时间范围后,会定位指定时间范围内的慢日志文件后解析慢查询数据:

select count(*),
       min(time),
       max(time)
from slow_query
where time > '2020-03-10 00:00:00'
  and time < '2020-03-11 00:00:00';
+----------+----------------------------+----------------------------+
| count(*) | min(time)                  | max(time)                  |
+----------+----------------------------+----------------------------+
| 2618049  | 2020-03-10 00:00:00.427138 | 2020-03-10 23:00:22.716728 |
+----------+----------------------------+----------------------------+

注意:
TiDB 4.0中新增了CLUSTER_SLOW_QUERY系统表,用来查询所有 TiDB节点的慢查询信息,表结构在SLOW_QUERY的基础上多增加了INSTANCE列,表示该行慢查询信息来自的TiDB节点地址。使用方式和SLOW_QUERY系统表一样。关于查询CLUSTER_SLOW_QUERY表,TiDB会把相关的计算和判断下推到其他节点执行,而不是把其他节点的慢查询数据都取回来在一台TiDB上执行。

3.5.2 用pt-query-digest工具分析TiDB慢日志

可以用pt-query-digest工具分析TiDB慢日志。

pt-query-digest --report tidb-slow.log

输出样例:

# 320ms user time, 20ms system time, 27.00M rss, 221.32M vsz
# Current date: Mon Mar 18 13:18:51 2019
# Hostname: localhost.localdomain
# Files: tidb-slow.log
# Overall: 1.02k total, 21 unique, 0 QPS, 0x concurrency _________________
# Time range: 2019-03-18-12:22:16 to 2019-03-18-13:08:52
# Attribute          total     min     max     avg     95%  stddev  median
# ============     ======= ======= ======= ======= ======= ======= =======
# Exec time           218s    10ms     13s   213ms    30ms      1s    19ms
# Query size       175.37k       9   2.01k  175.89  158.58  122.36  158.58
# Commit time         46ms     2ms     7ms     3ms     7ms     1ms     3ms
# Conn ID               71       1      16    8.88   15.25    4.06    9.83
# Process keys     581.87k       2 103.15k  596.43  400.73   3.91k  400.73
# Process time         31s     1ms     10s    32ms    19ms   334ms    16ms
# Request coun       1.97k       1      10    2.02    1.96    0.33    1.96
# Total keys       636.43k       2 103.16k  652.35  793.42   3.97k  400.73
# Txn start ts     374.38E       0  16.00E 375.48P   1.25P  89.05T   1.25P
# Wait time          943ms     1ms    19ms     1ms     2ms     1ms   972us
3.6 系统表

mysql库里存储的是TiDB系统表。该设计类似于MySQL中的mysql库,其中mysql.user之类的表可以直接编辑。该库还包含许多MySQL的扩展表。

1)权限系统表:这些系统表里面包含了用户账户以及相应的授权信息

  • user:用户账户,全局权限,以及其它一些非权限的列
  • db:数据库级别的权限
  • tables_priv:表级的权限
  • columns_priv:列级的权限

2)服务端帮助信息系统表

  • help_topic 目前为空

3)统计信息相关系统表

  • stats_buckets:统计信息的桶
  • stats_histograms:统计信息的直方图
  • stats_meta:表的元信息,比如总行数和修改数
  • GC Worker相关系统表
  • gc_delete_range

4)其它系统表

  • GLOBAL_VARIABLES:全局系统变量表
  • idb:用于 TiDB 在 bootstrap 的时候记录相关版本信息
4、写在最后

TiDB的操作维护相较其它开源数据库如MySQL要简便很多,安装升级等操作基本可以一键完成,同时也能兼容MySQL的大部分功能包括SQL语法、用户权限管理等。有个问题需要后续解惑,TiDB的扩缩容是在后台自动完成的,TiKV数据节点时间相对长一些,也是对用户数据和交易会有影响的,这部分动作不知道是否可以指定时间段手动完成。


参考资料:

  1. https://docs.pingcap.com/zh/tidb/stable/

转载请注明原文地址:https://blog.csdn.net/solihawk/article/details/118667537
文章会同步在公众号“牧羊人的方向”更新,感兴趣的可以关注公众号,谢谢!
在这里插入图片描述

更多推荐