Skip to content
On this page

TiDB-单机多TiKV实例、多TiDB实例部署

时间:2021-01-06

summary

配置inventory的TiKV部分

配置范例:

python
[tidb@tidb01-41 tidb-ansible]$ vi inventory.ini

[tidb_servers]
TiDB1-11 ansible_host=192.168.1.42 deploy_dir=/data1/deploy tikv_port=4000 tikv_status_port=10080
TiDB1-12 ansible_host=192.168.1.42 deploy_dir=/data2/deploy tikv_port=4001 tikv_status_port=10081
TiDB2-21 ansible_host=192.168.1.43 deploy_dir=/data1/deploy tikv_port=4000 tikv_status_port=10080
TiDB2-22 ansible_host=192.168.1.43 deploy_dir=/data2/deploy tikv_port=4001 tikv_status_port=10081



[pd_servers]
192.168.1.41
192.168.1.42
192.168.1.43

# 注意:要使用 TiKV 的 labels,必须同时配置 PD 的 location_labels 参数,否则 labels 设置不生效。

# 多实例场景需要额外配置 status 端口,示例如下:

[tikv_servers]
TiKV1-11 ansible_host=192.168.1.41 deploy_dir=/data1/deploy tikv_port=20171 tikv_status_port=20181 labels="host=tikv1"
TiKV1-12 ansible_host=192.168.1.41 deploy_dir=/data2/deploy tikv_port=20172 tikv_status_port=20182 labels="host=tikv1"
TiKV2-21 ansible_host=192.168.1.42 deploy_dir=/data1/deploy tikv_port=20171 tikv_status_port=20181 labels="host=tikv2"
TiKV2-22 ansible_host=192.168.1.42 deploy_dir=/data2/deploy tikv_port=20172 tikv_status_port=20182 labels="host=tikv2"
TiKV3-31 ansible_host=192.168.1.43 deploy_dir=/data1/deploy tikv_port=20171 tikv_status_port=20181 labels="host=tikv3"
TiKV3-32 ansible_host=192.168.1.43 deploy_dir=/data2/deploy tikv_port=20172 tikv_status_port=20182 labels="host=tikv3"


[monitoring_servers]
192.168.1.42

[grafana_servers]
192.168.1.42

[monitored_servers]
# 192.168.1.41
192.168.1.42
192.168.1.43



# 为使 TiKV 的 labels 设置生效,部署集群时必须设置 PD 的 location_labels 参数
[pd_servers:vars]
location_labels = ["host"]

labels参数作用:

  • labels 是 Region 调度的最小单元,每一个 raft group 中不同的 replica 不会在扩展过程中被迁移到同一个lable单元,避免这种情况下 server 宕机导致的单点问题(3副本,2副本落在同一个server)。
  • raft group 的 multi-replica 主要解决的是数据的容灾问题,labels 参数可以有效防止随数据扩展,在Region 迁移过程中因散列计算 Region 迁移位置时,由于冲撞导致的同一个 server 存储同一个 Region group 的多个 replica 的情况。
  • 可以给一个服务器打一个 labels、可以给一个服务器机柜打一个 labels,也可以是一个 IDC 打一个 labels。

集群节点环境配置与参数限制

block-cache-size下的capacity参数调整

多实例情况下,需要修改 tidb-ansible/conf/tikv.yml 中 block-cache-size 下面的 capacity 参数; 用以限制每个TiKV实例用于block-cache的内存使用限制。

官方推荐设置:capacity = MEM_TOTAL * 0.5 / TiKV 实例数量

本例:各节点内存3G,每个节点部署两台实例,因此 capacity = 3 * 0.5 / 2 = 0.75GB

shell
[tidb@tidb01-41 ~]$ vi ~/tidb-ansible/conf/tikv.yml


storage:
  block-cache:
    capacity: "0.75GB"

readpool下coprocessor的并发度调整

官方推荐设置: 参数值 = ( CPU 核心数量 * 0.8 ) / TiKV 实例数量

本例:各节点部署两个实例,CPU 核心数量 8 个,参数值 = ( 8 * 0.8 ) / 2 = 3

shell
# 使用 shell 命令查看逻辑核心数量
[tidb@tidb01-41 tidb-ansible]$ cat /proc/cpuinfo| grep "processor"| wc -l
8


[tidb@tidb01-41 ~]$ vi ~/tidb-ansible/conf/tikv.yml


readpool:
  coprocessor:
    # Notice: if CPU_NUM > 8, default thread pool size for coprocessors
    # will be set to CPU_NUM * 0.8.
    high-concurrency: 3
    normal-concurrency: 3
    low-concurrency: 3

raftstore下的capacity参数调整

如果多个 TiKV 实例部署在同一块物理磁盘上,需要修改 conf/tikv.yml 中的 capacity 参数,限制每个 TiKV 实例所能使用的磁盘容量,官方推荐配置:capacity = 磁盘总容量 / TiKV 实例数量。

本例:各节点限制使用磁盘容量为 5 GB ,capacity = 5GB

vi ~/tidb-ansible/conf/tikv.yml


raftstore:
  capacity = 5GB

中控机操作部署机建用户

执行以下命令,依据输入部署目标机器的 root 用户密码; 本例新增节点IP为192.168.1.44;

python
[tidb@tidb01-41 tidb-ansible]$ vi hosts.ini 
[tidb@tidb01-41 tidb-ansible]$ cat hosts.ini 
[servers]
192.168.1.44


[all:vars]
username = tidb
ntp_server = cn.pool.ntp.org



[tidb@tidb01-41 tidb-ansible]$ ansible-playbook -i hosts.ini create_users.yml -u root -k
SSH password: 

PLAY [all] ***************************************************************************************************************

......
......

Congrats! All goes well. :-)

验证互信时候成功

[tidb@tidb01-41 tidb-ansible]$ ansible -i inventory.ini all -m shell -a 'whoami'
192.168.1.43 | SUCCESS | rc=0 >>
tidb

192.168.1.42 | SUCCESS | rc=0 >>
tidb

TiDB1-21 | SUCCESS | rc=0 >>
tidb

TiDB1-22 | SUCCESS | rc=0 >>
tidb

TiDB1-12 | SUCCESS | rc=0 >>
tidb

192.168.1.41 | SUCCESS | rc=0 >>
tidb

TiDB1-11 | SUCCESS | rc=0 >>
tidb

TiKV3-31 | SUCCESS | rc=0 >>
tidb

TiKV3-32 | SUCCESS | rc=0 >>
tidb

TiKV2-21 | SUCCESS | rc=0 >>
tidb

TiKV2-22 | SUCCESS | rc=0 >>
tidb

TiKV1-11 | SUCCESS | rc=0 >>
tidb

TiKV1-12 | SUCCESS | rc=0 >>
tidb

验证sudo 免密码配置成功

[tidb@tidb01-41 tidb-ansible]$ ansible -i inventory.ini all -m shell -a 'whoami' -b
192.168.1.43 | SUCCESS | rc=0 >>
root

TiDB1-12 | SUCCESS | rc=0 >>
root

192.168.1.41 | SUCCESS | rc=0 >>
root

192.168.1.42 | SUCCESS | rc=0 >>
root

TiDB1-11 | SUCCESS | rc=0 >>
root

TiDB1-21 | SUCCESS | rc=0 >>
root

TiDB1-22 | SUCCESS | rc=0 >>
root

TiKV2-21 | SUCCESS | rc=0 >>
root

TiKV2-22 | SUCCESS | rc=0 >>
root

TiKV3-31 | SUCCESS | rc=0 >>
root

TiKV3-32 | SUCCESS | rc=0 >>
root

TiKV1-11 | SUCCESS | rc=0 >>
root

TiKV1-12 | SUCCESS | rc=0 >>
root

中控机操作部署机配置ntp服务

注意:生产上应该指向自己的ntp服务器,本次测试采用了公网公用的ntp服务不稳定。

[tidb@tidb01-41 tidb-ansible]$ ansible-playbook -i hosts.ini deploy_ntp.yml -u tidb -b

......
......

Congrats! All goes well. :-)

中控及操作部署机设置CPU模式

调整CPU模式,如果同本文出现一样的报错,说明此版本的操作系统不支持CPU模式修改,可直接跳过。

shell
[tidb@tidb01-41 tidb-ansible]$ ansible -i hosts.ini all -m shell -a "cpupower frequency-set --governor performance" -u tidb -b

192.168.1.44 | FAILED | rc=237 >>
Setting cpu: 0
Error setting new values. Common errors:
- Do you have proper administration rights? (super-user?)
- Is the governor you requested available and modprobed?
- Trying to set an invalid policy?
- Trying to set a specific frequency, but userspace governor is not available,
   for example because of hardware which cannot be set to a specific frequency
   or because the userspace governor isn't loaded?non-zero return code

ansible部署命令黄金五步骤走

执行local_prepare联网下载binary包

执行 local_prepare.yml playbook,联网下载 TiDB binary 至中控机。

shell
[tidb@tidb01-41 tidb-ansible]$ ansible-playbook local_prepare.yml

PLAY [do local preparation] ***************************************************************************

......
......

Congrats! All goes well. :-)

初始化系统环境并修改内核参数

[tidb@tidb01-41 tidb-ansible]$ ansible-playbook bootstrap.yml

PLAY [initializing deployment target] *****************************************************************

......
......

Congrats! All goes well. :-)

部署TiDB集群软件

[tidb@tidb01-41 tidb-ansible]$ ansible-playbook deploy.yml

PLAY [check config locally] ***************************************************************************

......
......

PLAY RECAP ********************************************************************************************
192.168.1.41               : ok=53   changed=4    unreachable=0    failed=0   
192.168.1.42               : ok=121  changed=16   unreachable=0    failed=0   
192.168.1.43               : ok=52   changed=4    unreachable=0    failed=0   
TiDB1-11                   : ok=26   changed=1    unreachable=0    failed=0   
TiDB1-12                   : ok=26   changed=2    unreachable=0    failed=0   
TiDB1-21                   : ok=26   changed=2    unreachable=0    failed=0   
TiDB1-22                   : ok=26   changed=1    unreachable=0    failed=0   
TiKV1-11                   : ok=28   changed=5    unreachable=0    failed=0   
TiKV1-12                   : ok=28   changed=4    unreachable=0    failed=0   
TiKV2-21                   : ok=28   changed=3    unreachable=0    failed=0   
TiKV2-22                   : ok=28   changed=3    unreachable=0    failed=0   
TiKV3-31                   : ok=28   changed=3    unreachable=0    failed=0   
TiKV3-32                   : ok=28   changed=3    unreachable=0    failed=0   
localhost                  : ok=7    changed=4    unreachable=0    failed=0   

Congrats! All goes well. :-)

安装Dashboard依赖包

Grafana Dashboard 上的 Report 按钮可用来生成 PDF 文件,此功能依赖 fontconfig 包和英文字体。如

[root@tidb01-41 tmp]# sudo yum install fontconfig open-sans-fonts

执行start启动TiDB集群

[tidb@tidb01-41 tidb-ansible]$ ansible-playbook start.yml

PLAY [check config locally] **********************************************************************************************

......
......

PLAY RECAP *******************************************************************************************************************************************************************************************************
192.168.1.41               : ok=9    changed=2    unreachable=0    failed=0   
192.168.1.42               : ok=34   changed=10   unreachable=0    failed=0   
192.168.1.43               : ok=12   changed=3    unreachable=0    failed=0   
TiDB1-11                   : ok=6    changed=1    unreachable=0    failed=0   
TiDB1-12                   : ok=6    changed=1    unreachable=0    failed=0   
TiDB2-21                   : ok=6    changed=1    unreachable=0    failed=0   
TiDB2-22                   : ok=6    changed=1    unreachable=0    failed=0   
TiKV1-11                   : ok=8    changed=1    unreachable=0    failed=0   
TiKV1-12                   : ok=8    changed=1    unreachable=0    failed=0   
TiKV2-21                   : ok=8    changed=1    unreachable=0    failed=0   
TiKV2-22                   : ok=8    changed=1    unreachable=0    failed=0   
TiKV3-31                   : ok=8    changed=1    unreachable=0    failed=0   
TiKV3-32                   : ok=8    changed=1    unreachable=0    failed=0   
localhost                  : ok=7    changed=4    unreachable=0    failed=0   

Congrats! All goes well. :-)

验证是否安装成功

  • MySQL客户端连接验证
[tidb@tidb01-41 tidb-ansible]$ mysql -uroot -P4000 -h192.168.1.43
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 5.7.25-TiDB-v3.0.1 MySQL Community Server (Apache License 2.0)
MySQL [(none)]> exit
Bye

[tidb@tidb01-41 tidb-ansible]$ mysql -uroot -P4000 -h192.168.1.42
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 5.7.25-TiDB-v3.0.1 MySQL Community Server (Apache License 2.0)
MySQL [(none)]> exit
Bye

[tidb@tidb01-41 tidb-ansible]$ mysql -uroot -P4001 -h192.168.1.43
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.43' (111)

[tidb@tidb01-41 tidb-ansible]$ mysql -uroot -P4001 -h192.168.1.42
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.42' (111)

出现了TiDB实例没有起来的状况,但是ansible没有报错!

[tidb@tidb02-42 deploy]$ pwd
/data1/deploy

[tidb@tidb02-42 deploy]$ ./bin/tidb-server -P 4001 --status=10081 1-advertise-address=192.168.1.42 --path=192.168.1.42:2379,192.168.1.43:2379 --config=conf/tidb.toml --log-slow-query=/data1/deploy/log/tidb_slow_query.log --log-file=/data1/deploy/log/tidb.log

......
......

[2021/01/06 10:08:41.846 -05:00] [INFO] [domain.go:554] ["domain closed"] ["take time"=82.116µs]
sync log err: sync /dev/stdout: invalid argument

[tidb@tidb01-41 tidb-ansible]$ mysql -uroot -P4001 -h192.168.1.42
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.7.25-TiDB-v3.0.1 MySQL Community Server (Apache License 2.0)


MySQL [(none)]> exit
Bye

  • grafana图形界面验证 grafana节点校验

参考文章

PingCAP官方文档-单机单 TiKV 实例集群拓扑