TIDB 安装
小白版本的安装入门,欢迎新手来参考😁
系统初始化(选择59作为中控机)
注意:推荐安装时,不使用 root 用户,而是使用 tidb 用户
- 1.检查系统
# 检查文件系统
# cat /etc/fstab
/dev/vdb1 /data1 ext4 nodelalloc 0 0
- 2.免密配置
# 生成秘钥
# useradd tidb
# passwd tidb
# su - tidb
# ssh-keygen -t rsa
# 下载 tidb-ansible master
# git clone https://github.com/pingcap/tidb-ansible.git
# 安装 ansible 的依赖
# sudo yum -y install epel-release
# sudo yum -y install python-pip curl
# cd tidb-ansible/
# sudo pip install -r ./requirements.txt
# ansible --version
# 使用 tidb-ansible 配置秘钥
# vi hosts.ini
[servers]
172.16.10.59
172.16.10.60
172.16.10.61
172.16.10.62
[all:vars]
username = tidb
# 按照顺序输入密码
# ansible-playbook -i hosts.ini create_users.yml -k
注意:这里的互信是看官网的,实际操作是直接在59那台服务器生成公钥,然后将内容复制到每台服务器的 home 目录下 .ssh/ 下的 authorized_keys 文件内。最后的目标是通过中控机可以访问无秘钥登录其他服务器 tidb 账户,每台服务器的 tidb 账户可以通过 sudo su - root
直接切换到 root 用户,这样互信就完成了,下文有检查互信的方法。
- 3.检查 ntp 是否正常运行
[tidb@ip-172-16-10-59 tidb-ansible]$ ntpstat
synchronised to NTP server (85.199.214.100) at stratum 2
time correct to within 159 ms
polling server every 1024 s
注意:这个可以在配置文件里面关闭,主要是为了保证服务器时间统一,正式服务器不可关闭,测试可以。
安装配置
- 1.配置 inventory.ini
vim inventory.ini
修改内容参考官方
注意:user 改为 tidb 用户,注意下载的 tidb 的版本
- 2.检查互信
ansible -i inventory.ini all -m shell -a 'whoami'
ansible -i inventory.ini all -m shell -a 'whoami' -b
- 3.下载 tidb binary
ansible-playbook local_prepare.yml
- 4.初始化系统环境,修改内核参数
ansible-playbook bootstrap.yml
注意
如果这个地方配置没有通过,如修改 `/home/tidb/wangjun/tidb-ansible/roles/check_system_optional/defaults/main.yml` 里面的限制,注意看报错模块,一般都是在 roles 文件夹下,defaults 文件夹下的 yml 文件中是阈值。
为了提高初始化系统环境的速度,可以修改 io 测试模块中,生成文件的大小,默认是10G。
或者跳过
bootstrap.yml
阶段如何跳过磁盘检测、CPU、内存容量检测
ansible-playbook bootstrap.yml --extra-vars "dev_mode=True"
- 5.安装
ansible-playbook deploy.yml
- 6.启动集群
ansible-playbook start.yml
部署完成
注意:
Grafana Dashboard 上的 Report 按钮可用来生成 PDF 文件,此功能依赖 fontconfig 包。如需使用该功能,登录 grafana_servers 机器,用以下命令
sudo yum install fontconfig -y
集群入门使用
- 1.登录
mysql -uroot -P4000 -h 172.16.10.59
注意:
1.需要接 ip,不然默认 socket 接入是有问题的
2.MySQL 命令可以找一个,上传上去
3.没有初始化密码,注意设置初始密码
- 2.监控前端
地址:http://172.16.10.59:3000
默认帐号密码是:admin/admin
注意:如果修改了 admin 的密码,及时修改 inventor.ini 配置文件中的相关配置。
滚动升级
1.滚动升级,不影响业务运行的话,最低的配置为:
pd*3 ,tidb*2 ,tikv*3
2.如果集群环境中有 pump / drainer 服务,请先停止 drainer 后滚动升级 (升级 TiDB 时会升级 pump)
- 自动下载 binary
# 原先的版本
./resources/bin/tidb-server -V
# 删除原来的安装包
rm -rf downloads/
# 修改配置
vim inventory.ini
tidb_version = v1.0.2
# 下载
ansible-playbook local_prepare.yml
# 现在的版本
./resources/bin/tidb-server -V
# 滚动升级所有(可指定升级部分)
ansible-playbook rolling_update.yml
# 更新 Prometheus 配置并重启
ansible-playbook rolling_update_monitor.yml --tags=prometheus
扩容
添加一个 tidb
# 添加新 tidb 的 IP
vim inventory.ini
# 初始化新增节点(多个IP 用逗号隔开,--tags=tidb 参数指定服务,-l 可以接 ip 或者服务的别名,为了 单 node 多 tikv 部署的情况使用)
ansible-playbook bootstrap.yml -l 172.16.10.61
# 部署新增节点
ansible-playbook deploy.yml -l 172.16.10.61
# 启动新节点服务
ansible-playbook start.yml -l 172.16.10.61
# 更新 Prometheus 配置并重启
ansible-playbook rolling_update_monitor.yml --tags=prometheus
添加一个 pd
-
这里我们将59服务器扩容 pd
-
安装
# 修改 inventory.ini 配置文件
[pd_servers]
172.16.10.59
# 初始化新增节点
ansible-playbook bootstrap.yml -l 172.16.10.59
# 部署新节点
ansible-playbook deploy.yml -l 172.16.10.59 --tags=pd
# 注意 这里需要上新增 pd 服务器中手动修改配置文件
## 修改 vim scripts/run_pd.sh
### 删除:
--initial-cluster="pd1=http://172.16.10.59:2380,pd2=http://172.16.10.60:2380,pd3=http://172.16.10.61:2380,pd4=http://172.16.10.62:2380" \
### 添加:
--join="http://172.16.10.60:2379" \
### 注意:
1.端口为2379
2.修改 inventory.ini 配置文件时,新加 pd 的 ip 加在最后,因为 run_pd.sh 的脚本中有个name 的属性,里面的名字是 pd+顺序 id 拼接的,如果写的位置不是最后一个,可能会造成这个属性冲突。
## 手动启动
./scripts/start_pd.sh
在中控机上使用 pd-ctl 命令看 member 信息
## 滚动升级,更新所有其他节点记录的pd 信息和相关脚本
ansible-playbook rolling_update.yml
## 更新 Prometheus 配置并重启
ansible-playbook rolling_update_monitor.yml --tags=prometheus
删除59新添的 pd
# 1.使用 pd-ctl 命令查看59的 pd name,并根据 pd name 将其移除pd 集群
./resources/bin/pd-ctl -u http://172.16.10.60:2379 -d member
./resources/bin/pd-ctl -u http://172.16.10.60:2379 -d member delete name pd4
# 2.关闭59上 pd 的服务
ansible-playbook stop.yml -l 172.16.10.59 --tags=pd
# 3.注释掉 inventory.ini 59服务器的 pd 配置
# 4.滚动更新 prometheus
ansible-playbook rolling_update_monitor.yml --tags=prometheus
缩容
剔除61的 tidb
# 关闭 61服务器中的tidb 服务
ansible-playbook stop.yml -l 172.16.10.61 --tags=tidb
# 注释 61服务器
vim inventory.ini
## TiDB Cluster Part
[tidb_servers]
172.16.10.59
172.16.10.60
#172.16.10.61
# 更新 prometheus
ansible-playbook rolling_update_monitor.yml --tags=prometheus
思路:
-
1.关闭需要剔除的 tidb 服务器
-
2.注释中控机配置文件中,tidb 模块中的 ip,避免中控机启动集群再次启动
-
3.剔除的 tidb 物理文件依然在原服务器上
剔除61的 tikv
# 中控机使用 pd-ctl 命令远程剔除
# pd-ctl 命令寻找
[tidb@ip-172-16-10-59 tidb-ansible]$ sudo find / -name pd-ctl*
/home/tidb/wangjun/tidb-ansible/resources/bin/pd-ctl
/home/tidb/wangjun/tidb-ansible/scripts/pd-ctl.sh
/home/tidb/wangjun/tidb-ansible/roles/ops/templates/pd-ctl.sh.j2
# 1.查看 pd 中需要剔除 tikv 的 store id
./resources/bin/pd-ctl -u "http://172.16.10.61:2379" -d store
# 2.根据 store id 去剔除 tikv
./resources/bin/pd-ctl -u "http://172.16.10.61:2379" -d store delete 5
# 3.关闭对应的 tikv
ansible-playbook stop.yml -l 172.16.10.61 --tags=tikv
# 4.注释掉 ini 配置文件中的 IP
ansible-playbook rolling_update_monitor.yml --tags=prometheusvim inventory.ini
# 5.更新掉 prometheus
ansible-playbook rolling_update_monitor.yml --tags=prometheus
思路:
-
1.使用 pd-ctl 找出需要剔除 tikv 的 store 的 id,并剔除
-
2.关闭对应 tikv 的服务(单 node 多实例情况下, -l 接 tikv 的别名来关闭 tikv)
-
3.注释中控机配置文件中,tikv 模块中的 ip,避免中控机启动集群再次启动
-
4.剔除的 tikv 物理文件依然在原服务器上
再次将61的 tikv 添加到集群
# 删除 tikv 余留的物理文件
ansible-playbook unsafe_cleanup_data.yml -l 172.16.10.61 --tags=tikv
# 发现未生效,直接物理删除 data/ 目录,不删除,无法添加成功
# 按照添加 tidb 的方式,将 tikv 添加回集群,添加成功
tikv 多实例
# 关闭集群
ansible-playbook stop.yml
# 销毁集群
ansible-playbook unsafe_cleanup.yml
# 单机多 tikv 部署
vim inventory.ini
TiKV1-1 ansible_host=172.16.10.60 deploy_dir=/data1/wj_deploy_1 tikv_port=20171 labels="host=tikv1"
TiKV1-2 ansible_host=172.16.10.60 deploy_dir=/data1/wj_deploy_2 tikv_port=20172 labels="host=tikv1"
TiKV2-1 ansible_host=172.16.10.61 deploy_dir=/data1/wj_deploy_1 tikv_port=20171 labels="host=tikv2"
TiKV2-2 ansible_host=172.16.10.61 deploy_dir=/data1/wj_deploy_2 tikv_port=20172 labels="host=tikv2"
TiKV3-1 ansible_host=172.16.10.62 deploy_dir=/data1/wj_deploy_1 tikv_port=20171 labels="host=tikv3"
TiKV3-2 ansible_host=172.16.10.62 deploy_dir=/data1/wj_deploy_2 tikv_port=20172 labels="host=tikv3"
...
[pd_servers:vars]
# location_labels = ["zone","rack","host"]
location_labels = ["host"]
[all:vars]
deploy_dir = /data1/wj_deploy
tidb_version = v2.0.0
# 配置 vim conf/tikv.yml(算法参考官网)
## 1.block-cache-size 配置(内存)
### 配置 rocksdb defaultcf 下的 block-cache-size
block-cache-size: "1024MB"
### 配置 rocksdb writecf 下的 block-cache-size
block-cache-size: "1280MB"
### 配置 rocksdb lockcf 下的 block-cache-size
block-cache-size: "145MB"
### 配置 raftdb defaultcf 下的 block-cache-size
block-cache-size: "145MB"
## 2.concurrency 配置(CPU)
### 配置 readpool 下的 high-concurrency、normal-concurrency 和 low-concurrency 三个参数
high-concurrency: 2
normal-concurrency: 2
low-concurrency: 2
## 3.磁盘配置
### 配置 raftsore 下的 capacity 参数
capacity: "40G"
# 正常部署即可
tidb-binlog 集群搭建(ansible 部署方式)
- 三组件:
a)binlog 是由 pump 生成,并异步写入到 kafka;
b)Kafka & ZooKeeper:存储 pump 推来的日志,并且给 drainer 读取
kafka 集群部署
- 参考文件:IP:
https://github.com/pingcap/thirdparty-ops/blob/master/kafka-ansible/zh_cn.md
# 中控机下载 kafka-ansible
git clone https://github.com/pingcap/thirdparty-ops.git
cd kafka-ansible
# 配置 inventory.ini (配置内容具体看参考文件)
[zookeeper_servers]
zk1 ansible_host=172.16.10.59 deploy_dir=/home/tidb/wj_zk_deploy myid=1
zk2 ansible_host=172.16.10.60 deploy_dir=/home/tidb/wj_zk_deploy myid=2
zk3 ansible_host=172.16.10.61 deploy_dir=/home/tidb/wj_zk_deploy myid=3
[kafka_servers]
kafka1 ansible_host=172.16.10.59 deploy_dir=/home/tidb/wj_kafka_deploy data_dirs=/data1/kafka_data,/data1/kafka_data_2 kafka_port=9092 id=1
kafka2 ansible_host=172.16.10.60 deploy_dir=/home/tidb/wj_kafka_deploy data_dirs=/data1/kafka_data,/data1/kafka_data_2 kafka_port=9092 id=2
kafka3 ansible_host=172.16.10.61 deploy_dir=/home/tidb/wj_kafka_deploy data_dirs=/data1/kafka_data,/data1/kafka_data_2 kafka_port=9092 id=3
# 开始部署
## 下载需要的包
ansible-playbook -i inventory.ini local_prepare.yml
## 初始化系统环境,修改内核参数
ansible-playbook -i inventory.ini bootstrap.yml --extra-vars "dev_mode=True"
## 安装依赖包
ansible-playbook -i inventory.ini deploy.yml
## 启动服务
ansible-playbook -i inventory.ini start.yml
- 遇到的问题:
如果发现 kafka 启动失败,日志打印内存不足,可以配置 inventory.ini
中的 kafka_heap_size
大小
kafka监控
# 进入 tidb-ansible 安装目录,修改 inventory.ini 配置
vim inventory.ini
[kafka_exporter_servers]
172.16.10.59
# 更新监控
ansible-playbook rolling_update_monitor.yml
ansible 部署 pump
- 1.关闭 tidb-server
ansible-playbook -i inventory.ini stop.yml --tags=tidb
- 2.配置 inventory.ini
enable_binlog = True
zookeeper_addrs = "172.16.10.59:2181,172.16.10.60:2181,172.16.10.61:2181"
kafka_addrs = "172.16.10.59:9092,172.16.10.60:9092,172.16.10.61:9092"
- 3.更新 tidb 组件
ansible-playbook -i inventory.ini deploy.yml --tags=tidb
- 4.启动 tidb 组件
ansible-playbook -i inventory.ini start.yml --tags=tidb
部署 drainer
# 1.解压下载的包
wget http://download.pingcap.org/tidb-binlog-latest-linux-amd64.tar.gz
tar -zxvf tidb-binlog-latest-linux-amd64.tar.gz
cd tidb-binlog-latest-linux-amd64/
# 2.配置配置文件,参考(https://pingcap.com/docs-cn/tools/tidb-binlog-kafka/#tidb-binlog-%E9%83%A8%E7%BD%B2%E6%96%B9%E6%A1%88)
vim drainer.toml
# 3.启动
./bin/drainer -config drainer.toml &
注意:drainer 下游有两种:
1.db-type 配置为 mysql,使用流复制,传输到 mysql 中
2.db-type 配置为 pb,存放到 binlog 日志目录下
注意2:
经过测试,如果同步有错误,比如上游 tidb 创建一个库下游 mysql 已经存在,这样的话 drainer 会重试5次,如果不成功,自动跳过。
如果是 dml 语句,为了避免数据丢失,会一直重试。
监控
# 修改启动脚本
[tidb@ip-172-16-10-59 tidb-binlog-latest-linux-amd64]$ cat run_drainer.sh
#!/bin/bash
set -e
ulimit -n 1000000
DEPLOY_DIR=/home/tidb/wangjun/tidb-binlog-latest-linux-amd64
cd "${DEPLOY_DIR}" || exit 1
# WARNING: This file was auto-generated. Do not edit!
# All your edit might be overwritten!
exec bin/drainer \
--config=drainer.toml \
--metrics-addr=172.16.10.59:9091 \
# --metrics-interval = 15 \
PbReader工具部署
解析 binlog 的工具
# 注意配置 drainer 的配置文件,开启 pd 模式
# 下载使用
wget http://download.pingcap.org/pb_reader-latest-linux-amd64.tar.gz
tar -zxvf pb_reader-latest-linux-amd64.tar.gz
cd pbReader
bin/pbReader -binlog-file=../data.drainer/binlog-0000000000000000-20180615110715