背景介绍
随着互联网的飞速发展,业务量可能在短短的时间内爆发式地增长,对应的数据量可能快速地从几百GB涨到几百个TB,传统的单机数据库提供的服务,在系统的可扩展性、性价比方面已经不再适用。为了应对大数据量下业务服务访问的性能问题,MySQL数据库常用的分库、分表方案会随着MySQLSharding(分片)的增多,业务访问数据库逻辑会越来越复杂。而且对于某些有多维度查询需求的表,需要引入额外的存储或牺牲性能来满足查询需求,这样会使业务逻辑越来越重,不利于产品的快速迭代。
TiDB的架构
TiDB作为PingCAP旗下开源的分布式数据库产品,具有多副本强一致性的同时能够根据业务需求非常方便的进行弹性伸缩,并且扩缩容期间对上层业务无感知。TiDB包括三大核心组件:TiDB/TiKV/PD。
TiDBServer:主要负责SQL的解析器和优化器,它相当于计算执行层,同时也负责客户端接入和交互。
TiKVServer:是一套分布式的Key-Value存储引擎,它承担整个数据库的存储层,数据的水平扩展和多副本高可用特性都是在这一层实现。
PDServer:相当于分布式数据库的大脑,一方面负责收集和维护数据在各个TiKV节点的分布情况,另一方面PD承担调度器的角色,根据数据分布状况以及各个存储节点的负载来采取合适的调度策略,维持整个系统的平衡与稳定。
上面的这三个组件,每个角色都是一个多节点组成的集群,所以最终TiDB的架构看起来是这样的。
由此可见,分布式系统本身的复杂性导致手工部署和运维的成本是比较高的,并且容易出错。传统的自动化部署运维工具如Puppet/Chef/SaltStack/Ansible等,由于缺乏状态管理,在节点出现问题时不能及时自动完成故障转移,需要运维人员人工干预。有些则需要写大量的DSL甚至与Shell脚本一起混合使用,可移植性较差,维护成本比较高。
针对TiDB这种复杂的分布式数据库,我们考虑通过对TiDB容器化管理,实现以下几个目的:
一、屏蔽底层物理资源
二、提升资源利用率(CPU、内存)
三、提升运维效率
四、精细化管理
因此结合上述需要,我们开发了雷神系统来统一管理和维护TiDB,其整体架构如下:
从架构图中可以看出此方案是TiDB的私有云架构。最下层是容器云,中间一层是开发的容器编排工具,最上面一层针对TiDB特性和实际使用中遇到的问题点,进行了针对性开发从而实现了TiDB集群实例的统一化管理。下面将逐个介绍各个模块的功能。
容器调度
目前主流的的容器编排系统Kuberbetes曾是我们容器调度的首选解决方案。但TiDB作为数据库服务需要将数据库存储到本地磁盘,而Kuberbetes对LocalStorage不支持(目前新的版本已经开始支持)。针对TiDB的特性和业务需求,我们决定自己实现一套容器编排系统,具体解决以下问题:
支持LocalStorage,解决数据存储问题
基于cpuset-cpus实现CPU资源的随机均衡分配
定制化,支持label,实现特定服务运行在特定宿主机上;宿主机资源限制
容器的主动发现和通知,以便将之前未管理的宿主机接入统一管理
容器的全生命周期的管理
容器异常的修复和通知
雷神Thor采用了模块化设计,分为控制模块和代理模块,其整体架构如下:
说明:
控制模块包含了Allocator,Label,Discover,Manage,Customize。Allocator主要负责宿主机资源的分配;Label主要用于标签定制;Customize主要负责定制化需求;Discover主要负责容器的发现和异常检测;Manage主要负责整体的调度和分发。
代理模块主要负责资源检查和信息收集、接受控制端的命令。
集群管理
集群管理是整套系统的核心模块之一,包含了TiDB集群的日常维护操作,实现了TiDB初始化、平滑升级、弹性容量管理、监控的整合、集群的维护、节点的维护等功能。虽然PingCAP提供了基于Ansible的自动部署方案,但是依然需要填写大量的内容和检查相关机器设定来完成部署。通过此系统只需要将需求按照如何格式提交,即可完成整套集群的部署,部署时间从之前2个小时,缩减为2分钟左右.
数据库管理
数据库管理是日常运维很核心的一块,此模块通过任务完成统计信息更新、过载保护、慢查询分析和SQL预警。
统计信息更新
TiDB虽然会自动更新统计信息,但需要达到固定的变更百分比,因TiDB是作为分片库的合并库,数据量高达几十亿,若依赖自身的统计信息维护,将出现因统计信息不准确而触发的慢查询,故针对此种情况,设计和开发统计信息自动更新,除常规设定外,还可设定例外,避免因统计信息更新时影响业务的正常使用。
过载保护
通过对SQL的执行时间和内存的使用情况分析,针对不同的集群可以定制不同的过载保护策略,也可以使用统一的过载保护策略;当触发策略时,会将相关信息通过