同程艺龙 王晓波 - 《MySQL的Docker容器化大规模实践》
2020-02-27 785浏览
- 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 一主一从 4核8G 8核8G 一主多从 8核16G 16核16G 分片集群 16核64G 32核64G 32核128G 硬件选型 SATA-SSD PCIE-SSD 大容量磁盘SAS 机房 A机房 B机房 C机房 D机房
- 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 Filter Schedule Strategy Docker API Manger Docker Docker Docker Node Docker 分布式监控 Docker Docker Docker Node Docker •提供两种API: •Docker API的封装,用于创建,删除,修改。 集群 •集群管理API,用于集群管理。 报警 •Scheduler调度:选择最优节点创建容器。 •Agent:用于连接监控模块,上报系统运行状况。
- 11.磁盘挂载 3301 3302 3303 3304 3305 宿主机磁盘 • 为了保证容器内的MySQL实例有更好的磁盘IO性能。采用了本地宿主机磁盘挂载到容器内的方式(每个 实例对应一个文件夹)。 这种方式的优势是IO性能最佳,随之而来的缺点是磁盘容量不好估算,有可能在使用了一段时间后出现磁 盘空间不足的问题,这个时候则会启动迁移扩容的流程。 已经在和提供高密度IO分布式存储解决方案厂商接触,计划测试平台接入分布式存储的方案。
- 12.集群扩容 扩容逻辑 扩容 本地CPU、 memory、disk 是否满足 迁移升级 原地扩容 原地扩容 停从节点 删除从库容器 重新创建高配置容器 恢复从库的复制 HA切换 新增高配置从节点 删除旧实例 迁移扩容 新增高配置从节点 HA切换 删除之前的旧节点 完成
- 13.高可用管理 TCMHA Manager sms WeCha t mail Monitor Alert 中间配置中心 Sentinel TCMHA 管理分为两个部分: • MariaDB、MySQL5.6的高可用管理是基于开源 工具MHA定制开发后的工具完成的,该工具支持 了MariaDB的gtid、更完善的哨兵检测机制、对 接了DB中间件等定制化功能。 • MySQL5.7的MGR复制集群是我们自己写的一套 高可用组件配合DB中间,实现无感知的高可用切 换。
- 14.DB中间件 兼容mysql协议 支持SELECT/INSERT/UPDATE/DELETE语句 支持单DB实例上的inner join 支持单DB实例上的事务 支持聚合函数:max、min、sum、avg、count 支持:distinct、order by、group by、limit、top:definitiontext 支持多种拆分方式 不分区 根据关键字段,进行hash分区 根据时间字段,进行时间分区 根据关键字段,进行区间分区 读写分离模式
- 15.集群管理 •HA切换 •Slave增加删除 •创建新集群 •查看监控 •慢日志分析 •慢日志查看 •手动备份
- 16.备份系统 手工备份 定时备份 备份列表 恢复 多样化备份: 1.物理备份: 通过xtrabackup备份20G以上的实例。 实例 2.逻辑备份: 通过mydumper备份20G以下的实例或备份指定表。 备份策略: 1.每日自动化备份。 2.DBA临时手工备份。 备份 备份 重建slave 获 取 备 份
- 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 sms WeChat mail Active alters API query Alert Graph Find targets Consul Cluster
- 19.MySQL监控 多达上百项的详细的监控信息:
- 20.慢日志分析 Analysis DB 告警: 当慢SQL每秒产生的数量超过阈值的时触发告警通知 DBA及相关人员及时关注问题。 分析: 定期将实例端的慢SQL分析后录入数据库,然后通过 系统页面查看慢SQL的执行时长、每日次数、每日平 均耗时等多个维度的指标。同时也支持ui上查看执行计 划和表结构信息。 UI展示
- 21.数据库及实例迁移 S Dstep1:全量 逻辑迁移step2:增量 binlog解析 S Dstep3:数据一致性校验 • 实例迁移我们支持了全实例、库、表级别的迁移,并且同时兼容各种MySQL版本。 全量迁移基于开源工具mydumper和myloader做了定制化开发,解决了一些问题,比如 utf8mb4导致乱码的问题等。 增量复制使用的是公司自研的基于binlog复制的产品。该工具支持指定库、表级别复制,另外 也支持源与目标命名不一致(结构一致)的复制。
- 22.实例迁移 实例迁移 实例、库、表迁移 : 平台外的实例迁移至平台内 平台内数据迁移
- 23.成果 ■ 屏蔽底层物理资源,降低决策时间 ■ 资源利用率提升30倍 ■ 90%的基础运维工作完全自动化 ■ 交付能力提升70倍 ■ 生产环境近3500个实例在平台上工作
- 24.效率提升 手工部署: 部署一套高可用集群+备份,配置监控。至少30分钟。部署32个节点的分片的集群,至少一个上午 。无系统化管理,资源分配情况,无法统一调配,服务器资源利用率低。 MySQL容器平台: 部署一套高可用集群+自动化备份+慢日志分析+监控。用时1-2分钟。部署32个节点的分片集群, 只需5分钟。标准化的系统管理,部署环境统一、配置文件统一。系统化的操作降低人为失误和重复劳 动。资源使用集中管理,有效利用服务器资源。
- 25.
- 26.