
本文操作均在 root 权限下进行。仅对自己的搭建做记录,供大家参考。
我的工作目录 /usr/local/workplace/ ,创建一个新的文件夹叫 mirror 来存放tidb 的镜像
mkdir -p /usr/local/workplace/tidb_deply/mirrors
cd /usr/local/workplace/tidb_deply/
1.下载安装 tiup
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
# 配置生效,安装完提示 /root/.bashrc has been modified to add tiup to PATH
# open a new terminal or source /root/.bashrc to use it
source /root/.bashrc
# 安装 TiUP 的 cluster 组件:
tiup cluster
由于模拟多机部署,需要通过 root
用户调大 sshd 服务的连接数限制:
- 修改
/etc/ssh/sshd_config
将MaxSessions
调至 20。 - 重启 sshd 服务:
service sshd restart
2.搭建私有镜像
参考:pingcap
- 限定只克隆特定平台的包如果只想克隆某个平台的包,那么可以使用
--os
和--arch
来限定:- 只想克隆 linux 平台的,则执行
tiup mirror clone <target-dir> [global-version] --os=linux
- 只想克隆 amd64 架构的,则执行
tiup mirror clone <target-dir> [global-version] --arch=amd64
- 只想克隆 linux/amd64 的,则执行
tiup mirror clone <target-dir> [global-version] --os=linux --arch=amd64
- 只想克隆 linux 平台的,则执行
- 限定只克隆组件的特定版本如果只想克隆某个组件的某一个版本而不是所有版本,则使用
--<component>=<version>
来限定,例如:- 只想克隆 TiDB 的 v5.0.0 版本,则执行
tiup mirror clone <target-dir> --tidb v5.0.0
- 只想克隆 TiDB 的 v5.0.0 版本,以及 TiKV 的所有版本,则执行
tiup mirror clone <target-dir> --tidb v5.0.0 --tikv all
- 克隆一个集群的所有组件的 v5.0.0 版本,则执行
tiup mirror clone <target-dir> v5.0.0
- 只想克隆 TiDB 的 v5.0.0 版本,则执行
我是 Ubuntu 64位,且拉取 5.0.0 的版本,拉取的镜像目录在开始创建的 mirrors 文件夹下
tiup mirror clone ./mirrors/ v5.0.0 --os=linux --arch=amd64
3.测试运行
这一部分见官方文档:pingcap
这里以 第二种:使用 TiUP cluster 在单机上模拟生产环境部署步骤 为例
按下面的配置模板,编辑配置文件,命名为 topo.yaml
,其中:
user: "tidb"
:表示通过tidb
系统用户(部署会自动创建)来做集群的内部管理,默认使用 22 端口通过 ssh 登录目标机器replication.enable-placement-rules
:设置这个 PD 参数来确保 TiFlash 正常运行host
:设置为本部署主机的 IP
配置模板如下:
# # Global variables are applied to all deployments and used as the default value of
# # the deployments if a specific deployment value is missing.
global:
user: "tidb"
ssh_port: 22
deploy_dir: "/tidb-deploy"
data_dir: "/tidb-data"
# # Monitored variables are applied to all the machines.
monitored:
node_exporter_port: 9100
blackbox_exporter_port: 9115
server_configs:
tidb:
log.slow-threshold: 300
tikv:
readpool.storage.use-unified-pool: false
readpool.coprocessor.use-unified-pool: true
pd:
replication.enable-placement-rules: true
replication.location-labels: ["host"]
tiflash:
logger.level: "info"
pd_servers:
- host: 172.28.33.222
tidb_servers:
- host: 172.28.33.222
tikv_servers:
- host: 172.28.33.222
port: 20160
status_port: 20180
config:
server.labels: { host: "logic-host-1" }
- host: 172.28.33.222
port: 20161
status_port: 20181
config:
server.labels: { host: "logic-host-2" }
- host: 172.28.33.222
port: 20162
status_port: 20182
config:
server.labels: { host: "logic-host-3" }
tiflash_servers:
- host: 172.28.33.222
monitoring_servers:
- host: 172.28.33.222
grafana_servers:
- host: 172.28.33.222
执行集群部署命令:
# tiup cluster deploy <cluster-name> <tidb-version> ./topo.yaml --user root -p
tiup cluster deploy tidbtest v5.0.0 ./topo.yaml --user root -p
- 参数
<cluster-name>
表示设置集群名称 - 参数
<tidb-version>
表示设置集群版本,可以通过tiup list tidb
命令来查看当前支持部署的 TiDB 版本
按照引导,输入”y”及 root 密码,来完成部署:(这里一定要输入root 账户对应的密码,并打开 root登录,参考博客 )
Do you want to continue? [y/N]: y
Input SSH password:
# 部署成功最后出现如下:
# Cluster `tidbtest` deployed successfully, you can start it with command: `tiup cluster start
# tidbtest`
那么可以直接运行 tiup cluster start tidbtest
来启用集群啦。
4.访问集群
安装 MySQL 客户端。如果已安装 MySQL 客户端则可跳过这一步骤。
centos:yum -y install mysql
Ubuntu:sudo apt-get update &&sudo apt-get install mysql-server
访问 TiDB 数据库,密码为空:mysql -h 127.0.0.1 -P 4000 -u root
访问 TiDB 的 Grafana 监控:通过 http://{grafana-ip}:3000 访问集群 Grafana 监控页面,默认用户名和密码均为 admin。
访问 TiDB 的 Dashboard:通过 http://{pd-ip}:2379/dashboard 访问集群 TiDB Dashboard 监控页面,默认用户名为 root,密码为空。

执行以下命令确认当前已经部署的集群列表:tiup cluster list
执行以下命令查看集群的拓扑结构和状态:tiup cluster display <cluster-name>
4.测试集群
修改 topo.yaml ,主要是修改 tidb 的日志级别。tikv 的性能优化我暂时使用默认配置
server_configs:
tidb:
log.level: "error"
prepared-plan-cache.enabled: true
对 TiDB 进行简单设置。在 MySQL 客户端中执行如下命令:
# 进入数据库
mysql -h 127.0.0.1 -P 4000 -u root -p
# 执行命令
set global tidb_disable_txn_auto_retry = off;
然后退出客户端。
重新启动 MySQL 客户端执行以下 SQL 语句,创建数据库 sbtest
:
create database sbtest;
新建一个config 文件
mysql-host=127.0.0.1
mysql-port=4000
mysql-user=root
#mysql-password=
mysql-db=sbtest
time=600
threads=16
report-interval=10
db-driver=mysql
warmup-time=100
安装 sysbench ,参考:https://github.com/akopytov/sysbench ,这里不再详细介绍,我安装的是最新版 1.0.20
命令行输入以下命令,开始导入数据,config 文件为上一步中配置的文件:
这里我只插入了 100w 的数据,这根据需求修改
sysbench --config-file=config oltp_point_select --tables=32 --table-size=1000000 prepare
数据预热:
新建一个文件叫 warm-data.sql
use sbtest;
SELECT COUNT(pad) FROM sbtest1 USE INDEX (k_1);
SELECT COUNT(pad) FROM sbtest2 USE INDEX (k_2);
SELECT COUNT(pad) FROM sbtest3 USE INDEX (k_3);
SELECT COUNT(pad) FROM sbtest4 USE INDEX (k_4);
SELECT COUNT(pad) FROM sbtest5 USE INDEX (k_5);
SELECT COUNT(pad) FROM sbtest6 USE INDEX (k_6);
SELECT COUNT(pad) FROM sbtest7 USE INDEX (k_7);
SELECT COUNT(pad) FROM sbtest8 USE INDEX (k_8);
SELECT COUNT(pad) FROM sbtest9 USE INDEX (k_9);
SELECT COUNT(pad) FROM sbtest10 USE INDEX (k_10);
SELECT COUNT(pad) FROM sbtest11 USE INDEX (k_11);
SELECT COUNT(pad) FROM sbtest12 USE INDEX (k_12);
SELECT COUNT(pad) FROM sbtest13 USE INDEX (k_13);
SELECT COUNT(pad) FROM sbtest14 USE INDEX (k_14);
SELECT COUNT(pad) FROM sbtest15 USE INDEX (k_15);
SELECT COUNT(pad) FROM sbtest16 USE INDEX (k_16);
SELECT COUNT(pad) FROM sbtest17 USE INDEX (k_17);
SELECT COUNT(pad) FROM sbtest18 USE INDEX (k_18);
SELECT COUNT(pad) FROM sbtest19 USE INDEX (k_19);
SELECT COUNT(pad) FROM sbtest20 USE INDEX (k_20);
SELECT COUNT(pad) FROM sbtest21 USE INDEX (k_21);
SELECT COUNT(pad) FROM sbtest22 USE INDEX (k_22);
SELECT COUNT(pad) FROM sbtest23 USE INDEX (k_23);
SELECT COUNT(pad) FROM sbtest24 USE INDEX (k_24);
SELECT COUNT(pad) FROM sbtest25 USE INDEX (k_25);
SELECT COUNT(pad) FROM sbtest26 USE INDEX (k_26);
SELECT COUNT(pad) FROM sbtest27 USE INDEX (k_27);
SELECT COUNT(pad) FROM sbtest28 USE INDEX (k_28);
SELECT COUNT(pad) FROM sbtest29 USE INDEX (k_29);
SELECT COUNT(pad) FROM sbtest30 USE INDEX (k_30);
SELECT COUNT(pad) FROM sbtest31 USE INDEX (k_31);
SELECT COUNT(pad) FROM sbtest32 USE INDEX (k_32);
ANALYZE TABLE sbtest1;
ANALYZE TABLE sbtest2;
ANALYZE TABLE sbtest3;
ANALYZE TABLE sbtest4;
ANALYZE TABLE sbtest5;
ANALYZE TABLE sbtest6;
ANALYZE TABLE sbtest7;
ANALYZE TABLE sbtest8;
ANALYZE TABLE sbtest9;
ANALYZE TABLE sbtest10;
ANALYZE TABLE sbtest11;
ANALYZE TABLE sbtest12;
ANALYZE TABLE sbtest13;
ANALYZE TABLE sbtest14;
ANALYZE TABLE sbtest15;
ANALYZE TABLE sbtest16;
ANALYZE TABLE sbtest17;
ANALYZE TABLE sbtest18;
ANALYZE TABLE sbtest19;
ANALYZE TABLE sbtest20;
ANALYZE TABLE sbtest21;
ANALYZE TABLE sbtest22;
ANALYZE TABLE sbtest23;
ANALYZE TABLE sbtest24;
ANALYZE TABLE sbtest25;
ANALYZE TABLE sbtest26;
ANALYZE TABLE sbtest27;
ANALYZE TABLE sbtest28;
ANALYZE TABLE sbtest29;
ANALYZE TABLE sbtest30;
ANALYZE TABLE sbtest31;
ANALYZE TABLE sbtest32;
然后进入 mysql 执行 source ./warm-data.sql;
分别进行以下三项测试:
Point select 测试命令
sysbench --config-file=config oltp_point_select --tables=32 --table-size=1000000 run
sysbench --config-file=config oltp_update_index --tables=32 --table-size=1000000 run
sysbench --config-file=config oltp_read_only --tables=32 --table-size=1000000 run
本来测试应该在另外一台客户机上做,这里我只是为了方便。在另一台客户端做的话,客户端将config 里的 ip 改成目标机器的ip。然后在客户端上运行 sysbench 测试。
贴一个 我自己的 oltp_point_select 测试结果:
SQL statistics:
queries performed:
read: 10010058
write: 0
other: 0
total: 10010058
transactions: 10010058 (16683.25 per sec.)
queries: 10010058 (16683.25 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 600.0051s
total number of events: 10010058
Latency (ms):
min: 0.49
avg: 0.96
max: 432.62
95th percentile: 1.27
sum: 9588969.51
Threads fairness:
events (avg/stddev): 625628.6250/3058.00
execution time (avg/stddev): 599.3106/0.01
扩展阅读:
95th percentile百分点指的是所给数集中超过其95%的数。它是一个统计学上的概念。对于某个接口,准确统计它的流量时非常有用,它可以取出一些偶然得到的异常值。
95th百分点是统计时所采用的最高值,超过的5%的数据将被舍弃。这样可以将瞬间的毛刺(尖峰)去掉,使统计平均更具真实意义。例如: 收集的数据为60,45,43,21,56,89,76,32,22,10,12,14,23,35,45,43,23,23,43,23 (20 个点)。将该序列降序排列,其最大值为89。由于20个点的5%为1,所以我们舍弃1个最大值89。剩下的最大值76就是我们所说的95th百分点