1 资源规划
硬件要求:
https://pingcap.com/docs-cn/v3.0/how-to/deploy/hardware-recommendations/
生产系统最低配置:
3 个PD、2 个TiDB、3 个TiKV
- PD 本身是一个分布式系统,由多个节点构成一个整体,并且同时有且只有一个主节点对外提供服务。各个节点之间通过选举算法来确定主节点,选举算法要求节点个数是奇数个 (2n+1) ,1 个节点的风险比较高,所以这里使用 3 个节点。
- TiDB 是无状态的,现有集群的 TiDB 服务压力大的话,可以在其他节点直接增加 TiDB 服务,无需多余的配置。我们选择使用两个 TiDB,可以做 HA 和负载均衡。
- TiKV 分布式存储,推荐使用奇数(2n+1)个备份,挂掉n个备份之后数据仍然可用。这里使用3节点、设置3个备份 (默认值)。
测试环境服务器:
TiDB:
(官方建议:16核+ 32GB+ SAS 万兆网卡(2块最佳) 2节点 )
10.99.99.164
10.99.99.165
PD:
(官方建议:4核+ 8GB+ SSD 万兆网卡(2块最佳) 3节点 )
10.99.99.164
10.99.99.165
10.99.99.166
TiKV:
(官方建议:16核+ 32GB+ SSD 万兆网卡(2块最佳) 3节点 )
10.99.99.170
10.99.99.171
10.99.99.172
监控:
(官方建议:8核+ 16GB+ SAS 千兆网卡 1节点 )
10.99.99.166
2 Ansible部署集群
具体步骤安装下面的文档一步一步来即可。
https://pingcap.com/docs-cn/v3.0/how-to/deploy/orchestrated/ansible/
3 安装过程中一些需要注意的点
依赖相关问题 :
在中控机器上安装 Ansible 及其依赖:
以 tidb 用户登录中控机,请务必按以下方式通过 pip 安装 Ansible 及其相关依赖的指定版本,否则会有兼容问题。
安装完成后,可通过 ansible --version 查看 Ansible 版本。
目前 release-2.0、release-2.1 及 master 版本兼容 Ansible 2.4 及 Ansible 2.5 版本,Ansible 及相关依赖版本记录在 tidb-ansible/requirements.txt 文件中。
$ cd /home/tidb/tidb-ansible
$ sudo pip install -r ./requirements.txt
$ ansible --version
ansible 2.5.0
安装问题 1:
执行 sudo pip install -r ./requirements.txt 由于测试服务器没有pip,需手动安装
1 安装setuptools-2.0
wget --no-check-certificat https://pypi.python.org/packages/source/s/setuptools/setuptools-2.0.tar.gz
tar zxf setuptools-2.0.tar.gz
cd setuptools-2.0
python setup.py install
2 pip 安装
pip官网下载链接(https://pypi.python.org/pypi/pip#downloads)
tar zxvf pip-10.0.1.tar.gz
cd pip-10.0.1
python setup.py install
安装问题 2:
在中控机上配置部署机器 ssh 互信及 sudo 规则
以 tidb 用户登录中控机,将你的部署目标机器 IP 添加到 hosts.ini 文件 [servers] 区块下。
$ cd /home/tidb/tidb-ansible
$ vi hosts.ini
[servers]
10.99.99.164
10.99.99.165
10.99.99.166
10.99.99.170
10.99.99.171
10.99.99.172
[all:vars]
username = tidb
ntp_server = pool.ntp.org
执行以下命令,按提示输入部署目标机器 root 用户密码。该步骤将在部署目标机器上创建 tidb 用户,并配置 sudo 规则,配置中控机与部署目标机器之间的 ssh 互信。
$ ansible-playbook -i hosts.ini create_users.yml -u root -k
安装问题 3:
遇到报错:
msg: to use the 'ssh' connection type with passwords, you must install the sshpass program
这是由于没有安装sshpass 包导致。 中控机上安装即可。
wget http://sourceforge.net/projects/sshpass/files/latest/download -O sshpass.tar.gz
tar -xvf sshpass.tar.gz
cd sshpass-1.06
./configure
make install
安装问题 4:
配置文件修改:
vi /home/tidb/tidb-ansible/inventory.ini
[tidb_servers]
10.99.99.164
10.99.99.165
[tikv_servers]
10.99.99.170
10.99.99.171
10.99.99.172
[pd_servers]
10.99.99.164
10.99.99.165
10.99.99.166
## Monitoring Part
# prometheus and pushgateway servers
[monitoring_servers]
10.99.99.166
[grafana_servers]
10.99.99.166
# node_exporter and blackbox_exporter servers
[monitored_servers]
10.99.99.164
10.99.99.165
10.99.99.166
10.99.99.170
10.99.99.171
10.99.99.172
[alertmanager_servers]
10.99.99.166
## Global variables
[all:vars]
deploy_dir = /data/tidb/deploy
# 注意:部署目录调整通过 deploy_dir 变量控制
性能参数调整
vi tidb-ansible/conf/tikv.yml
storage:
block-cache:
capacity: "5GB"
# 推荐设置:capacity = MEM_TOTAL * 0.5 / TiKV 实例数量
readpool:
coprocessor:
# Notice: if CPU_NUM > 8, default thread pool size for coprocessors
# will be set to CPU_NUM * 0.8.
# high-concurrency: 8
# normal-concurrency: 8
# low-concurrency: 8
# 推荐设置:TiKV 实例数量 * 参数值 = CPU 核心数量 * 0.8
安装问题 5:
执行 ansible-playbook bootstrap.yml 由于内存不足报错:
ERROR MESSAGE SUMMARY ****************************************************************
[10.99.99.164]: Ansible Failed! => changed=False
msg: This machine does not have sufficient RAM to run TiDB, at least 16000 MB.
free -m 确实少于16000MB
修改限制阈值:
在安装目录中找到配置文件 main.yml
cd /home/tidb/tidb-ansible/roles/check_system_optional/defaults
vi main.yml
将tidb_min_ram值改成小于16000 MB
安装问题 6:
执行 ansible-playbook deploy.yml 报错:
TASK [check_system_dynamic : Preflight check - Does every node in cluster have different hostname] *******************
fatal: [10.99.99.164]: FAILED! => changed=false
msg: |-
hostnames of all nodes in cluster: [localhost, localhost, localhost, localhost, localhost, localhost]
因为主机名都是localhost,要修改对应的主机名
hostnamectl --static set-hostname tidb01
安装问题 7:
执行 ansible-playbook deploy.yml 报错:
TASK [check_system_dynamic : Preflight check - NTP service] *****************************************************************************************
fatal: [10.99.99.164]: FAILED! => changed=false
msg: Make sure NTP service is running and ntpstat is synchronised to NTP server. See https://github.com/pingcap/docs/blob/master/dev/how-to/deploy/orchestrated/ansible.md#how-to-check-whether-the-ntp-service-is-normal .
未配置NTP。用以下命令可使 NTP 服务 开始同步
sudo systemctl stop ntpd.service
sudo ntpdate pool.ntp.org
sudo systemctl start ntpd.service
ntpstat
4 数据库启停
启动 TiDB 集群
su - tidb
cd /home/tidb/tidb-ansible
ansible-playbook start.yml
输出很长,最后的状态全是ok就可以。
PLAY RECAP *****************************************************************************************************************************
10.99.99.164 : ok=16 changed=4 unreachable=0 failed=0
10.99.99.165 : ok=15 changed=4 unreachable=0 failed=0
10.99.99.166 : ok=33 changed=10 unreachable=0 failed=0
10.99.99.170 : ok=14 changed=3 unreachable=0 failed=0
10.99.99.171 : ok=14 changed=3 unreachable=0 failed=0
10.99.99.172 : ok=14 changed=3 unreachable=0 failed=0
localhost : ok=7 changed=4 unreachable=0 failed=0
Congrats! All goes well. :-)
[tidb@localhost tidb-ansible]$
关闭 TiDB 集群
cd /home/tidb/tidb-ansible
ansible-playbook stop.yml
5 连接集群与监控
测试连接 TiDB 集群,推荐在 TiDB 前配置负载均衡来对外统一提供 SQL 接口。
使用 MySQL 客户端连接测试,TCP 4000 端口是 TiDB 服务默认端口。
mysql -u root -h 10.99.99.164 -P 4000
(默认root密码为空,连接后要修改下)
通过浏览器访问监控平台。
地址:
http://10.99.99.166:3000
默认帐号密码:
admin/admin
6 简单测试下性能
按照官方建议,TiKV只有使用SSD以上级别的磁盘,才能发挥TiDB的性能,代码中对传统的SAS磁盘并没有做过多的优化,特别是性能较差的连安装的检查都不会通过。而我的乞丐版环境中并没有SSD,所以对比MySQL性能提升并是特别大。
由于我使用TiDB的目的是补充MySQL在OLAP方面的不足,因此以下只针对对大表的插入和统计 ,分别在MySQL和TIDB中做个对比。
【声明:以下未使用官方建议配置,只做研究不代表测试结果的好坏】
# MySQL测试性能:
CREATE TABLE T_MYSQL(ID INTEGER PRIMARY KEY, NAME VARCHAR(100));
(root@localhost:mysql.sock)[trades]insert into T_MYSQL select id+(select max(id) from T_MYSQL),name from T_MYSQL;
Query OK, 12582912 rows affected (1 min 28.49 sec)
Records: 12582912 Duplicates: 0 Warnings: 0
(root@localhost:mysql.sock)[trades]select count(*) from T_MYSQL;
+----------+
| count(*) |
+----------+
| 25165824 |
+----------+
1 row in set (2.93 sec)
(root@localhost:mysql.sock)[trades]select NAME,count(*) from T_MYSQL group by NAME;
+------+----------+
| NAME | count(*) |
+------+----------+
| Ann | 8388608 |
| Ed | 8388608 |
| Emma | 8388608 |
+------+----------+
3 rows in set (17.88 sec)
(root@localhost:mysql.sock)[trades]insert into T_MYSQL select id+(select max(id) from T_MYSQL),name from T_MYSQL;
Query OK, 25165824 rows affected (3 min 3.78 sec)
Records: 25165824 Duplicates: 0 Warnings: 0
(root@localhost:mysql.sock)[trades]select count(*) from T_MYSQL;
+----------+
| count(*) |
+----------+
| 50331648 |
+----------+
1 row in set (5.91 sec)
(root@localhost:mysql.sock)[trades]select NAME,count(*) from T_MYSQL group by NAME;
+------+----------+
| NAME | count(*) |
+------+----------+
| Ann | 16777216 |
| Ed | 16777216 |
| Emma | 16777216 |
+------+----------+
3 rows in set (37.81 sec)
# TiDB测试性能:
CREATE TABLE T_TIDB(ID INTEGER PRIMARY KEY, NAME VARCHAR(100));
(root@10.99.99.164:4000)[test]insert into T_TIDB select id+(select max(id) from T_TIDB),name from T_TIDB;
Query OK, 12582912 rows affected (4 min 9.68 sec)
Records: 12582912 Duplicates: 0 Warnings: 0
(root@10.99.99.164:4000)[test]select count(*) from T_TIDB;
+----------+
| count(*) |
+----------+
| 25165824 |
+----------+
1 row in set (1.34 sec)
(root@10.99.99.164:4000)[test]select NAME,count(*) from T_TIDB group by NAME;
+------+----------+
| NAME | count(*) |
+------+----------+
| Ann | 8388608 |
| Emma | 8388608 |
| Ed | 8388608 |
+------+----------+
3 rows in set (1.81 sec)
(root@10.99.99.164:4000)[test]
(root@10.99.99.164:4000)[test]insert into T_TIDB select id+(select max(id) from T_TIDB),name from T_TIDB;
Query OK, 25165824 rows affected (8 min 23.53 sec)
Records: 25165824 Duplicates: 0 Warnings: 0
(root@10.99.99.164:4000)[test]select count(*) from T_TIDB;
+----------+
| count(*) |
+----------+
| 50331648 |
+----------+
1 row in set (2.87 sec)
(root@10.99.99.164:4000)[test]select NAME,count(*) from T_TIDB group by NAME;
+------+----------+
| NAME | count(*) |
+------+----------+
| Ed | 16777216 |
| Emma | 16777216 |
| Ann | 16777216 |
+------+----------+
3 rows in set (3.50 sec)
TiDB 的大表查询统计即使在低配磁盘上,仍然比MySQL快不少。