这片文章不会说明TIDB是干嘛的,只是纯粹说明怎么在离线环境下安装TIDB,毕竟线上的环境大部分都是不能联网的。(仅测试使用)参照官方步骤!
在规划之前首先要准备实验环境,在官方的文档中给出了一些部署建议,这里给出链接地址:TIDB部署建议。因为这里是测试环境,对于官方文档的建议好多不能满足,这里仅先满足测试用的OS是centos7.3及以上即可。
[root@docker2 ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
[root@docker2 ~]#
TIDB的整个分布式集群需要三个主要组件:TIDB servers,TIKV,TIPD。另外还需要一个监控服务器,来监控TIDB集群的状态。
这里我们使用5台服务器,来搭建这个TIDB集群,5台服务器的分配如下:
服务器列表 | tidb_servers | tikv_servers | pd_servers | monitoring_servers |
---|---|---|---|---|
10.0.102.209 | √ | √ | ||
10.0.102.210 | √ | √ | ||
10.0.102.212 | √ | √ | ||
10.0.102.102 | √ | √ | ||
10.0.102.162 | √ |
整个服务器的规划如上,下面我们**开始安装TIDB。
因为ITDB的官方文档很详细了,但是就是在参照的时候比较跳转页面,因此这里特总结一下,以便查看。
这里我们选择209这台服务器作为中控机。
首先安装依赖包,依赖包下载地址,下载完成之后安装依赖包。
# tar -xzvf ansible-system-rpms.el7.tar.gz
# cd ansible-system-rpms.el7
# chmod u+x install_ansible_system_rpms.sh
# ./install_ansible_system_rpms.sh
安装完成之后可以使用pip检测是否安装成功:
[root@docker5 ~]# pip -V
pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)
[root@docker5 ~]#
如果你的系统已安装 pip,请确认版本 >= 8.1.2,否则离线安装 ansible 及其依赖时,会有兼容问题。
在中控机上创建tidb用户,并且配置sudo无密码认证,生成tidb用户的密钥
创建tidb用户
useradd -m -d /home/tidb tidb
设置tidb用户的密码
# passwd tidb
设置tidb的sudo
# visudo
tidb ALL=(ALL) NOPASSWD: ALL
切换到tidb用户,然后生成tidb用户的密钥
# su - tidb
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/tidb/.ssh/id_rsa):
Created directory '/home/tidb/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/tidb/.ssh/id_rsa.
Your public key has been saved in /home/tidb/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:eIBykszR1KyECA/h0d7PRKz4fhAeli7IrVphhte7/So [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|=+o+.o. |
|o=o+o.oo |
| .O.=.= |
| . B.B + |
|o B * B S |
| * + * + |
| o + . |
| o E+ . |
|o ..+o. |
+----[SHA256]-----+
验证sudo的设置
[tidb@docker5 ~]$ whoami
tidb
[tidb@docker5 ~]$ sudo su
[root@docker5 tidb]# whoami
root
[root@docker5 tidb]#
在tidb用户下安装ansible
下载离线安装包: ansible2.5离线安装包,安装包的版本需要为2.5
安装ansible
[tidb@docker5 ~]$ tar zxvf ansible-2.5.0-pip.tar.gz
[tidb@docker5 ~]$ cd ansible-2.5.0-pip
[tidb@docker5 ansible-2.5.0-pip]$ ls
ansible_offline_packages install_ansible.sh requirements.txt
[tidb@docker5 ~]$ cd ansible-2.5.0-pip
[tidb@docker5 ansible-2.5.0-pip]$ ls
ansible_offline_packages install_ansible.sh requirements.txt
[tidb@docker5 ~]$ cd ansible-2.5.0-pip
[tidb@docker5 ansible-2.5.0-pip]$ ls
ansible_offline_packages install_ansible.sh requirements.txt
tidb-ansible可以直接下载也可以使用git直接下载,这里给出直接下载的地址: tidb-ansbiel下载,当然也可以使用git下载
git clone https://github.com/pingcap/tidb-ansible.git
接下来安装官方文档要执行如下命令:
cd tidb-ansible
ansible-playbook local_prepare.yml
这个playbook的主要任务是下载安装包然后放到合适的位置,但是若是因为某些情况中控机不能联网,那么就需要从别的地方拷贝了,这是可以把对应的安装拷贝到test-ansible下面的downloads目录和resource目录下面,如下
tidb-ansible的下载包以及这一步所需的安装包会在后面给出,这样就可以不用再执行这一步了。
这时候tidb-ansible目录中已经包含了tidb的安装包以及一些启动脚本,我们这个目录整个拷贝到tidb用户的家目录下面,注意更改权限为tidb。
中控机我们已经配置了sudo规则,但是没有配置ssh互信。用tidb用户登录中控机,然后修改hosts.ini文件,这个文件制定了ansbile命令作用到的主机。
[root@docker5 ~]# su - tidb
Last login: Thu Feb 14 23:52:14 CST 2019 on pts/0
[tidb@docker5 ~]$ cd tidb-ansible/
[tidb@docker5 tidb-ansible]$ cat hosts.ini
[servers]
10.0.102.209
10.0.102.200
10.0.102.212
10.0.102.102
10.0.102.162
[all:vars]
username = tidb
ntp_server = 172.16.140.20
[tidb@docker5 tidb-ansible]$
这个servers包含所有的主机然后执行下面的yml文件;上面的ntp服务若是没有可以注释掉,因为这是测试环境,后面也会注释掉对应ntp服务。
ansible-playbook -i hosts.ini create_users.yml -u root -k
这个yml文件会在指定的主机上创建tidb用户,设置sudo规则,并且配置ssh互信。
在官方文档中,下面有三个步骤,部署ntp服务,配置 CPUfreq 调节器模式,以及挂载ext4系统,我们可以跳过这三个步骤,直接执行下面的步骤。
在文章最开始的时候,我们已经规划了服务器的分配情况,把对应的分配情况写入inventory.ini文件即可。
[tidb@docker5 tidb-ansible]$ cat inventory.ini
## TiDB Cluster Part
[tidb_servers]
10.0.102.209
10.0.102.200
[tikv_servers]
10.0.102.212
10.0.102.102
10.0.102.162
[pd_servers]
10.0.102.200
10.0.102.209
10.0.102.212
[spark_master]
[spark_slaves]
## Monitoring Part
# prometheus and pushgateway servers
[monitoring_servers]
10.0.102.102
[grafana_servers]
10.0.102.102
# node_exporter and blackbox_exporter servers
[monitored_servers]
10.0.102.209
10.0.102.200
10.0.102.212
10.0.102.102
10.0.102.162
[alertmanager_servers]
[kafka_exporter_servers]
## Binlog Part
[pump_servers:children]
tidb_servers
文件很长,没有全部贴上去,需要修改就是上面的内容,另外要确保 ansible_user 的值为 tidb
Grafana Dashboard 上的 Report 按钮可用来生成 PDF 文件,此功能依赖 fontconfig 包及英文字体,如需使用该功能,请下载 font 离线安装包上传至 grafana_servers 机器上安装。该离线包仅支持 CentOS 7 系统,包含 fontconfig 及 open-sans-fonts。
$ tar -xzvf grafana-font-rpms.el7.tar.gz
$ cd grafana-font-rpms.el7
$ chmod u+x install_grafana_font_rpms.sh
$ ./install_grafana_font_rpms.sh
这个操作需要在监控服务器上执行
执行以下命令如果所有 server 返回 tidb 表示 ssh 互信配置成功。
[tidb@docker5 tidb-ansible]$ ansible -i inventory.ini all -m shell -a 'whoami'
10.0.102.209 | SUCCESS | rc=0 >>
tidb
10.0.102.162 | SUCCESS | rc=0 >>
tidb
10.0.102.102 | SUCCESS | rc=0 >>
tidb
10.0.102.212 | SUCCESS | rc=0 >>
tidb
10.0.102.200 | SUCCESS | rc=0 >>
tidb
执行以下命令如果所有 server 返回 root 表示 tidb 用户 sudo 免密码配置成功。
[tidb@docker5 tidb-ansible]$ ansible -i inventory.ini all -m shell -a 'whoami' -b
10.0.102.209 | SUCCESS | rc=0 >>
root
10.0.102.102 | SUCCESS | rc=0 >>
root
10.0.102.212 | SUCCESS | rc=0 >>
root
10.0.102.162 | SUCCESS | rc=0 >>
root
10.0.102.200 | SUCCESS | rc=0 >>
root
这一步因为我们是测试环境,所以要修改一些配置文件,让系统初始化成功。
[root@docker5 tasks]# pwd
/home/tidb/tidb-ansible/roles/check_system_necessary/tasks
[root@docker5 tasks]# cat main.yml
#- name: Preflight check - Set NTP service status
# shell: ntpstat | grep -w synchronised | wc -l
# register: ntp_st
# changed_when: false
# when: enable_ntpd
#- name: Preflight check - NTP service
# fail:
# msg: "Make sure NTP service is running and ntpstat is synchronised to NTP server. See https://github.com/pingcap/docs/blob/master/op-guide/ansible-deployment.md#how-to-check-whether-the-ntp-service-is-normal ."
# when:
# - enable_ntpd
# - ntp_st.stdout|int != 1
另一个ntp也需要注释掉:
[root@docker5 tasks]# pwd
/home/tidb/tidb-ansible/roles/check_config_dynamic/tasks
[root@docker5 tasks]# cat main.yml
#- name: Preflight check - Set NTP service status
# shell: ntpstat | grep -w synchronised | wc -l
# register: ntp_st
# changed_when: false
# when: enable_ntpd
#- name: Preflight check - NTP service
# fail:
# msg: "Make sure NTP service is running and ntpstat is synchronised to NTP server. See https://github.com/pingcap/docs/blob/master/op-guide/ansible-deployment.md#how-to-check-whether-the-ntp-service-is-normal ."
# when:
# - enable_ntpd
# - ntp_st.stdout|int != 1
[root@docker5 defaults]# pwd
/home/tidb/tidb-ansible/roles/check_system_optional/defaults
[root@docker5 defaults]# cat main.yml
---
# CPU
tidb_min_cpu: 2
tikv_min_cpu: 2
pd_min_cpu: 2
monitor_min_cpu: 2
# Mem
tidb_min_ram: 1500
tikv_min_ram: 1500
pd_min_ram: 1500
monitor_min_ram: 1500
# Disk
tidb_min_disk: 30000000000
tikv_min_disk: 30000000000
pd_min_disk: 30000000000
monitor_min_disk: 30000000000
[root@docker5 defaults]#
这个文件配置对应服务器需要的最低配置,可以修改
[root@docker5 tasks]# pwd
/home/tidb/tidb-ansible/roles/machine_benchmark/tasks
[root@docker5 tasks]# ls
main.yml main.yml.bak
[root@docker5 tasks]# cat main.yml
---
- name: test disk io
shell: w
[root@docker5 tasks]#
上面修改完成之后,可以进行系统初始化了:
ansible-playbook bootstrap.yml
.......
TASK [machine_benchmark : test disk io] ****************************************************************************************************************************************************
changed: [10.0.102.212]
changed: [10.0.102.102]
changed: [10.0.102.162]
........
可以看到我们自己写的task任务。只要不报错就说明初始化成功了!
ansible-playbook deploy.yml
只要初始化成功了,并且对应的安装包都拷贝了,这一步一般不会出错。
ansible-playbook start.yml
这个步骤执行时间可能会有点长,只要不报错,说明集群搭建成功。
测试连接,可以使用mysql客户端连接:
[root@test2 ~]# mysql -uroot -h10.0.102.209 -P 4000
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.10-TiDB-v2.0.5 MySQL Community Server (Apache License 2.0)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| INFORMATION_SCHEMA |
| PERFORMANCE_SCHEMA |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)
查看web监控界面,在浏览器输入对应http://ip:3000