京东到家MySQL容器化实践

标签: 京东 mysql 容器 | 发表时间:2021-06-05 20:28 | 作者:老马
出处:http://weekly.dockone.io

【编者的话】本文介绍了京东到家MySQL容器化的实践,包括基于容器的底层资源平台、监控系统及数据库自动化运维平台。同时也详细介绍了具体的技术实现,包括软硬件选型、容器调度算法、数据库高可用实现、监控系统及数据库自动化运维平台开发。

背景

随着京东到家业务的快速发展,MySQL数据库的访问量越来越大,在云主机上搭建MySQL越来越无法满足我们的要求。
  • 云主机的云硬盘IO性能并不能满足MySQL所需的高并发访问需求。
  • 云主机所在宿主机使用不透明,当发生网络或者硬件故障时无法及时定位问题。
  • 搭建在云主机上的MySQL在有变更规格的需求时,需要关机才能变更配置。
  • 云主机上搭建MySQL成本高,采购云MySQL成本更高。


基于上述原因,我们最终选择采购物理机,在物理机上将MySQL容器化部署来解决以上问题。

技术方案

我们认为一套完善的数据库运维方案包括以下几个部分:数据库底层资源平台、监控系统及数据库自动化运维平台。

图1 整体架构

数据库底层资源平台

  • 在物理机上搭建Docker环境,将MySQL实例部署在Docker内,基于Docker的特性,实现资源隔离和资源超卖。
  • 自定义规则算法来进行容器的调度。
  • 在高可用方面,针对MHA和Zabbix进行二次开发,实现宕机后快速切换。


监控系统

监控系统采用Zabbix,其中每个容器的监控数据(CPU、内存等)通过Docker Api来获取。

数据库自动化运维平台

基于Python和Flask框架,开发MySQL自动化运维平台,实现MySQL完整生命周期自动化运维,提高运维人员的工作效率。

技术实现

数据库底层资源平台的搭建

软硬件选型

MySQL运行的场景需求为高并发高IO,我们在软硬件上做了如下选择:
  • 物理机:64核、256G内存、16*960G SSD组成RAID10 or 4T NVME RAID0
  • 操作系统:CentOS 7.5
  • 容器:Docker版本1.13.1 、网络模式选择host模式。(从这也可以看出,我们主要是对CPU和内存进行了资源隔离,网络层面没进行资源隔离)
  • 镜像:自定义的MySQL5.6.36镜像、MySQL5.7.22镜像


对基于容器的MySQL实例和基于云主机的MySQL实例,同规格下进行了压测对比,云主机中MySQL QPS最大值23K。

图2 云主机压测结果

容器中的MySQL充分利用了本地SSD硬盘的高IO, QPS最大值达90K。

图3 容器压测结果

容器化后MySQL性能远超云主机上的MySQL,完全可以满足京东到家当前的MySQL性能需求。

容器调度算法

MySQL作为一种有状态的服务,DBA不需要对之进行频繁的操作,要保持相对稳定和健壮,我们自行定义了规则算法来进行容器的调度。
  • 同一集群的实例分布在不同可用区。
  • 同一集群的实例分布在不同宿主机。
  • 根据业务级别不同MySQL分布不同宿主机,核心业务在一台宿主机上不能部署过多。
  • 分库系统,各分片MySQL分布不同宿主机。
  • 优先分配CPU、内存、磁盘空间资源最空闲的主机。
  • 通过Docker超卖CPU,超卖的倍数不超过实际CPU核数2倍。


基于以上原则,我们开发了容器调度系统,对容器的分配进行整体调度。

图4 容器调度系统

MySQL的高可用实现

到家应用服务器访问MySQL是通过域名方式来进行连接的,我们对MHA和Zabbix监控系统进行二次开发,故障时通过快速更改域名解析来进行故障切换。整个切换过程在10秒内可以完成。

图5 数据库高可用架构

Zabbix监控系统发现MySQL发生宕机后,首先判断是主库还是从库,如果主库宕机由MHA Manager来进行处理,从库宕机由Zabbix监控调用脚本来进行处理。

主库宕机:MHA Manager将Master_Log_File和Read_Master_Log_Pos最高的从库提升为新主库,同时MHA Manager也会调用DNS解析接口将主库域名解析到新主库IP。由于域名DNS解析可能存在缓存,域名更新生效时间可能比较长。故障切换系统同时会根据宕机的MySQL数据库域名查找连接的所有应用服务器IP,通过Saltstack批量修改/etc/hosts文件绑定域名到新IP,下发到各应用主机上,缩短域名解析生效时间,能达到秒级解析生效。

从库宕机:由Zabbix调用DNS解析接口,将宕机从库绑定的域名解析到主库上,后续操作与主库宕机操作流程类似。

图6 数据库宕机处理流程

监控系统

到家的监控系统采用的是Zabbix,使用自定义模板对MySQL运行状态进行监控。需要注意的是Docker内部CPU和内存的监控数据从OS层的获取值并不准确,我们通过调用Docker API的方式进行采集,再汇总到Zabbix。

图7 监控数据Zabbix展示

Zabbix通过设置触发器,当出现告警时自动执行自定义脚本,利用这个功能,可以实现MySQL故障后自愈的功能。
  • MySQL实例触发所在磁盘空间不足报警时,自动执行脚本删除占冗余的文件从而释放空间。
  • MySQL实例触发CPU使用率过高报警时,自动执行脚本将当前运行的SQL及所有连接发邮件给DBA及相关研发,以便快速找到CPU报警的原因。
  • 前面提到的MySQL宕机后自动进行域名切换,也是利用Zabbix的这个功能。


开发自动化运维平台

我们基于Python和Flask开发了MySQL自动化运维系统,从MySQL资源申请、实例创建、销毁、主从架构部署、集群不同角色备份策略的选择、监控添加、销毁等,将MySQL整个生命周期实现流程化和自动化。

MySQL申请及交付

图8 申请信息

研发通过数据库运维平台申请MySQL资源,经DBA审批后,程序根据容器调度算法,后端会自动创建一套主从架构的MySQL数据库集群。并为MySQL自动添加相应的账号及授权,账号类型包含:监控、备份、主从、工具类等。同时容器创建之后就包含:MySQL服务端、Zabbix客户端、SaltStack客户端、Percona Toolkit、备份脚本、慢日志切割脚本等。

整个过程已实现自动化,并且基于镜像快速创建容器,5分钟内可交付一套完整可用的MySQL集群。

配置变更

得益于容器的特性,调用Docker的update命令可实时改变对应容器的CPU和内存配额。从而可以不停机进行MySQL实例规格变更,实现快速扩容或缩容。

图9 实例扩容

MySQL工具

MySQL交付之后,我们提供了大量的MySQL工具:语法分析工具、当前慢日志分析工具、MySQL连接数查询工具、从库延迟查询工具、主从关系查询工具、正在运行SQL查询工具、MySQL快速健康检查、物理机监控、错误日志等。这些工具方便了研发的平时使用,可以借助这些工具进行排查解决。

图10 数据库工具

总结

目前到家的MySQL实例有95%以上都运行在了容器中,容器化后的MySQL平台经受住了415周年庆、618、1020等所有大促考验,对于我们来说,目前的容器化MySQL平台给我们带来了三大好处:
  • 满足性能:运行在物理机Docker内的MySQL实例性能高,能满足到家多个业务场景的性能需求。
  • 降低成本:Docker容器之间可进行资源隔离,可以在同一台机器上部署多个MySQL实例。而且通过Docker超卖CPU资源,可提高资源利用率,相比在云主机上搭建MySQL成本降低了50%,比采购云MySQL成本降低了100%。
  • 提高效率:所有MySQL流程自动化,5分钟内可以交付一套可用的MySQL主从集群,运维效率得到很大提高。


原文链接: https://mp.weixin.qq.com/s/0R9vQVFNmY8r2a00cYSv3g

相关 [京东 mysql 容器] 推荐:

京东到家MySQL容器化实践

- - DockOne.io
【编者的话】本文介绍了京东到家MySQL容器化的实践,包括基于容器的底层资源平台、监控系统及数据库自动化运维平台. 同时也详细介绍了具体的技术实现,包括软硬件选型、容器调度算法、数据库高可用实现、监控系统及数据库自动化运维平台开发. 随着京东到家业务的快速发展,MySQL数据库的访问量越来越大,在云主机上搭建MySQL越来越无法满足我们的要求.

京东容器集群支持数据库实践

- - DockerInfo
京东 容器数据库系统,管理1800台物理计算节点,生产1W+ 多MySQL Docker容器实例. 架构简单可靠,Docker容器计算平台与MySQL集群管理平台解耦处理. 为描述方便,京东容器化数据库系统命名为CDS,底层京东Docker容器计算平台命名为JDOS. 本文重点介绍JDOS如何支持CDS.

Linux Ksplice,MySQL and Oracle

- Syn - DBA Notes
Oracle 在 7 月份收购了 Ksplice. 使用了 Ksplice 的 Linux 系统,为 Kernel 打补丁无需重启动,做系统维护的朋友应该明白这是一个杀手级特性. 现在该产品已经合并到 Oracle Linux 中. 目前已经有超过 700 家客户,超过 10 万套系统使用了 Ksplice (不知道国内是否已经有用户了.

MySQL Replication 线程

- - CSDN博客推荐文章
Replication 线程. Mysql 的Replication 是一个异步的复制过程,从一个Mysql instace(我们称之为Master)复制到另一个Mysql instance(我们称之Slave). 在Master 与Slave 之间的实现整个复制过程主. 要由三个线程来完成,其中两个线程(Sql 线程和IO 线程)在Slave 端,另外一个线程(IO 线程)在Master 端.

mysql backup 脚本

- - ITeye博客
网上备份脚本很多,但考虑都不周全. 保证创建备份文件只能是创建者跟root可以访问,其他用户没有权限,保证了数据库备份的安全. 上面脚本是负责备份的份数管理,. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

Oracle MySQL Or NoSQL续

- - Sky.Jian 朝阳的天空
接前面一篇,这里再将之前在“中国系统架构师大会”5周年的时候发布的纪念册“IT架构实录”上的一篇文章发出来,也算是前面博文中PPT的一个文字版解读吧. Oracle,MySQL 还是 NoSQL. 随着阿里系的“去IOE”运动在社区的宣传声越来越大,国内正在掀起一股“去xxx”的技术潮. 不仅仅是互联网企业,包括运营商以及金融机构都已经开始加入到这个潮流之中.

mysql优化

- - 数据库 - ITeye博客
公司网站访问量越来越大,MySQL自然成为瓶颈,因此最近我一直在研究 MySQL  的优化,第一步自然想到的是 MySQL 系统参数的优化,作为一个访问量很大的网站(日20万人次以上)的数据库系统,不可能指望 MySQL  默认的系统参数能够让 MySQL运行得非常顺畅. 在Apache, PHP,  MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分.

MySql动态SQL

- - SQL - 编程语言 - ITeye博客
13.7. 用于预处理语句的SQL语法. MySQL 5.1对服务器一方的预制语句提供支持. 如果您使用合适的客户端编程界面,则这种支持可以发挥在MySQL 4.1中实施的高效客户端/服务器二进制协议的优势. 候选界面包括MySQL C API客户端库(用于C程序)、MySQL Connector/J(用于Java程序)和MySQL Connector/NET.

MySQL 性能

- - 谁主沉浮
这里罗列了一些基本的 MySQL 性能提示,但不是放之四海而皆准,需要根据实际的应用情况而决定. 使用标准化设计(数据库三范式),记住表的联合查询(join)性能不会差. 选择合适的字符集,虽然UTF16无所不能,但需要两倍的存储;UTF8适合各种字符,但比latin1慢,尽可能选用latin1(此条不适合中文).

mysql explain 解析

- - SQL - 编程语言 - ITeye博客
Mysql Explain 详解. 例如: explain select * from t3 where id=3952602;. 二.explain输出解释. | id | select_type | table | type  | possible_keys     | key     | key_len | ref   | rows | Extra |.