2018-10-24 安装TiDB分布式数据库

一、了解TiDB

1.1 TiDB整体架构

要深入了解 TiDB 的水平扩展和高可用特点,首先需要了解 TiDB 的整体架构。

2018-10-24 安装TiDB分布式数据库_第1张图片
TiDB 的整体架构

TiDB 集群主要分为三个组件:

TiDB Server

TiDB Server 负责接收 SQL 请求,处理 SQL 相关的逻辑,并通过 PD 找到存储计算所需数据的 TiKV 地址,与 TiKV 交互获取数据,最终返回结果。 TiDB Server 是无状态的,其本身并不存储数据,只负责计算,可以无限水平扩展,可以通过负载均衡组件(如 LVS、HAProxy 或 F5)对外提供统一的接入地址。

PD Server

Placement Driver (简称 PD) 是整个集群的管理模块,其主要工作有三个: 一是存储集群的元信息(某个 Key 存储在哪个 TiKV 节点);二是对 TiKV 集群进行调度和负载均衡(如数据的迁移、Raft group leader 的迁移等);三是分配全局唯一且递增的事务 ID。

PD 是一个集群,需要部署奇数个节点,一般线上推荐至少部署 3 个节点。

TiKV Server

TiKV Server 负责存储数据,从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range (从 StartKey 到 EndKey 的左闭右开区间)的数据,每个 TiKV 节点会负责多个 Region 。TiKV 使用 Raft 协议做复制,保持数据的一致性和容灾。副本以 Region 为单位进行管理,不同节点上的多个 Region 构成一个 Raft Group,互为副本。数据在多个 TiKV 之间的负载均衡由 PD 调度,这里也是以 Region 为单位进行调度。

1.2核心特性

水平扩展

无限水平扩展是 TiDB 的一大特点,这里说的水平扩展包括两方面:计算能力和存储能力。TiDB Server 负责处理 SQL 请求,随着业务的增长,可以简单的添加 TiDB Server 节点,提高整体的处理能力,提供更高的吞吐。TiKV 负责存储数据,随着数据量的增长,可以部署更多的 TiKV Server 节点解决数据 Scale 的问题。PD 会在 TiKV 节点之间以 Region 为单位做调度,将部分数据迁移到新加的节点上。所以在业务的早期,可以只部署少量的服务实例(推荐至少部署 3 个 TiKV, 3 个 PD,2 个 TiDB),随着业务量的增长,按照需求添加 TiKV 或者 TiDB 实例。

高可用

高可用是 TiDB 的另一大特点,TiDB/TiKV/PD 这三个组件都能容忍部分实例失效,不影响整个集群的可用性。下面分别说明这三个组件的可用性、单个实例失效后的后果以及如何恢复。

TiDB

TiDB 是无状态的,推荐至少部署两个实例,前端通过负载均衡组件对外提供服务。当单个实例失效时,会影响正在这个实例上进行的 Session,从应用的角度看,会出现单次请求失败的情况,重新连接后即可继续获得服务。单个实例失效后,可以重启这个实例或者部署一个新的实例。

PD

PD 是一个集群,通过 Raft 协议保持数据的一致性,单个实例失效时,如果这个实例不是 Raft 的 leader,那么服务完全不受影响;如果这个实例是 Raft 的 leader,会重新选出新的 Raft leader,自动恢复服务。PD 在选举的过程中无法对外提供服务,这个时间大约是3秒钟。推荐至少部署三个 PD 实例,单个实例失效后,重启这个实例或者添加新的实例。

TiKV

TiKV 是一个集群,通过 Raft 协议保持数据的一致性(副本数量可配置,默认保存三副本),并通过 PD 做负载均衡调度。单个节点失效时,会影响这个节点上存储的所有 Region。对于 Region 中的 Leader 节点,会中断服务,等待重新选举;对于 Region 中的 Follower 节点,不会影响服务。当某个 TiKV 节点失效,并且在一段时间内(默认 30 分钟)无法恢复,PD 会将其上的数据迁移到其他的 TiKV 节点上。

1.3本次安装计划

主要参考文章:TiDB官网

使用的是CentOS 7环境安装,在线安装方式。

TiDB的在线安装方式主要是通过安装台中控台,配置中控台,并通过tidb用户和目标服务器互联互通,然后通过中控台在目标服务器直接安装配置的服务。

另外TiDB对服务器硬件配置比较高,并且会因为配置不够而安装失败,这里会简单说下我的配置,最后会指出我安装失败的时候服务器硬件配置。

主要安装计划为:

2018-10-24 安装TiDB分布式数据库_第2张图片
主要安装计划



二、中控机安装

2.1 中控机创建tidb用户

以 root 用户登录中控机

在中控机上使用yum安装系统依赖包

yum -y install epel-release git curl sshpass

yum -y install python-pip

创建 tidb 用户

useradd -m -d /home/tidb tidb

设置 tidb 用户密码

passwd tidb

如下图及为设置成功

这里是说密码太短,再次重复即可设置成功

配置 tidb 用户 sudo 免密码,将 tidb ALL=(ALL) NOPASSWD: ALL 添加到文件末尾即可。

visudo

tidb ALL=(ALL) NOPASSWD: ALL

进入文档末尾

2018-10-24 安装TiDB分布式数据库_第3张图片
将指定的字符串添加到文档末尾保存即可

从 root 用户切换到 tidb 用户下

su - tidb

创建 tidb 用户 ssh key

ssh-keygen -t rsa

然后让输入密码或者其他时,一直回车即可

2018-10-24 安装TiDB分布式数据库_第4张图片
创建ssh成功后,如图所示

执行成功后,ssh 私钥文件为/home/tidb/.ssh/id_rsa , ssh 公钥文件为 /home/tidb/.ssh/id_rsa.pub 

2.2中控机器上下载 TiDB-Ansible

以 tidb 用户登录中控机并进入 /home/tidb 目录。

这里我选择安装2.0版本,是最新稳定版本,可用于生产环境。

使用以下命令从 Github TiDB-Ansible 项目上下载 TiDB-Ansible 相应分支,默认的文件夹名称为 tidb-ansible 。

git clone -b release-2.0 https://github.com/pingcap/tidb-ansible.git


2018-10-24 安装TiDB分布式数据库_第5张图片
如图即为下载成功

ps:一定将 tidb-ansible 下载到 /home/tidb 目录下,权限为 tidb 用户,不要下载到 /root 下,否则会遇到权限问题。

2.3在中控机器上安装 Ansible 及其依赖

以 tidb 用户登录中控机,请务必按以下方式通过 pip 安装 Ansible 及其相关依赖的指定版本,否则会有兼容问题。安装完成后,可通过 ansible --version 查看 Ansible 版本。目前 release-2.0 及 master 版本兼容 Ansible 2.4 及 Ansible 2.5 版本,Ansible 及相关依赖版本记录在 tidb-ansible/requirements.txt 文件中。

进入tidb-ansible文件夹安装

cd /home/tidb/tidb-ansible

sudo pip install -r ./requirements.txt


2018-10-24 安装TiDB分布式数据库_第6张图片
最终如图所示即为安装成功

查看ansible版本

ansible --version


2018-10-24 安装TiDB分布式数据库_第7张图片
查看ansible版本

2.4在中控机上配置部署机器 ssh 互信及 sudo 规则

以 tidb 用户登录中控机,将你的部署目标机器 IP 添加到 hosts.ini 文件 [servers] 区块下。

cd /home/tidb/tidb-ansible

vi hosts.ini


2018-10-24 安装TiDB分布式数据库_第8张图片
将其原本的删去,加上自己的部署目标机器IP

如果有部署目标机器的root密码,使用如下命令即可

ansible-playbook -i hosts.ini create_users.yml -u root -k

因为我没有root密码,使用的手工配置,参考如何手工配置 ssh 互信及 sudo 免密码 。

在每一个目标机创建tidb用户,并设置登录密码,配置 tidb 用户 sudo 免密码。该步骤按照2.1中配置即可。

以 tidb 用户登录到中控机,执行以下命令,将 10.18.3.98 替换成你的部署目标机器 IP,按提示输入部署目标机器 tidb 用户密码,执行成功后即创建好 ssh 互信,其他机器同理。

ssh-copy-id -i ~/.ssh/id_rsa.pub 10.18.3.98

这里我遇到一个问题,直接回车没有输入yes,可能是我其他原因导致的,一直为


2018-10-24 安装TiDB分布式数据库_第9张图片
这种失败情况

    图中红框这里需要输入 yes

2018-10-24 安装TiDB分布式数据库_第10张图片
图中红框这里需要输入 yes

然后按照提示,用命令进行测试

表示ssh互信,sudo免密配置成功

3目标机安装

3.1在部署目标机器上安装 NTP 服务

如果你的部署目标机器时间、时区设置一致,已开启 NTP 服务且在正常同步时间,此步骤可忽略。可参考 如何检测 NTP 服务是否正常 。

该步骤将在部署目标机器上使用系统自带软件源联网安装并启动 NTP 服务,服务使用安装包默认的 NTP server 列表,见配置文件 /etc/ntp.conf 中 server 参数,如果使用默认的 NTP server,你的机器需要连接外网。 为了让 NTP 尽快开始同步,启动 NTP 服务前,系统会 ntpdate hosts.ini 文件中的ntp_server 一次,默认为 pool.ntp.org ,也可替换为你的 NTP server。

以 tidb 用户登录中控机,执行以下命令:

cd /home/tidb/tidb-ansible

ansible-playbook -i hosts.ini deploy_ntp.yml -u tidb -b

由于我的服务器,ntp只是没有启动,所以启动之后就可以了,上述的安装ntp没有进行验证。

3.2在部署目标机器上配置 CPUfreq 调节器模式

我的目标机根据命令

cpupower frequency-info --governors

表示当前系统不支持CPUfreq

这里不再叙述,如有需要可以查看 使用 CPUFREQ 调控器 文档, 了解更多 CPUFREQ 相关信息。

3.3在部署目标机器上添加数据盘 ext4 文件系统挂载参数

部署目标机器数据盘请格式化成 ext4 文件系统,挂载时请添加 nodelalloc 和 noatime 挂载参数。 nodelalloc是必选参数,否则 Ansible 安装时检测无法通过,noatime 是可选建议参数。

先确定自己的系统盘是否已经被格式化ext4文件系统

切换为root用户

查看数据盘分区 UUID,FSTYPE即为数据盘类型

lsblk -f

我的是

2018-10-24 安装TiDB分布式数据库_第11张图片
表示已经是ext4文件系统

或者使用

fdisk -l

可以查看数据盘的详细信息,我的是:

2018-10-24 安装TiDB分布式数据库_第12张图片
数据盘datavg01-app

我的已经是ext4文件系统,下面以/dev/datavg01/app数据盘为列,需要先执行 umount 命令卸载

卸载前使用

df -h

如图所示

2018-10-24 安装TiDB分布式数据库_第13张图片
准备卸载的/dev/datavg01/app数据盘

umount /dev/datavg01/app

如果出现


表示有进程正在使用这个盘

使用下面命令,查看使用这个文件的进程,/app 就是要解除挂载的目录,然后使用 kill 命令杀掉

fuser -m /app

如图所示:

2018-10-24 安装TiDB分布式数据库_第14张图片
杀掉进程时不要把字母加上

将对应的进程停掉,使用 umount 卸载后,用 df -h 输出如下:

2018-10-24 安装TiDB分布式数据库_第15张图片
/dev/datavg01/app数据盘已经没有了

表示卸载成功

使用命令 lsblk -f 查看数据盘分区UUID,本例中的/dev/datavg01/app的UUID为29329fc5-57dd-4c56-aefc-b6b760129fff


2018-10-24 安装TiDB分布式数据库_第16张图片
分区盘UUID

编辑 /etc/fstab 文件,添加 nodelalloc 挂载参数

vi /etc/fstab

在文档末尾添加配置,其中UUID即为上面的挂载盘的UUID,/app即为要挂载的目录,后面的是挂载参数

UUID=29329fc5-57dd-4c56-aefc-b6b760129fff /app ext4 defaults,nodelalloc,noatime 0 2

/etc/fstab 文件配置

然后使用下面的命令,将 /etc/fstab 中定义的所有档案系统挂上

mount -a

执行以下命令,如果文件系统为 ext4,并且挂载参数中包含 nodelalloc 表示生效:

mount -t ext4

下图即表示挂载成功,且参数生效

挂载成功,且参数生效

4 分配机器资源

4.1分配机器资源,编辑 inventory.ini 文件

标准 TiDB 集群需要 6 台机器:

2 个 TiDB 节点

3 个 PD 节点

3 个 TiKV 节点,第一台 TiDB 机器同时用作监控机

以 tidb 用户登录中控机, inventory.ini 文件路径为 /home/tidb/tidb-ansible/inventory.ini 

vi /home/tidb/tidb-ansible/inventory.ini 

根据安装计划进行配置

2018-10-24 安装TiDB分布式数据库_第17张图片
配置inventory.ini 

如果是单机多TiKV实例部署,配置上有些不同,具体还请参考官方文档。

4.2 inventory.ini 变量调整

部署目录通过 deploy_dir 变量控制,默认全局变量已设置为 /home/tidb/deploy ,对所有服务生效。如数据盘挂载目录为 /app ,可设置为 /app/deploy ,样例如下:

部署目录配置

用户名请不要改变,这个和之前创建的用户名要相同

ansible_user不要变

其他变量调整:

注: 以下控制变量开启请使用首字母大写 True ,关闭请使用首字母大写 False 

我只是修改了

集群名称:cluster_name = tidb-test-cluster

TiDB 慢查询日志记录到单独文件:enable_slow_query_log = {{ deploy_dir }}/log/tidb_slow_query.log

采集日志时,采集最近几个小时的日志:collect_log_recent_hours = 6

5 部署任务

5.1确认ssh互信、tidb用户sudo免密配置成功

执行以下命令如果所有 server 返回 tidb 表示 ssh 互信配置成功。

ansible -i inventory.ini all -m shell -a 'whoami'

成功时的输出为:

2018-10-24 安装TiDB分布式数据库_第18张图片
 ssh 互信配置成功输出

如果为下面的情况,可能是因为没有发送秘钥(ssh-copy-id -i ~/.ssh/id_rsa.pub 10.18.3.98)

2018-10-24 安装TiDB分布式数据库_第19张图片
ssh互信配置失败输出01

如果为下面的情况,可能是因为当前所在的目录不是/home/tidb/tidb-ansible

ssh互信配置失败输出02

如果为下面的情况,可能是因为对提示中的文件(fact_files)权限不够

ssh互信配置失败输出03

执行以下命令如果所有 server 返回 root 表示 tidb 用户 sudo 免密码配置成功。

ansible -i inventory.ini all -m shell -a 'whoami' -b

成功时的输出为:

2018-10-24 安装TiDB分布式数据库_第20张图片
tidb 用户 sudo 免密码配置成功

5.2联网下载 TiDB binary 到中控机

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

ansible-playbook local_prepare.yml

下载成功时最后输出为:

2018-10-24 安装TiDB分布式数据库_第21张图片
下载 TiDB binary 到中控机成功最后输出

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

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

ansible-playbook bootstrap.yml

修改成功时最后输出为:

额。。。因为我这时的服务器硬件配置不够高,直接导致安装失败,提示的含义也很明显,如下图:

2018-10-24 安装TiDB分布式数据库_第22张图片
CPU太少,无法运行TiDB

从最上面的安装计划中可以看出,这两个(10.18.3.97、10.18.3.98)是要安装TiDB服务的,但是我的只有两核,直接提示无法安装。这里我并不确定他的检查程序是检查到一个不行,就不再检查了。还是检查完所有的说这两个不行。所以,只能按照官网的提示升级所有服务器了。官网要求的服务器配置如下图:

2018-10-24 安装TiDB分布式数据库_第23张图片
要求的服务器硬件配置

我这边最后的服务器配置为:

2018-10-24 安装TiDB分布式数据库_第24张图片
我的服务器硬件配置

目前只是测试环境对功能和性能的简单测试,没有进行更高配置升级。


2018-10-24 安装TiDB分布式数据库_第25张图片


2018-10-24 安装TiDB分布式数据库_第26张图片


2018-10-24 安装TiDB分布式数据库_第27张图片















你可能感兴趣的:(2018-10-24 安装TiDB分布式数据库)