一、了解TiDB
1.1 TiDB整体架构
要深入了解 TiDB 的水平扩展和高可用特点,首先需要了解 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对服务器硬件配置比较高,并且会因为配置不够而安装失败,这里会简单说下我的配置,最后会指出我安装失败的时候服务器硬件配置。
主要安装计划为:
二、中控机安装
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
进入文档末尾
从 root 用户切换到 tidb 用户下
su - tidb
创建 tidb 用户 ssh key
ssh-keygen -t rsa
然后让输入密码或者其他时,一直回车即可
执行成功后,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
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
查看ansible版本
ansible --version
2.4在中控机上配置部署机器 ssh 互信及 sudo 规则
以 tidb 用户登录中控机,将你的部署目标机器 IP 添加到 hosts.ini 文件 [servers] 区块下。
cd /home/tidb/tidb-ansible
vi hosts.ini
如果有部署目标机器的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,可能是我其他原因导致的,一直为
图中红框这里需要输入 yes
然后按照提示,用命令进行测试
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 相关信息。
3.3在部署目标机器上添加数据盘 ext4 文件系统挂载参数
部署目标机器数据盘请格式化成 ext4 文件系统,挂载时请添加 nodelalloc 和 noatime 挂载参数。 nodelalloc是必选参数,否则 Ansible 安装时检测无法通过,noatime 是可选建议参数。
先确定自己的系统盘是否已经被格式化ext4文件系统
切换为root用户
查看数据盘分区 UUID,FSTYPE即为数据盘类型
lsblk -f
我的是
或者使用
fdisk -l
可以查看数据盘的详细信息,我的是:
我的已经是ext4文件系统,下面以/dev/datavg01/app数据盘为列,需要先执行 umount 命令卸载
卸载前使用
df -h
如图所示
umount /dev/datavg01/app
如果出现
使用下面命令,查看使用这个文件的进程,/app 就是要解除挂载的目录,然后使用 kill 命令杀掉
fuser -m /app
如图所示:
将对应的进程停掉,使用 umount 卸载后,用 df -h 输出如下:
表示卸载成功
使用命令 lsblk -f 查看数据盘分区UUID,本例中的/dev/datavg01/app的UUID为29329fc5-57dd-4c56-aefc-b6b760129fff
编辑 /etc/fstab 文件,添加 nodelalloc 挂载参数
vi /etc/fstab
在文档末尾添加配置,其中UUID即为上面的挂载盘的UUID,/app即为要挂载的目录,后面的是挂载参数
UUID=29329fc5-57dd-4c56-aefc-b6b760129fff /app ext4 defaults,nodelalloc,noatime 0 2
然后使用下面的命令,将 /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
根据安装计划进行配置
如果是单机多TiKV实例部署,配置上有些不同,具体还请参考官方文档。
4.2 inventory.ini 变量调整
部署目录通过 deploy_dir 变量控制,默认全局变量已设置为 /home/tidb/deploy ,对所有服务生效。如数据盘挂载目录为 /app ,可设置为 /app/deploy ,样例如下:
用户名请不要改变,这个和之前创建的用户名要相同
其他变量调整:
注: 以下控制变量开启请使用首字母大写 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'
成功时的输出为:
如果为下面的情况,可能是因为没有发送秘钥(ssh-copy-id -i ~/.ssh/id_rsa.pub 10.18.3.98)
如果为下面的情况,可能是因为当前所在的目录不是/home/tidb/tidb-ansible
如果为下面的情况,可能是因为对提示中的文件(fact_files)权限不够
执行以下命令如果所有 server 返回 root 表示 tidb 用户 sudo 免密码配置成功。
ansible -i inventory.ini all -m shell -a 'whoami' -b
成功时的输出为:
5.2联网下载 TiDB binary 到中控机
执行 local_prepare.yml playbook,联网下载 TiDB binary 到中控机:
ansible-playbook local_prepare.yml
下载成功时最后输出为:
5.3初始化系统环境,修改内核参数
初始化系统环境,修改内核参数
ansible-playbook bootstrap.yml
修改成功时最后输出为:
额。。。因为我这时的服务器硬件配置不够高,直接导致安装失败,提示的含义也很明显,如下图:
从最上面的安装计划中可以看出,这两个(10.18.3.97、10.18.3.98)是要安装TiDB服务的,但是我的只有两核,直接提示无法安装。这里我并不确定他的检查程序是检查到一个不行,就不再检查了。还是检查完所有的说这两个不行。所以,只能按照官网的提示升级所有服务器了。官网要求的服务器配置如下图:
我这边最后的服务器配置为:
目前只是测试环境对功能和性能的简单测试,没有进行更高配置升级。
啊