从零部署 TiDB 集群

一 前言

朋友圈, 关注的公众号经常出现各个公司开始用 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 以及依赖

cd /data/users/yangqilong/tidb-ansible && \sudo pip install -r ./requirements.txt && \ansible –version
编辑文件 hosts.ini

[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,如果确定一些限制或者检查可以忽略,则可以注释掉对应的代码。

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

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

ansible-playbook deploy.yml

安装顺利的结果

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

解决方法

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

#- 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 团队技术的远程支持,帮忙解决各种问题。

(免责声明:本网站(https://c.shenzhoubb.com)
内容主要来自原创、合作媒体供稿和第三方投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。)

转载 作者 | yangyidba 来源 | 公众号「yangyidba」