TiDB 扩容缩容
检测TiDB-servers运行情况
[tidb@dev10 tidb-ansible]$ ansible -i inventory.ini tidb_servers -m shell -a "curl http://{{ ansible_host }}:{{ tidb_status_port }}/status"
TiDB 集群可以在不影响线上服务的情况下进行扩容和缩容。以下缩容示例中,被移除的节点没有混合部署其他服务;如果混合部署了其他服务,不能按如下操作。
tikv缩容问题
tikv 默认最少 3 个节点,不能从 3 节点缩容,tikv 节点由 3 到 2 节点缩容,节点不会变成 tombstone 状态。此时需要将 下线节点的状态改成 up,如测试缩容步骤,建议先扩容至 4 节点,再进行缩容操作。
扩容 TiKV 节点
注意:
单机多KV 与 单机间单KV 扩容缩容的区别就是 指定IP
还是指定 IP的别名
例如:
[tikv_servers]
TiKV1-1 ansible_host=192.161.10.52 deploy_dir=/home/tidb/data1/deploy tikv_port=20171 tikv_status_port=20111 labels="host=tikv1"
TiKV1-2 ansible_host=192.161.10.52 deploy_dir=/home/tidb/data2/deploy tikv_port=20172 tikv_status_port=20112 labels="host=tikv1"
TiKV1-3 ansible_host=192.161.10.52 deploy_dir=/home/tidb/data3/deploy tikv_port=20173 tikv_status_port=20113 labels="host=tikv1"
单机多
KV使用命令: ansible-playbook *.yml -l TiKV1-3
如果是修改单台 tikv 节点的配置,参考步骤如下:
1. 单独修改 TiKV1-1
的配置文件到最新配置,不要 tikv 节点的修改模板文件。如果修改了 模板文件,那么所有的 tikv 节点需要滚动升级
2. ansible-playbook stop.yml -l TiKV1-1
(因为改服务器指定了别名,所以建议使用别名)
3. ansible-playbook start.yml -l TiKV1-1
(因为改服务器指定了别名,所以建议使用别名)
单机单
KV使用命令: ansible-playbook *.yml -l 192.161.110.52
1.编辑 inventory.ini 文件
[tidb@dev10 tidb-ansible]$ vim inventory.ini
## TiDB Cluster Part
[tidb_servers]
192.161.10.33
192.161.10.34
[pd_servers]
192.161.10.33
192.161.10.34
192.161.10.35
### step 1 将节点机IP追加到 [tikv_servers] 后面
[tikv_servers]
192.161.10.35
192.161.10.36
192.161.10.37
192.161.10.51
# 加入目标机
192.161.10.52
192.161.10.53
### step 2 将节点机IP追加到 [monitored_servers] 后面,告诉普罗米修斯要监控它
# node_exporter and blackbox_exporter servers
[monitored_servers]
192.161.10.33
192.161.10.34
192.161.10.35
192.161.10.36
192.161.10.37
192.161.10.51
# 加入目标机
192.161.10.52
192.161.10.53
[spark_master]
[spark_slaves]
[monitoring_servers]
192.161.10.33
[grafana_servers]
192.161.10.33
[alertmanager_servers]
192.161.10.33
2.配置添加 集群 hosts
[tidb@dev10 tidb-ansible]$ vim hosts.ini
[servers]
192.161.10.33
192.161.10.34
192.161.10.35
192.161.10.36
192.161.10.37
192.161.10.51
# 加入目标机
192.161.10.52
192.161.10.53
[all:vars]
username = tidb
ntp_server = pool.ntp.org
3.清空tikv缓存(如果之前没安装,就跳过此步)
[tidb@dev10 tidb-ansible]$ ansible-playbook unsafe_cleanup.yml --tags=tikv -l 192.161.10.52,192.161.10.53
[tidb@dev10 tidb-ansible]$
# 物理删除节点机的缓存文件
[tidb@dev17 tidb-ansible]$ rm -rf /home/tidb/deploy/data/
[tidb@dev11 tidb-ansible]$ rm -rf /home/tidb/deploy/data/
4.配置中控机与新目标机器之间的 ssh 互信(如果已经配置,跳过此步)
[tidb@dev10 tidb-ansible]$ ansible-playbook -i hosts.ini create_users.yml -u root -k
5.配置时间同步
[tidb@dev10 tidb-ansible]$ ansible-playbook -i hosts.ini deploy_ntp.yml -u tidb -b
6.初始化新增节点 并跳过磁盘检查
- 192.161.10.52
- 192.161.10.53
ansible-playbook bootstrap.yml -l 目标机IP --extra-vars "dev_mode=True"
[tidb@dev10 tidb-ansible]$ ansible-playbook bootstrap.yml -l 192.161.10.52,192.161.10.53 --extra-vars "dev_mode=True"
......
Congrats! All goes well. :-)
注意:
如果 inventory.ini 中为节点配置了别名,如 node101 ansible_host=172.16.10.101,执行 ansible-playbook 时 -l 请指定别名,以下步骤类似。例如:ansible-playbook bootstrap.yml -l node101,node102
7.部署新增节点
[tidb@dev10 tidb-ansible]$ ansible-playbook deploy.yml -l 192.161.10.52,192.161.10.53
......
Congrats! All goes well. :-)
1.启动新节点服务
[tidb@dev10 tidb-ansible]$ ansible-playbook start.yml -l 192.161.10.52,192.161.10.53
......
Congrats! All goes well. :-)
9.更新 Prometheus 配置并重启
[tidb@dev10 tidb-ansible]$ ansible-playbook rolling_update_monitor.yml --tags=prometheus
监控
监控地址: http://192.161.10.33:3000/login
User: admin
Password: admin
节点上报状态: http://12.16.0.1:9091
缩容 TiKV 节点
- 删除 dev15 192.161.10.37 节点
- 通过如下命令来查询 所有节点的详细配置信息
/home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://监控机的IP地址:2379" -d store
[tidb@dev10 tidb-ansible]$ /home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://192.161.10.33:2379" -d store
{
"count": 6,
"stores": [
{
"store": {
"id": 1,
"address": "192.161.10.37:20160",
"version": "2.1.4",
"state_name": "Up" # 在线
},
"status": {
......
}
},
......
[tidb@dev10 tidb-ansible]$
1.根据 store id 将服务下线
下线需要一定时间,下线节点的状态变为 state_name: Tombstone 就说明下线成功了
[tidb@dev10 tidb-ansible]$ /home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://192.161.10.33:2379" -d store delete 1
Success!
[tidb@dev10 tidb-ansible]$
2.查看状态
[tidb@dev10 tidb-ansible]$ /home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://192.161.10.33:2379" -d store 1
{
"store": {
"id": 1,
"address": "192.161.10.37:20160",
"state": 1,
"version": "2.1.4",
"state_name": "Offline" # 这个 store 正在将其中的 Region 转移到其他节点,此时这个 store 仍在服务中
},
"status": {
......
}
}
[tidb@dev10 tidb-ansible]$
[tidb@dev10 tidb-ansible]$
[tidb@dev10 tidb-ansible]$
[tidb@dev10 tidb-ansible]$ /home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://192.161.10.33:2379" -d store 1
{
"store": {
"id": 1,
"address": "192.161.10.37:20160",
"state": 1,
"version": "2.1.4",
"state_name": "Tombstone" # 这个 store 已经完成下线,此时 store 上已经没有数据,可以关闭实例
},
"status": {
......
}
}
[tidb@dev10 tidb-ansible]$
2.1store 的状态说明:
- Up:这个 store 正常服务
- Disconnected:当前没有检测到这个 store 的心跳,可能是故障或网络连接中断
- Down:超过一小时(可通过 max-down-time 配置)没有收到 store 心跳,此时 PD 会为这个 store 上的数据添加副本
- Offline:这个 store 正在将其中的 Region 转移到其他节点,此时这个 store 仍在服务中
- Tombstone:这个 store 已经完成下线,此时 store 上已经没有数据,可以关闭实例
3.下线成功后,停止服务 (停服要慎重,下线完成后在进行停服
)
# 只关掉节点机器上的TiKV
[tidb@dev10 tidb-ansible]$ ansible-playbook stop.yml --tags=tikv -l 192.161.110.37
4.编辑 inventory.ini 文件,移除节点信息
## TiDB Cluster Part
[tidb_servers]
192.161.10.33
192.161.10.34
# 下线成功后在移除这个KV节点
[tikv_servers]
192.161.10.35
192.161.10.36
# 192.161.110.37
192.161.10.51
192.161.10.52
192.161.10.53
......
# 下线成功后在移除这个监控节点,告诉普罗米修斯不用在监控了
[monitored_servers]
192.161.110.35
192.161.110.36
# 192.161.110.37
192.161.110.51
192.161.110.52
192.161.110.53
......
5.更新 Prometheus 配置并重启
[tidb@dev10 tidb-ansible]$ ansible-playbook rolling_update_monitor.yml --tags=prometheus
......
Congrats! All goes well. :-)
[tidb@dev10 tidb-ansible]$
6.清空TiKV缓存
[tidb@dev10 tidb-ansible]$ ansible-playbook unsafe_cleanup.yml --tags=tikv -l 192.161.110.37
打开浏览器访问监控平台:http://192.161.110.33:3000,监控整个集群的状态
7、删除缩容服务器上的文件
rm -rf /home/tidb/deploy*
扩容 PD 节点
目标: 加入新节点 192.161.111.11
1.编辑 inventory.ini 文件,加入节点信息
2.清空pd缓存(如果之前没安装,就跳过此步)
[tidb@test1 tidb-ansible]$ ansible-playbook unsafe_cleanup.yml --tags=pd -l 192.161.111.11
3.重新部署
[tidb@test1 tidb-ansible]$ ansible-playbook bootstrap.yml -l 192.161.111.11 --extra-vars "dev_mode=True"
Congrats! All goes well. :-)
[tidb@test1 tidb-ansible]$
[tidb@test1 tidb-ansible]$
[tidb@test1 tidb-ansible]$
[tidb@test1 tidb-ansible]$
[tidb@test1 tidb-ansible]$ ansible-playbook deploy.yml --tags=pd -l 192.161.111.11
Congrats! All goes well. :-)
[tidb@test1 tidb-ansible]$
4.进入节点机 test4, 修改节点机配置
- 删除
--initial-cluster="......"
不可以使用注释,要直接删除 - 加入
--join="......"
IP地址是现有PD集群中的任意一个即可
# 例子
......
exec bin/pd-server \
--name="pd_test4" \
--client-urls="http://192.161.111.11:2379" \
--advertise-client-urls="http://192.161.111.11:2379" \
--peer-urls="http://192.161.111.11:2310" \
--advertise-peer-urls="http://192.161.111.11:2310" \
--data-dir="/home/tidb/deploy/data.pd" \
--initial-cluster="pd_test1=http://192.161.110.46:2310,pd_test2=http://192.161.110.47:2310,pd_test3=http://192.161.110.41:2310,pd_test4=http://192.161.111.11:2310" \ # 删除这一行,不可以使用注释,要直接删除
--join="http://192.161.110.41:2379" \ # 替换为这一行,IP地址是现有PD集群中的任意一个即可
--config=conf/pd.toml \
--log-file="/home/tidb/deploy/log/pd.log" 2>> "/home/tidb/deploy/log/pd_stderr.log"
......
[tidb@test4 ~]$ vim /home/tidb/deploy/scripts/run_pd.sh
#!/bin/bash
set -e
ulimit -n 1000000
# WARNING: This file was auto-generated. Do not edit!
# All your edit might be overwritten!
DEPLOY_DIR=/home/tidb/deploy
cd "${DEPLOY_DIR}" || exit 1
exec bin/pd-server \
--name="pd_test4" \
--client-urls="http://192.161.111.11:2379" \
--advertise-client-urls="http://192.161.111.11:2379" \
--peer-urls="http://192.161.111.11:2310" \
--advertise-peer-urls="http://192.161.111.11:2310" \
--data-dir="/home/tidb/deploy/data.pd" \
--join="http://192.161.110.41:2379" \
--config=conf/pd.toml \
--log-file="/home/tidb/deploy/log/pd.log" 2>> "/home/tidb/deploy/log/pd_stderr.log"
5.删除缓存节点机中的缓存数据(如果之前没安装,就跳过此步)
# 删除缓存数据
[tidb@test4 ~]$ rm -rf /home/tidb/deploy/data.pd/
# 删除历史pd.log
[tidb@test4 ~]$ rm -rf /home/tidb/deploy/log/pd*
6.启动pd
[tidb@test4 ~]$ /home/tidb/deploy/scripts/start_pd.sh
7.进入主控机,查看PD节点是否成功加入
[tidb@test1 tidb-ansible]$ /home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://192.161.110.46:2379" -d member
1.滚动升级整个集群
[tidb@test1 tidb-ansible]$ ansible-playbook rolling_update.yml
9.启动PD
[tidb@test1 tidb-ansible]$ ansible-playbook start.yml --tags=pd -l 192.161.111.11
10.更新监控
[tidb@test1 tidb-ansible]$ ansible-playbook rolling_update_monitor.yml --tags=prometheus
缩容 PD 节点
目标: 移除 192.161.110.46机器上的 PD服务
- 查看所有PD节点信息
[tidb@test1 tidb-ansible]$ /home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://192.161.110.41:2379" -d member
- 删除要移除的节点
[tidb@test1 tidb-ansible]$ /home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://192.161.110.41:2379" -d member delete name pd_test1
Success!
[tidb@test1 tidb-ansible]$
- 停止PD节点服务
[tidb@test1 tidb-ansible]$ ansible-playbook stop.yml --tags=pd -l 192.161.110.46
-
编辑 inventory.ini 文件,移除节点信息
-
滚动升级整个集群
[tidb@test1 tidb-ansible]$ ansible-playbook rolling_update.yml
- 更新监控
[tidb@test1 tidb-ansible]$ ansible-playbook rolling_update_monitor.yml --tags=prometheus
部署可能出现如下问题
扩容问题ansible-playbook bootstrap.yml -l(需要加此属性 --extra-vars “dev_mode=True”)
[192.161.111.57]: Ansible FAILED! => playbook: bootstrap.yml; TASK: machine_benchmark : Preflight check - Does fio randread iops of tikv_data_dir disk meet requirement; message: {"changed": false, "msg": "fio: randread iops of tikv_data_dir disk is too low: 72 < 40000, it is strongly recommended to use SSD disks for TiKV and PD, or there might be performance issues."}
扩容tikv问题(需要调整cpu调节模式)
TASK [check_system_static : Preflight check - Fail when CPU frequency governor is not set to performance mode] ***********************************************************
fatal: [192.161.110.51]: FAILED! => {"changed": false, "msg": "To achieve maximum performance, it is recommended to set The CPU frequency governor to performance mode, see https://github.com/pingcap/docs/blob/master/dev/how-to/deploy/orchestrated/ansible.md#step-7-configure-the-cpufreq-governor-mode-on-the-target-machine"}
调整cpu调节模式
查看cpu调节模式
cpupower frequency-info --policy
修改cpu模式
cpupower frequency-set --governor performance
扩容start时tikv报错
TASK [wait until the TiKV port is up] ************************************************************************************************************************************
fatal: [192.161.110.51]: FAILED! => {"changed": false, "elapsed": 300, "msg": "the TiKV port 20160 is not up"}
[192.161.110.51]: Ansible FAILED! => playbook: start.yml; TASK: wait until the TiKV port is up; message: {"changed": false, "elapsed": 300, "msg": "the TiKV port 20160 is not up"}
如果kv机器无法连接,想要去除kv在集群中的信息:
参考官方
如果等待较长时间后,该节点仍然无法正常消失或者状态变成 Tombstone,可以考虑以下命令,把节点强制踢出集群:
注意以下命令会直接丢弃该 TiFlash 节点上的副本,有可能导致查询失败,非常规操作,正常不建议使用
curl -X POST 'http://<pd-address>/pd/api/v1/store/<store_id>/state?state=Tombstone'
#例:curl -X POST 'http://172.178.170.77:2379/pd/api/v1/store/222/state?state=Tombstone'
手动删除 TiFlash 的数据文件,具体位置可查看在集群拓扑配置文件中 TiFlash 配置部分下的 data_dir 目录。
4.0.0扩容缩容
TiDB 环境与系统配置检查
TiDB 运行需要有足够的内存,并且不建议使用 swap 作为内存不足的缓冲,这会降低性能。因此建议永久关闭系统 swap,并且不要使用 swapoff -a 方式关闭,否则重启机器后该操作会失效。
建议执行以下命令关闭系统 swap:
echo "vm.swappiness = 0">> /etc/sysctl.conf
swapon -a && swapoff -a
sysctl -p
1、检测及关闭目标部署机器的防火墙
因为在 TiDB 集群中,需要将节点间的访问端口打通才可以保证读写请求、数据心跳等信息的正常的传输。在普遍线上场景中,数据库到业务服务和数据库节点的网络联通都是在安全域内完成数据交互。如果没有特殊安全的要求,建议将目标节点的防火墙进行关闭。否则建议按照端口使用规则,将端口信息配置到防火墙服务的白名单中
1.1、检查防火墙状态(以 CentOS Linux release 7.7.1908 (Core) 为例)
sudo firewall-cmd --state
sudo systemctl status firewalld.service
1.2、关闭防火墙服务
sudo systemctl stop firewalld.service
1.3、关闭防火墙自动启动服务
sudo systemctl disable firewalld.service
1.4、检查防火墙状态
sudo systemctl status firewalld.service
2、查看ntp的状态
sudo systemctl status ntpd.service
如果显示没有安装需要手动安装
如果要在 CentOS 7 系统上手动安装 NTP 服务,可执行以下命令:
sudo yum install ntp ntpdate && \
sudo systemctl start ntpd.service && \
sudo systemctl enable ntpd.service
3、手动配置 SSH 互信及 sudo 免密码
3.1、以 root 用户依次登录到部署目标机器创建 tidb 用户并设置登录密码。
useradd tidb && \
passwd tidb
3.2、执行以下命令,将 tidb ALL=(ALL) NOPASSWD: ALL 添加到文件末尾,即配置好 sudo 免密码。
visudo
tidb ALL=(ALL) NOPASSWD: ALL
3.3、以 tidb 用户登录到中控机
,执行以下命令。将 10.0.1.1 替换成你的部署目标机器 IP,按提示输入部署目标机器 tidb 用户密码,执行成功后即创建好 SSH 互信,其他机器同理。
ssh-copy-id -i ~/.ssh/id_rsa.pub 10.0.1.1
3.4、以 tidb 用户登录中控机,通过 ssh 的方式登录目标机器 IP。如果不需要输入密码并登录成功,即表示 SSH 互信配置成功。
ssh 10.0.1.1
[tidb@10.0.1.1 ~]$
3.5、以 tidb 用户登录到部署目标机器后,执行以下命令,不需要输入密码并切换到 root 用户,表示 tidb 用户 sudo 免密码配置成功。
sudo -su root
[root@10.0.1.1 tidb]#
扩容 TiDB/TiKV/PD 节点
创建扩容文件
[tidb@test1 ~]$ cat > scale-out.yaml << LEO
tidb_servers:
- host: 172.18.181.57
LEO
执行扩容
tiup cluster scale-out <cluster-name>
scale-out.yaml
[tidb@test1 ~]$ tiup cluster scale-out tidb-dev scale-out.yaml
更新监控
[tidb@test1 ~]$ tiup cluster reload tidb-dev -R prometheus
缩容 TiDB/TiKV/PD 节点
查看集群信息
tiup cluster display <cluster-name>
[tidb@test1 ~]$ tiup cluster display tidb-dev
Starting /home/tidb/.tiup/components/cluster/v0.4.6/cluster display tidb-dev
TiDB Cluster: tidb-dev
TiDB Version: v4.0.0-rc
ID Role Host Ports Status Data Dir Deploy Dir
-- ---- ---- ----- ------ -------- ----------
172.18.180.58:9093 alertmanager 172.18.180.58 9093/9094 Up /home/tidb/tidb-data/alertmanager-9093 /home/tidb/tidb-deploy/alertmanager-9093
172.18.180.58:3000 grafana 172.18.180.58 3000 Up - /home/tidb/tidb-deploy/grafana-3000
172.18.180.58:2379 pd 172.18.180.58 2379/2380 Healthy|L /home/tidb/tidb-data/pd-2379 /home/tidb/tidb-deploy/pd-2379
172.18.180.59:2379 pd 172.18.180.59 2379/2380 Healthy /home/tidb/tidb-data/pd-2379 /home/tidb/tidb-deploy/pd-2379
172.18.181.57:2379 pd 172.18.181.57 2379/2380 Healthy /home/tidb/tidb-data/pd-2379 /home/tidb/tidb-deploy/pd-2379
172.18.180.58:9090 prometheus 172.18.180.58 9090 Up /home/tidb/tidb-data/prometheus-9090 /home/tidb/tidb-deploy/prometheus-9090
172.18.180.59:4000 tidb 172.18.180.59 4000/10080 Up - /home/tidb/tidb-deploy/tidb-4000
172.18.181.57:4000 tidb 172.18.181.57 4000/10080 Up - deploy/tidb-4000
172.18.181.6:9000 tiflash 172.18.181.6 9000/8123/3930/20170/20292/8234 Up /home/tidb/tidb-data/tiflash-9000 /home/tidb/tidb-deploy/tiflash-9000
172.18.192.34:20160 tikv 172.18.192.34 20160/20180 Up /home/tidb/tidb-data/tikv-20160 /home/tidb/tidb-deploy/tikv-20160
172.18.192.35:20160 tikv 172.18.192.35 20160/20180 Up /home/tidb/tidb-data/tikv-20160 /home/tidb/tidb-deploy/tikv-20160
172.18.192.36:20160 tikv 172.18.192.36 20160/20180 Up /home/tidb/tidb-data/tikv-20160 /home/tidb/tidb-deploy/tikv-20160
[tidb@test1 ~]$
执行缩容
tiup cluster scale-in <cluster-name>
--node 172.18.180.59:4000
[tidb@test1 ~]$ tiup cluster scale-in tidb-dev --node 172.18.180.59:4000
更新监控
[tidb@test1 ~]$ tiup cluster reload tidb-dev -R prometheus