TiDB- 最小实践 Cluster111
作者: 边城元元原文来源:https://tidb.net/blog/af8080f7
TiDB- 最小实践
最小拓扑生产级体验 TiDB5.3.0 并升级到 TiDBV5.4.0
一、说明
1.1 这篇文章出现的原因
自己在做调研、学习试用 tidb 的时候 苦于环境的要求(本机不方便实现最小拓扑),再有后来社区里一些同学们发了有关最小部署的疑问的帖子,鉴于上面 2 点,就想写点什么记录下来。
| 实例 | 个数 | 物理机配置 | IP | 配置 || :——————- | :- | :——————————– | :————————- | :———- || TiDB | 3 | 16 VCore 32GB * 1 | 10.0.1.1 10.0.1.2 10.0.1.3 | 默认端口 全局目录配置 || PD | 3 | 4 VCore 8GB * 1 | 10.0.1.4 10.0.1.5 10.0.1.6 | 默认端口 全局目录配置 || TiKV | 3 | 16 VCore 32GB 2TB (nvme ssd) * 1 | 10.0.1.7 10.0.1.8 10.0.1.9 | 默认端口 全局目录配置 || Monitoring & Grafana | 1 | 4 VCore 8GB * 1 500GB (ssd) | 10.0.1.10 | 默认端口 全局目录配置 |
1.2 疑问 & 目标
最小拓扑 111 是否可以完成学习体验
最小拓扑 111 能不能抗住小并发正常的读写,用于小型的单库应用
最小拓扑 111 扩容之后是否于正常的部署标准拓扑无异
目标:验证上面的问题,并学习 tidb 安装、扩容、升级、压测
注:“拓扑 111” 指的是 1 个 tidb-server+1 个 pd+1 个 tikv,本文中此词未做特别声明的都做此解释 !
1.3 本次测试环境
二、拓扑 111
既然是最小实践 就应该是拓扑 111:1 tidb-server+1 pd+1 tikv
2.1 拓扑文件 cluster111.yml
三、部署 & 压测
3.1 准备环境 (centos7.3)
centos7.3 环境的安装这里不做赘述。
3.2 单 IP 部署最小拓扑 111 v5.3.0
3.2.1 安装 cluster111
注意:
使用
tiup cluster start cluster111 --init
将给 root 用户生成随机密码如果不加 –init 将不生成随机密码
演示期间把密码修改为 123456。ALTER USER ‘root’ IDENTIFIED BY ‘123456’;
3.2.2 使用命令查看集群情况
如上图:显示 cluster111 启动成功
1、pd 是一个节点,并且是 Leader,而且有 dashboard
2、tidb-server 和 tikv 都各一个节点
3.2.3 通过 dashboard 查看集群情况
1、dashboard 的默认地址是http://127.0.0.1:2379/dashboard/
默认账号是 root
默认密码是空 (生产环境记得修改密码)
打开 dashboard 的默认也如下:
2、实例信息:
3、主机:
4、SQL 语句分析
5、慢查询、流量可视化、日志搜索都正常。
3.2.4 tidb 相关命令
1、集群 shell 命令
tiup cluster show-config cluster111tiup cluster display cluster111
2、查看 config 命令
shell>tiup ctl:v5.3.0 pd -u http://127.0.0.1:2379 config showshell>tiup ctl:v5.3.0 pd -u http://127.0.0.1:2379 config show scheduler
默认指向的 pd 为 -u http://127.0.0.1:2379 可以省略
确认当前的最大副本数 msyql>show configmsyql>show config where name=‘replication.max-replicas’;
3、ctl shell 命令
#pd-ctltiup ctl:v5.3.0 pd helptiup ctl:v5.3.0 pd health
tiup ctl:v5.3.0 pd store #region 数据量,leader 数量,perr 数量 tiup ctl:v5.3.0 pd schedulertiup ctl:v5.3.0 pd scheduler showtiup ctl:v5.3.0 pd clustertiup ctl:v5.3.0 pd region -h
tiup ctl:v5.3.0 pd region check miss-peertiup ctl:v5.3.0 pd region check miss-peer # 缺副本的 Regiontiup ctl:v5.3.0 pd region check extra-peer # 多副本的 Regiontiup ctl:v5.3.0 pd region check down-peer # 有副本状态为 Down 的 Regiontiup ctl:v5.3.0 pd region check pending-peer # 有副本状态为 Pending 的 Region
# 进入 ptcl 交互式 tiup ctl:v5.3.0 pd -u http://127.0.0.1:2379 -i
#tidb -ctltiup ctl:v5.3.0 tidb helptiup ctl:v5.3.0 tidb keyrange –database test –table ttt # 查找范围
#tikv-ctltiup ctl:v5.3.0 tikv helptiup ctl:v5.3.0 tikv –pd 127.0.0.1:2379 compact-cluster
7、安装组件
3.4 压测
使用 TiUP bench 组件压测 TiDB
TPC-C 评测数据库的联机交易处理(OLTP)能力
TPC-H 通过 复杂 SQL 查询来评估数据库 OLAP 的性能
3.4.1 TPCC 压测
tiup cluster display cluster111
说明:
WAREHOUSE 数据库中 ITEM 表中固定包含 10 万种商品,仓库的数量可进行调整,假设 WAREHOUSE 表中有 W 条记录,
那么:
STOCK 表中应有 W * 10 万条记录(每个仓库对应 10 万种商品的库存数据)
DISTRICT 表中应有 W * 10 条记录(每个仓库为 10 个地区提供服务)
CUSTOMER 表中应有 W * 10 * 3000 条记录(每个地区有 3000 个客户)
HISTORY 表中应有 W * 10 * 3000 条记录(每个客户一条交易历史)
ORDER 表中应有 W * 10 * 3000 条记录(每个地区 3000 个订单),并且最后生成的 900 个订单被添加到 NEW-ORDER 表中,每个订单随机生成 5 ~ 15 条 ORDER-LINE 记录。
可以粗鲁的估计 1W 的数据为 10 万。
1、1W 压测
tiup bench tpcc -H 127.0.0.1 -p 123456 -P 4000 -D tpcc –warehouses 1 prepare
tiup bench tpcc -H 127.0.0.1 -p 123456 -P 4000 -D tpcc –warehouses 1 run
进行数据正确性验证。一共压测了 10 多个小时
压测数据只供参考:TPCC 发压机器在虚拟机,压测期间做了其他的事项,影响测试结果。
2、10W 压测 (百万数据)
tiup bench tpcc -H 127.0.0.1 -p 123456 -P 4000 -D tpcc –warehouses 10 prepare
tiup bench tpcc -H 127.0.0.1 -p 123456 -P 4000 -D tpcc –warehouses 10 run
此篇文章不再进行 10W 的测试
3.4.2 TPCH 压测
虚拟机压测 oom 没有进行下去(没有截图)
3.5 Cluster111 总结
1)在当前的配置下,比较很定 。
四、扩容 & 升级
4.1 扩容监控节点
4.1.1 扩容监控的拓扑
4.1.2 步骤与过程
执行扩容命令
tiup cluster scale-out cluster111 ./cluster111-scale-out-monoitor.yml -uroot -p# 提示输入 ssh 密码
提示:scaled cluster ‘xxx’ out successfully 说明扩容成功
4.1.3 结果验证
4.1.3.1 shell 命令验证集群情况
4.1.3.2 dashboard 验证
dashboard -> 概况
界面有 qps、duration 的数据
其他界面没有变化
4.1.3.3 Grafana 验证
默认账号 admin 默认密码 admin
1、配置数据源:左侧选择 configuration->Data Sources 出现后侧的可用数据源 ,双击 cluster111 数据源 进入测试数据源界面 ->Save&test 保存。
2、回到 General /Home ,点击 General 选择 cluster111-overview 打开
4.1.3 复盘
1、 扩容的指令执行的过程比较顺利,10 多分钟执行完毕(几十万条数据库)。
2、这里出现一个插曲,误用 tiup cluster check
本意是检测扩展 yaml 文件有没有错误。使用 tiup cluster check 扩容监控拓扑 ,提示 9100 端口已经存在集群里误导了我才有这个插曲。
1)查看 cluster11 集群配置显示如下:·tiup cluster show-config cluster111
2)使用 tiup cluster check ./cluster111-scale-out-monoitor.yml
提示信息如下图
3)再次确认扩容配置如图:
怀疑有奇怪?是 bug?还是啥?
4)又试了试 tiup cluster check ./cluster111-scale-out-tikv2-1.yml
也提示同样的错误
5)还是需要请教官方文档 查看官方文档:https://docs.pingcap.com/zh/tidb/stable/tiup-component-cluster-check
没有说 check 可以检错 扩容配置的功能。
总结:
1)我这里是误用(用错了地方)也就是 tiup cluster check 用错了场景了;
2)恰好我要做的扩容监控节点和提示的信息有相关,加深了误导。
4.2 扩容 1 个 tikv 节点
tiup cluster display cluster111
tiup cluster scale-out cluster111 ./cluster111-scale-out-tikv2-1.yml -uroot -p
注意:
开启监控 tiup cluster start cluster111 -R alertmanager,grafana,prometheus 观察扩容前后的 peer 数量,region 数量
4.3 扩容 1 个 tikv 节点(总 tikv 节点达到 3 个)
思考 tikv3 副本的意义是什么?
提高业务可用性和数据可靠性(分布式 raft 协议),如果一个节点挂掉,业务正常运行。
3 个节点的 3 副本 本质上没有提高数据的横向扩展能力,如果需要提高数据库的横向能力需要增加更多的 tikv 节点。
扩容 yaml
tiup cluster scale-out cluster111 ./cluster111-scale-out-tikv2-2.yml -uroot -p
# 当前的 peer 为 46
升级完成过一会,发现 peer 没有变化,store 变成了 3 个。
Peer 数量变成了 69 个了,符合预期
说明一个问题:replication.max-replicas 控制着同一份数据的最大副本数量
tiup cluster display cluster111
如果 在当前的环境下,是 3 个节点,把 replication.max-replicas 修改为 1,peer 数会减少吗?
说干就干:
4.4 升级到最新版(v5.4.0)
4.4.1 升级 tiup 组件和 cluster 组件
tiup update –self && tiup update cluster
4.4.2 编辑 TiUP Cluster 拓扑配置文件
去掉不兼容的配置
> # tiup cluster edit-config <cluster-name> > tiup cluster edit-config cluster111 > #修改完成后 :wq 保存并退出编辑模式,输入 Y 确认变更。 > ``` ##### 4.4.3 检查当前集群的健康状况 > tiup cluster check cluster111 --cluster ##### 4.4.4升级集群到v5.4.0 > tiup cluster upgrade cluster111 v5.4.0 升级完之后验证:`tiup cluster display cluster111` ![image.png](https://tidb-blog.oss-cn-beijing.aliyuncs.com/media/image-1647598575336.png) ##### 4.4.5 升级完成后,如何更新 pd-ctl 等周边工具版本 > 1. tiup install ctl:v5.4.0 > > 2. br工具升级 > > 3. <https://download.pingcap.org/tidb-toolkit-v5.4.0-linux-amd64.tar.gz> > > 解压到 /usr/local0/webserver/tidb/tidb-toolkit-v5.4.0 > > 后期可以以`/usr/local0/webserver/tidb/tidb-toolkit/`作为tidb-toolkit的根目录(兼容性高),对于升级方便很多(不需要修改脚本中有路径的)但是不兼容的错误不易于排查,暂时用到的地方做好记录吧。 #### 4.5 缩容到 cluster111
shell# 设置副本数 为 1set config ‘10.0.2.15:2379’
replication.max-replicas
=1;show config where name=‘replication.max-replicas’;缩容2个tikv,监控
shell
查看集群情况
tiup cluster display cluster111
缩容
tiup cluster scale-in cluster111 –node 10.0.2.15:9093,10.0.2.15:3000,10.0.2.15:9090,10.0.2.15:20161,10.0.2.15:20162
过一段时间查看集群状态
tiup cluster display cluster111
shellDetail BR log in /tidb-bak111/brdata/brbaklog/log-2022-03.logDatabase backup <——————————————————————————————————————————————> 100.00%Checksum <————————————————————————————————————————————————-> 100.00%[2022/03/18 03:05:55.571 +00:00] [INFO] [collector.go:65] [“Database backup success summary”] [total-ranges=30] [ranges-succeed=30] [ranges-failed=0] [backup-checksum=7.400938637s] [backup-fast-checksum=12.817097ms] [backup-total-ranges=19] [backup-total-regions=26] [total-take=43.891232093s] [backup-data-size(after-compressed)=142.3MB] [Size=142251394] [BackupTS=431901300942438402] [total-kv=5351334] [total-kv-size=452.6MB] [average-speed=10.31MB/s]
real 0m44.707suser 0m1.182ssys 0m1.332s
shellDetail BR log in /tmp/br.log.2022-03-18T03.09.30Z431901300942438402
shell[root@localhost brdata]# cd brbakincr/brbakincr2022-03-17/[root@localhost brbakincr2022-03-17]# ls1_46_49_8f0ee22537c2f0e435fff0cbe11d0770af1ef06426d6c562d98e11dab944f2be_1647573256417_write.sst backup.lock backupmeta[root@localhost brbakincr2022-03-17]# ls -lhsrttotal 64K4.0K -rw-r–r–. 1 root root 78 Mar 18 03:14 backup.lock4.0K -rw-r–r–. 1 tidb tidb 1.6K Mar 18 03:14 1_46_49_8f0ee22537c2f0e435fff0cbe11d0770af1ef06426d6c562d98e11dab944f2be_1647573256417_write.sst 56K -rw-r–r–. 1 root root 53K Mar 18 03:14 backupmeta
sh[root@localhost brbakincr2022-03-17]# /usr/local0/webserver/tidb/tidb-toolkit-v5.3.0/bin/br restore db –db tpcc -s local:///tidb-bak111/brdata/brbak/brbak2022-03-17/ –pd 127.0.0.1:2379 –log-file /tidb-bak111/brdata/brbaklog/restore_local20220317.logDetail BR log in /tidb-bak111/brdata/brbaklog/restore_local20220317.logDatabase restore <—————————————————————————————————————————————–> 100.00%[2022/03/18 03:22:30.258 +00:00] [INFO] [collector.go:65] [“Database restore success summary”] [total-ranges=39] [ranges-succeed=39] [ranges-failed=0] [split-region=3.082383573s] [restore-checksum=44.490484521s] [restore-ranges=26] [total-take=45.096075962s] [restore-data-size(after-compressed)=142.3MB] [Size=142251394] [BackupTS=431901561486049282] [total-kv=5351334] [total-kv-size=452.6MB] [average-speed=10.04MB/s]
shell[root@localhost brbakincr2022-03-17]# /usr/local0/webserver/tidb/tidb-toolkit-v5.3.0/bin/br restore db –db tpcc -s local:///tidb-bak111/brdata/brbakincr/brbakincr2022-03-17/ –pd 127.0.0.1:2379 –log-file /tidb-bak111/brdata/brbaklog/restore_local20220317.logDetail BR log in /tidb-bak111/brdata/brbaklog/restore_local20220317.logDatabase restore <—————————————————————————————————————————————–> 100.00%[2022/03/18 03:25:51.248 +00:00] [INFO] [collector.go:65] [“Database restore success summary”] [total-ranges=11] [ranges-succeed=11] [ranges-failed=0] [restore-checksum=1.133574ms] [split-region=682.193616ms] [restore-ranges=1] [total-take=2.699661713s] [restore-data-size(after-compressed)=1.558kB] [Size=1558] [BackupTS=431901625370542081] [total-kv=3] [total-kv-size=87B] [average-speed=32.23B/s][root@localhost brbakincr2022-03-17]#
bash#! /bin/sh#!/bin/bash#!/bin/bash
ticde-backup.sh
# 1) 手动增加 bakall 是全备
ticde-backup.sh bakall
# 2) 周日 是全备
ticde-backup.sh
# 3) 非周日 是增备
ticde-backup.sh
#
使用 cron 定时 每天 01:00:00 执行一次
0 1 * * * ticde-backup.sh
#
const 【不要修改】
DateFull=date -d today +"%Y-%m-%d %H:%M:%S"
DateMin=date -d today +"%Y-%m-%d"
DateIncr=date -d today +"%Y-%m-%d-%H%M"
DateLog=date -d today +"%Y-%m"
CurWeek=date +%u
BakFullFlag=0
BakRoot=/tidb-bak111/brdataBakRootData={DateMin}BakRootDataIncr={DateIncr}BakRootLog={DateLog}.log
强制全备 标记 bakall
CustormArg1=$1LAST_BACKUP_TS=0
config 【可以修改】
DBName=testBrBin=/usr/local0/webserver/tidb/tidb-toolkit-v5.3.0/binPd=127.0.0.1:2379Concurrency=16Ratelimit=256
逻辑判断
if [ “1” = “bakall” ];then # 临时全备防止目录冲突 BakRootData={BakRootData}-date -d today +"%H%M%S"
BakFullFlag=1fi
if [ ${CurWeek} -eq 7 ];then BakFullFlag=1fi
if [ {BakFullFlag} -ne 1 ];then # 找到上一次的路径 LAST_BACKUP_DIR={BakRoot}/brbak/brbak{CurWeek} days” +%Y-%m-%d) if [ ! -d “{LAST_BACKUP_DIR} )不存在!’ exit 0 fi LAST_BACKUP_TS=${BrBin}/br validate decode --field="end-version" -s local://${LAST_BACKUP_DIR} | tail -n1
if [ {LAST_BACKUP_DIR} )获取 LAST_BACKUP_TS 失败!’ exit 0 fi
# 执行增量备份 mkdir -p {BakRootDataIncr}/
echo “ 增量备份到:${BakRootDataIncr}/”
${BrBin}/br backup db
–db ${DBName}
-s local://${BakRootDataIncr}/
–pd ${Pd}
–log-file ${BakRootLog}
–lastbackupts ${LAST_BACKUP_TS}
–ratelimit ${Ratelimit}
–concurrency ${Concurrency}
else
# 执行全量备份 mkdir -p {BakRootData}/
echo “ 全量备份到:${BakRootData}/”
${BrBin}/br backup db
–db ${DBName}
-s local://${BakRootData}/
–pd ${Pd}
–log-file ${BakRootLog}
–ratelimit ${Ratelimit}
–concurrency ${Concurrency}
fi
echo ‘— end — ‘
shell[root@localhost tidb]# sh ticde-backup.sh bakall 全量备份到:/tidb-bak111/brdata/brbak/brbak2022-03-18-065642/Detail BR log in /tidb-bak111/brdata/brbaklog/log-2022-03.log[2022/03/18 06:56:43.559 +00:00] [WARN] [backup.go:203] [“setting --ratelimit
and --concurrency
at the same time, ignoring --concurrency
: --ratelimit
forces sequential (i.e. concurrency = 1) backup”] [ratelimit=268.4MB/s] [concurrency-specified=16]Database backup <——————————————————————————————————————————————> 100.00%Checksum <————————————————————————————————————————————————-> 100.00%[2022/03/18 06:56:47.121 +00:00] [INFO] [collector.go:65] [“Database backup success summary”] [total-ranges=7] [ranges-succeed=7] [ranges-failed=0] [backup-checksum=451.606693ms] [backup-fast-checksum=8.038543ms] [backup-total-ranges=6] [backup-total-regions=6] [total-take=3.565844245s] [BackupTS=431904942621720580] [total-kv=90023] [total-kv-size=23.28MB] [average-speed=6.529MB/s] [backup-data-size(after-compressed)=13.52MB] [Size=13522252]— end —
[root@localhost tidb]# sh ticde-backup.shDetail BR log in /tmp/br.log.2022-03-18T06.57.02Z 增量备份到:/tidb-bak111/brdata/brbakincr/brbakincr2022-03-18-0657/Detail BR log in /tidb-bak111/brdata/brbaklog/log-2022-03.log[2022/03/18 06:57:02.968 +00:00] [WARN] [backup.go:203] [“setting --ratelimit
and --concurrency
at the same time, ignoring --concurrency
: --ratelimit
forces sequential (i.e. concurrency = 1) backup”] [ratelimit=268.4MB/s] [concurrency-specified=16]Database backup <——————————————————————————————————————————————> 100.00%Checksum <————————————————————————————————————————————————-> 100.00%[2022/03/18 06:57:03.232 +00:00] [INFO] [collector.go:65] [“Database backup success summary”] [total-ranges=0] [ranges-succeed=0] [ranges-failed=0] [backup-checksum=6.562636ms] [backup-total-ranges=6] [backup-total-regions=6] [total-take=267.386045ms] [Result=“Nothing to bakcup”] [Size=0] [BackupTS=431904947706003457]— end —
shell#!/bin/bash
ticde-backup.sh
# 1) 手动 需要传递 back 的目录
ticde-restore.sh /tidb-bak111/brdata/brbak/brbak2022-03-17/
# 先恢复全备,再恢复增备 #
const 【不要修改】
DateFull=date -d today +"%Y-%m-%d %H:%M:%S"
DateMin=date -d today +"%Y-%m-%d"
DateLog=date -d today +"%Y-%m"
BakRoot=/tidb-bak111/brdataBakRootLog={DateLog}.log
原备份的目录
BakDir=$1
config 【可以修改】
DBName=testBrBin=/usr/local0/webserver/tidb/tidb-toolkit-v5.3.0/binPd=127.0.0.1:2379Concurrency=16Ratelimit=256
逻辑判断
if [ -z “{BakDir}” ] ;then echo “ 请输入备份所在的目录 ” exit 0fi
echo “ 从备份 {DBName}”
${BrBin}/br restore db
–db ${DBName}
-s local://${BakDir}/
–pd ${Pd}
–log-file ${BakRootLog}
–ratelimit ${Ratelimit}
–concurrency ${Concurrency}
echo ‘— end — ‘
bash[root@localhost tidb]# sh ticde-restore.sh 请输入备份所在的目录[root@localhost tidb]# sh ticde-restore.sh /tidb-bak111/brdata/brbak/brbak2022-03-17/从备份 /tidb-bak111/brdata/brbak/brbak2022-03-17// 恢复到数据库:testDetail BR log in /tidb-bak111/brdata/brbaklog/restore-log-2022-03.log```
六、思考与总结
6.1 思考
1、cluster111 适合什么样的应用?
1)通过 tpcc 1w 10 万的数据量的压测 qps 保持在 120 左右无异常 监控正常。
2)本次测试使用硬件 可以说小型的企业站 ,对数据库操作不频繁的应用够用。
2、如果生产环境使用 cluster111 单 IP 多端口的(1 个 tidb-server,1 个 pd,1 个 tikv)需要注意什么?
1)按照官网的要求升级机器配置
2)根据实际业务场景做好压测
3)做好定时 br 备份
3、什么时间点扩容到完整的 cluster333(3 个 tidb-server,3 个 pd,3 个 tikv)或 cluster3332(3 个 tidb-server,3 个 pd,3 个 tikv,2 个 tiflash)
1)如果 cluster111 正常使用 无异常,可以使用不一定要升级到完整集群
2)数据量 超过 10G 以上(br 备份的优势场景)
3)数据库读写增多 遇到瓶颈(可以看 dashboard 上的 sql 分析)配置调忧解决不了问题
4)有大量数据分析场景 引入 tiflash
5)扩容需要做好规划 前期可以考虑 tikv 节点独立部署
4、疑问:cluster111(1tidb-server,1pd,1tikv 分别部署不同的机器)是否一定比 cluster333(3 个 tidb-server,3 个 pd,3 个 tikv 最小官方部署)性能高?
我感觉是肯定的,有待看源码或后期验证吧!
6.2 总结
1、tidb 对于使用者非常很友
2、最小拓扑 cluster111 用于生产需要做好数据安全:
做好定时全量备份 + 增量备份,可以在非核心业务上使用(使用前需要真机压测)。
数据库账号密码安全
dashboard 和监控的默认账号密码安全
七、收集社区中关于最小部署的帖子,供大家学习
一些关于最小拓扑和单机部署的问题
1、https://asktug.com/t/topic/574670/2# 单机要不要使用 TiDB 的讨论,欢迎 TiDBer 来聊聊 2、https://asktug.com/t/topic/68315# 单机版集群用于生产环境3、https://asktug.com/t/topic/67838# 最小拓扑的扩展4、https://asktug.com/t/topic/183459/2# 拓扑信息中节点数量与最小部署可用性咨询5、https://docs.pingcap.com/zh/tidb/stable/quick-start-with-tidb# 在单机上模拟部署生产环境集群6、https://asktug.com/t/topic/575030#[官方最小拓扑中的 monitoring_servers、grafana_servers、alertmanager_servers 可以不要吗?](https://asktug.com/t/topic/575030)
谢谢!
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/29dffeb321f99805e7e95c037】。文章转载请联系作者。
评论