大规模实践基于Docker的MySQL私有云平台。集成高可用、快速部署、自动化备份、性能监控、故障分析、过载保护、扩容缩容等多项自动化运维功能。数据库高可用是不容忽视的,在Docker容器分配时如何保障主从不在同一宿主机上呢?我们通过自研Docker容器调度平台,自定义Docker容器的分配算法。实现了MySQL的高密度、隔离化、高可用化部署。同时结合我们自研的数据库中间件,支持了分片集群及无感知的高可用切换功能。截止目前平台支撑了目前总量90%以上的MySQL服务(实际数量超过2000个),资源利用率提升30倍,数据库交付能力提升70倍。并且经受住了十一黄金周、春节票务业务高峰期的考验。未来将致力于数据库自动化向智能化的推进。

注脚

展开查看详情

1.《MySQL 容器化部署实践》 演讲者/王晓波

2.背景 ■ 同程旅游早期的数据库都以单库的MySQL。 ■ MySQL的单库,导致TPS最终还是会成为一个瓶颈。 ■ MySQL+DB中间件解决水平拆分问题。 ■ MySQL水平拆分的引入会使数据库实例数量大幅上升,传统运维手段维护成本高,交付能力差。

3.MySQL数据库为何要Docker化 1.MySQL数据库迅速爆炸式增长后,服务器规模不断增大,快速部署是个问题。 2.随着业务的发展,扩容数据库的不方便不快捷,也是个问题。 3.大量数据量小的数据库系统也单独部署在物理机,浪费问题突出。 4.DBA的数据库自动化标准化运维的需求。 5.Docker在同程的大规模使用,应用部署环境100%容器化,有Docker丰富的经验 。

4.让数据库的部署点单化开启 配置 DB架构 硬件选型 机房 2核4G 4核4G 一主一从 SATA-SSD A机房 4核8G 8核8G 一主多从 PCIE-SSD B机房 8核16G 16核16G 分片集群 大容量磁盘SAS C机房 16核64G 32核64G D机房 32核128G

5.容器化之后的MySQL就是一个私有DB云 巨 慢 集 精 便 数 主 分 细 日 集 成 美 捷 自 资 高 据 过 从 片 无 志 群 高 的 的 动 源 可 扩 库 载 集 集 遗 分 节 可 图 告 化 池 用 容 及 保 群 群 的 析 点 用 形 警 备 管 切 缩 实 护 创 创 监 及 管 方 展 管 份 理 换 容 例 机 建 建 控 查 理 案 示 理 迁 制 项 看 移

6.总体架构 应用 应用 VIP DB中间件 自定义脚本 资源管理|资源调度 Open API 告警分析 分 自 布 动 数据校验 告警发送 式 化 监 运 控 维 实例迁移 指标画图 秒级监控诊断 趋势预测 慢日志分析 复制与迁移|高可用保障|备份恢复 数据存储

7.资源池调度 配置 IO类型 资源申请 资源池 调度规则 容器调度 应用交付 容器及实例创建 为了保证MySQL的高可用,需要在Docker容器分配时如何保障主从不在同一宿主机上。我们通过自研 Docker容器调度平台管理所有宿主机和容器,自定义Docker容器的分配算法。实现了MySQL的高密度,隔离 化,高可用化部署。 调度规则: 1.同一复制集群的实例在不同主机上。 2.优先分配CPU、内存、磁盘空间资源最空闲的主机。 3.根据IO需求调度容器创建在不同IO类型的主机。 4.申请新集群时,若IO要求高则按照宿主机的IO情况,优先选择IO最空闲的主机。 5.VIP集群必须主从端口一致,Proxy接入的集群端口无需一致。 6.VIP集群端口基于网段递增,Proxy集群端口基于IP递增

8.Docker里放了什么 内核版本 Kernel版本 4.7 操作系统 CentOS 7.2 宿主机 部署服务器监控、容器监控agent容器 容器 Docker版本 1.12,部署监控及系统服务agent MariaDB镜像(按产品)、MySQL5.7镜像(按产品)、监控容器镜 镜像 像、HA管理系统镜像、实例迁移服务镜像、监控服务端镜像

9.资源隔离 CPU最大超卖3倍,通过cpu-period配合cpu-quota一起使用,来限制容器的CPU的使用量 。比cpuset-cpus绑定CPU的方式灵活。 限制容器内存,且内存不超卖。通过—memory限制内存,同时结合MySQL自身参数控制 几个内存大户(比如buffer_pool等),最后配合lxcfs增强隔离性。 IO方面由于我们采用挂载宿主机本地的磁盘设备,还不能做到彻底隔离。所以对于高IO的实 例使用的是PCIE-SSD。磁盘空间方面,我们在申请时会预估出一个量,使用超过80%的时候 会结合本地磁盘空间评估是否有足够空间扩容,若宿主机剩余空间不足会启动迁移扩容流程 。 目前使用的host模式,无法隔离网络。但是考虑到10G接入,且单机密度可控的情况下,网 络消耗不会过载。另外目前我们已经在线下尝试结合Ovs+Dpdk的方案实现网络隔离。 PS:容器虚拟化带来轻量高效,快速部署的同时,docker容器在隔离性方面也存在一些缺陷。例如,在容器内部proc文件系统 中可以看到Host宿主机上的proc信息。这样就导致了一些问题,比如监控信息不准确、限制内存会导致应用程序OOM等。我们 基于lxcfs组件来增强容器的隔离性。

10.容器的调度 GRPC API •提供两种API: Filter Schedule Strategy •Docker API的封装,用于创建,删除,修改。 集群 •集群管理API,用于集群管理。 Docker API Manger 分布式监控 报警 •Scheduler调度:选择最优节点创建容器。 Docker Docker Docker Docker •Agent:用于连接监控模块,上报系统运行状况。 Node Node Docker Docker Docker Docker

11.磁盘挂载 3301 3302 3303 3304 3305 宿主机磁盘 •为了保证容器内的MySQL实例有更好的磁盘IO性能。采用了本地宿主机磁盘挂载到容器内的方式(每个 实例对应一个文件夹)。 这种方式的优势是IO性能最佳,随之而来的缺点是磁盘容量不好估算,有可能在使用了一段时间后出现磁 盘空间不足的问题,这个时候则会启动迁移扩容的流程。 已经在和提供高密度IO分布式存储解决方案厂商接触,计划测试平台接入分布式存储的方案。

12.集群扩容 原地扩容 扩容逻辑 停从节点 迁移扩容 扩容 删除从库容器 新增高配置从节点 重新创建高配置容器 本地CPU、 memory、disk 迁移升级 HA切换 是否满足 恢复从库的复制 删除之前的旧节点 HA切换 原地扩容 完成 新增高配置从节点 删除旧实例

13.高可用管理 TCMHA 管理分为两个部分: • MariaDB、MySQL5.6的高可用管理是基于开源 工具MHA定制开发后的工具完成的,该工具支持 了MariaDB的gtid、更完善的哨兵检测机制、对 接了DB中间件等定制化功能。 TCMHA • MySQL5.7的MGR复制集群是我们自己写的一套 Manager 高可用组件配合DB中间,实现无感知的高可用切 换。 Monitor sms WeCha t mail Alert 中间配置中心 Sentinel

14.DB中间件 兼容mysql协议 支持SELECT/INSERT/UPDATE/DELETE语句 支持单DB实例上的inner join 支持单DB实例上的事务 支持聚合函数:max、min、sum、avg、count 支持:distinct、order by、group by、limit、 top:definition text 支持多种拆分方式 不分区 根据关键字段,进行hash分区 根据时间字段,进行时间分区 根据关键字段,进行区间分区 读写分离模式

15.集群管理 •HA切换 •Slave增加删除 •创建新集群 •查看监控 •慢日志分析 •慢日志查看 •手动备份

16.备份系统 手工备份 定时备份 备份列表 恢复 重建slave 多样化备份: 1.物理备份: 通过xtrabackup备份20G以上的实例。 实例 2.逻辑备份: 通过mydumper备份20G以下的实例或备份指定表。 获 备份策略: 取 1.每日自动化备份。 备份 备份 备 份 2.DBA临时手工备份。

17.过载保护 alert API Kill SQL DB HTTP POST 触发条件 记录到DB 目的: 微信告警 微信告警 • 当系统数据库较高时确保大多数请求能够够正常访问。 触发条件: • 依赖监控告警系统,thread_running > 30(可自定义) kill哪些语句: • select语句 • 非特定系统账号(可自定义) • 执行时间超过10S • 只Kill sql请求,不kill连接

18.监控告警系统 Docker Docker Docker Scrape metrics Scrape metrics Scrape metrics Promethues Cluster Find targets Active alters API query sms WeChat Graph Consul Cluster mail Alert

19.MySQL监控 多达上百项的详细的监控信息:

20.慢日志分析 Analysis DB 告警: 当慢SQL每秒产生的数量超过阈值的时触发告警通知 DBA及相关人员及时关注问题。 分析: 定期将实例端的慢SQL分析后录入数据库,然后通过 系统页面查看慢SQL的执行时长、每日次数、每日平 均耗时等多个维度的指标。同时也支持ui上查看执行计 划和表结构信息。 UI展示

21.数据库及实例迁移 S D 逻辑迁移 step1:全量 binlog解析 step2:增量 step3:数据一致性校验 S D •实例迁移我们支持了全实例、库、表级别的迁移,并且同时兼容各种MySQL版本。 全量迁移基于开源工具mydumper和myloader做了定制化开发,解决了一些问题,比如 utf8mb4导致乱码的问题等。 增量复制使用的是公司自研的基于binlog复制的产品。该工具支持指定库、表级别复制,另外 也支持源与目标命名不一致(结构一致)的复制。

22.实例迁移 实例迁移 实例、库、表迁移 : 平台外的实例迁移至平台内 平台内数据迁移

23.成果 ■ 屏蔽底层物理资源,降低决策时间 ■ 资源利用率提升30倍 ■ 90%的基础运维工作完全自动化 ■ 交付能力提升70倍 ■ 生产环境近3500个实例在平台上工作

24.效率提升 手工部署: 部署一套高可用集群+备份,配置监控。至少30分钟。部署32个节点的分片的集群,至少一个上午 。无系统化管理,资源分配情况,无法统一调配,服务器资源利用率低。 MySQL容器平台: 部署一套高可用集群+自动化备份+慢日志分析+监控。用时1-2分钟。部署32个节点的分片集群, 只需5分钟。标准化的系统管理,部署环境统一、配置文件统一。系统化的操作降低人为失误和重复劳 动。资源使用集中管理,有效利用服务器资源。

25.

26.