从零部署TiDB集群

2020-02-11 15:50:06 浏览数 (1)

一 前言

朋友圈,关注的公众号经常出现各个公司开始用TiDB的案例和各种技术分享。对TiDB蛮有兴趣,这几天终于可以尝试接触 TiDB,第一步当然是安装和部署。过程还是蛮曲折的,耗费差不多三个工作日。本文先记录安装过程和遇到的问题,避免其他朋友踩坑。

二 TiDB 简介

TiDB 集群主要包括三个核心组件:TiDB Server,PD Server 和 TiKV Server。此外,还有用于解决用户复杂 OLAP 需求的 TiSpark 组件和简化云上部署管理的 TiDB Operator 组件。一图胜千言

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

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

PD 通过 Raft 协议保证数据的安全性。Raft 的 leader server 负责处理所有操作,其余的 PD server 仅用于保证高可用。建议部署奇数个 PD 节点。

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

TiSparkTiSpark 作为 TiDB 中解决用户复杂 OLAP 需求的主要组件,将 Spark SQL 直接运行在 TiDB 存储层上,同时融合 TiKV 分布式集群的优势,并融入大数据社区生态。至此,TiDB 可以通过一套系统,同时支持 OLTP 与 OLAP,免除用户数据同步的烦恼。

TiDB Operator 提供在主流云基础设施(Kubernetes)上部署管理 TiDB 集群的能力。它结合云原生社区的容器编排最佳实践与 TiDB 的专业运维知识,集成一键部署、多集群混部、自动运维、故障自愈等能力,极大地降低了用户使用和管理 TiDB 的门槛与成本。

源自 https://pingcap.com/docs-cn/stable/architecture/

二 准备

初始部署需要准备好一个集群拓扑,TiKV和TiDB,PD分开部署,TiDB可以和PD混合部署,TiKV 作为存储单元独立部署。监控节点可以和某一台TiDB混合部署。

qabb-qa-tibd0/10.215.20.24

部署管控机器/TiDB/PD/ 监控

qabb-qa-tibd1/10.215.20.19

TiKV

qabb-qa-tibd2/10.215.20.7

TiKV

qabb-qa-tibd3/10.215.20.13

TiKV

部署的时候整个集群还需要一个中控机,通过ansible 在其他节点上执行各种命令和集群的运维动作。

官方文档中需要一个tidb账号具有各个节点免密登陆权限和sudo权限,这个和我们公司的运维体系有点冲突,故本次部署的时候使用我个人账号代替。

三 部署步骤

我在测试环境可以选择联机部署的方式,如果不能访问外网,则需要采用离线部署。

3.1 获取最新的版本

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

安装ansible以及依赖

代码语言:javascript复制
cd /data/users/yangqilong/tidb-ansible && 
sudo pip install -r ./requirements.txt && 
ansible --version

编辑文件 hosts.ini

代码语言:javascript复制
[servers]
10.215.20.24
10.215.20.19
10.215.20.7
10.215.20.13

[all:vars]
username =  yangqilong
ntp_server = pool.ntp.org
3.2 验证用户权限

命令如下:

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

需要都返回"yangqilong"

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

返回 "root"

3.3 联网下载TiDB binary

ansible-playboot blocal_prepare.yml

3.4 初始化系统环境

ansible-playbook bootstrap.yaml

我在安装TiDB 集群过程中,这一步遇到的问题比较多,解决这些问题的办法是:在tidb-ansible下面的roles目录,对应找到出错的tasks,如果确定一些限制或者检查可以忽略,则可以注释掉对应的代码。

  1. ulimit -n 小于1000000的限制,ansible会自动在 /etc/security/limits.conf 添加或者自己手动添加。
  2. fio压测性能不过关,则删掉 benchmark相关的task。
  3. 还有ext4挂载参数要求是加上 nodelalloc, 我的测试环境是把这个ext4 注释掉了,生产环境用的xfs系统。

进展顺利会有如下提示:

3.5 部署TiDB集群

前面的都是基本准备安装包和检查系统参数和系统硬件的动作,接下来终于到了安装的步骤,不过这一步依然可能有问题。

ansible-playbook deploy.yml

安装顺利的结果

可能遇到的问题是 用于监控的blackbox_exporter二进制文件有异常,命名存在但是脚本执行命令报不存在。

解决方法

在tidb-ansible/roles/blackboxexporter/tasks/binarydeployment.yml文件里,删除setcap 这个task

代码语言:javascript复制
#- name: blackbox_exporter binary add CAP_NET_RAW capability
#  command: setcap cap_net_raw ep "{{ deploy_dir }}/bin/blackbox_exporter"
#  become: true
3.6 启动集群

ansible-playbook start.yml

启动需要一些列的检查,没任何问题之后 提示:

然后就可以使用mysql 客户端连接tidb了

四 小结

第一次整体安装集群的过程比较复杂和曲折,和安装Oracle 的RAC 有点像,经过一系列的账号权限,系统参数,rpm包的检查才能确定是否符合安装条件。有自己独立运维体系的团队,可以尝试自己打包部署。

接下来就可以开始深入的学习TiDB各种功能和运维实践,期待TiDB能在有赞有合适的用处。

感谢TiDB团队技术的远程支持,帮忙解决各种问题。

本公众号长期关注于数据库技术以及性能优化,故障案例分析,数据库运维技术知识分享,个人成长和自我管理等主题,欢迎扫码关注。

0 人点赞