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

tidb如何增加tidb_mem_quota_query_安装问题

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快不少。