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.gztar zxf setuptools-2.0.tar.gz cd setuptools-2.0python 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.1python setup.py install
安装问题 2:
在中控机上配置部署机器 ssh 互信及 sudo 规则
以 tidb 用户登录中控机,将你的部署目标机器 IP 添加到 hosts.ini 文件 [servers] 区块下。
$ cd home/tidb/tidb-ansible$ vi hosts.ini[servers]10.99.99.16410.99.99.16510.99.99.16610.99.99.17010.99.99.17110.99.99.172[all:vars]username = tidbntp_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.16410.99.99.165[tikv_servers]10.99.99.17010.99.99.17110.99.99.172[pd_servers]10.99.99.16410.99.99.16510.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.16410.99.99.16510.99.99.16610.99.99.17010.99.99.17110.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.ymlstorage: 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/defaultsvi 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--staticset-hostnametidb01
安装问题 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.servicesudo ntpdate pool.ntp.orgsudo systemctl start ntpd.servicentpstat
4 数据库启停
启动 TiDB 集群
su - tidbcd home/tidb/tidb-ansibleansible-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=0Congrats! All goes well. :-)[tidb@localhost tidb-ansible]$
关闭 TiDB 集群
cd home/tidb/tidb-ansibleansible-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快不少。
圣诞快乐!