京东MySQL数据库Docker化最佳实践(附PPT)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:
讲师介绍
 
 

刘风才

京东资深数据库专家

 

 

  • 2012年加入京东,担任MySQL DBA一职,负责数据库架构设计、数据库性能优化等日常运维工作,参与过分布式数据库项目、多中心交易项目等。

  • 2013~2016连续4年作为MySQL数据库618、11.11项目DBA负责人,负责相应备战工作,为大促平稳护航。

 

演讲大纲:

  1. 京东Docker技术发展历程

  2. MySQL数据库为何要Docker化

  3. MySQL数据库Docker化前准备工作

  4. 遇到的问题与解决方案

  5. 总结与展望

 

京东MySQL数据库Docker化的推进之路,从开始如履薄冰的使用,到目前占比超过70%以上的大规模部署,下面给大家一一讲解这期间的发展历程。

 

一、京东Docker技术发展历程

 

Docker技术的发展为MySQL数据库部署环境能够容器化奠定了基础。京东Docker技术的发展可以归纳为3个阶段:

 

1、初出茅庐

 

京东从2013年开始规划虚拟化平台项目。可以说,一切从零开始,组建团队,架构采用当时主流的OpenStack+KVM架构,在发展初期,只有一些非核心的应用服务开始跑在kvm上。虚拟化研发团队在技术上很快掌握了OpenStack核心代码,当时来说,OpenStack对VM支持可以说是天生的好,在各方面认为成熟的时期,虚拟化团队满怀信心地接入了一个核心业务,不幸的是,正是这个核心业务给虚拟化团队带来了不小的打击,在性能上tp99无法缩短到40ms以内,无法满足应用服务的性能要求,在2013年夏天-2014年夏天研发尝试了各种方法,进行改造优化,最终仍无法达到物理机的性能水平。这一年对于虚拟研发团队来说是压抑、苦闷,也是积攒经验的一年。

 

2、小试牛刀

 

 

2014年9月,公司安排首席架构师刘海峰带领虚拟化团队。他提出一套新的方案、新的思路,Docker由此进入京东。2014年6月 Docker1.0发布,当时Docker还非常单薄,只有镜像和对cgroup简单的操作功能是可用之处,由于虚拟化研发团队在过去一年的压抑,这一新的思路对于团队来说无疑是希望,经过简单的二次开发后,进行了基本性能测试,惊喜地发现TP99可以部分降低到40ms以内,虽不完美,但对于团队来说,这已经看到了曙光。

 

经过研发团队的不谢努力,性能问题终于完全解决了。但另一个问题接踵而来,如何管理众多的Docker容器?自己开发时间成本太大,基于团队过去一年里在Openstack方面经验的积累,团队最终选择OpenStack + Docker的架构,并命名为京东第一代容器引擎平台JDOS1.0(JD DataCenter OS)。

 

3、驾轻就熟

 

解决了性能问题、批量管理的问题后,京东第一代容器引擎平台推广速度极快,从15年起步到 16年618已完成100%应用业务环境容器化,并经受住618大促的考验。到目前为止,京东Docker部署已近15万个左右,可以说是规模最大的Docker集群。

 

二、MySQL数据库为何要Docker化

 

先谈一下京东MySQL数据库发展的历程。京东从2011年开始使用 MySQL数据库,在此之前以SQL Server为主。2012年以后,MySQL数据库迅速在京东崛起,爆炸式增长,到2013年 MySQL数据库就占了京东交易系统的一半,发展到2014年、2015年,MySQL已经成为京东主流的数据库。并且数据库服务器规模不断增大。下面看看选择Docker化会带来哪些收益呢?

 

1、快速部署

 

数据库服务器实例创建只需要1分钟,和物理机os安装相比,速度提升了几十倍。

 

2、动态扩容

 

空间问题对于DBA来说,可以说是比较常见的问题。随着业务的发展,磁盘使用超出了预先的评估,使用Docker在一定条件下可以在线扩容,方便快捷。但这并不是解决空间问题的最佳方案,数据可能不断增长,但磁盘空间不可能无限扩容;基于性能、长远考虑,建议进行数据结转、数据清理或者库表拆分等操作。

 

3、提升资源利用率

 

随着SSD硬盘成本的降低,SSD服务器使用越来越普遍,IO性能也有了很大提高,对于数据量小的数据库系统单独部署在物理机,在成本上考虑存在着浪费,但如果采用多库合用或多实例部署,这虽然可以提升了资源利用率,但无法避免物理资源竞争、相互影响问题,而Docker在物理资源上良好的隔离性,恰恰可以解决这一难点。

 

也许有人会问Docker和虚拟机的区别?其实这两者是有本质区别的。虚拟机的本质上是模拟。通过模拟物理机上的硬件,向用户提供资源。容器的基石是经过隔离与限制的linux进程。容器提供的是性能损失更小的原生物理机的计算能力,容器之间唯一共享的是linux内核。

 

4、降低成本

 

资源利用率提高了,节约了服务器资源、机架位资源,提升经济效益,降低了成本。

 

5、成熟的Docker技术

 

最重要的一点,京东在Docker技术上的逐步成熟,应用部署环境100%容器化,有了丰富的经验,有专业的团队的技术支持,并经历618、双11大促的考验。

 

三、MySQL数据库Docker化前准备工作

 

1、Docker管理页面的开发

 

实现Docker申请创建、暂停、开启、在线扩容等功能,方便DBA日常操作。

 

2、制定Docker容器分配算法

 

数据库高可用是不容忽视的。在Docker容器分配时如何保障主从不在同一宿主机上呢?

 

下面介绍一下分配算法原理:如果一个集群申请的数据库服务器大于1,调度时会为每一个容器选择合适的宿主机,主要是根据宿主机的状态(是否正常可用)、宿主机上的可用资源(cpu、内存、磁盘容量)是否满足申请的容器规格,将集群中所有的服务器都筛选完后,会计算服务器的权值,从中选择最适合的服务器作为宿主机,然后在内存中记录下这个宿主机,下一个容器选择宿主机时,会在筛选服务器的过程中加上一个判断,如果这个服务器已经被选中过作为宿主机,则过滤掉这个服务器。

 

3、Docker模板的制定、调度算法优化

 

提升磁盘IO性能。灵活的调度算法,如某系统对IO性能要求高,在Docker容器创建时,根据传入的参数,调度算法会在筛选合适的宿主机时,根据宿主机负载情况,选择压力最小的作为宿主机。

 

4、Docker 管理平台与数据库管理平台结合

 

实现Docker容器批量申请、下线等一键化操作。实现Docker日常运维查询工作,例如:根据宿主机IP查询该宿主机下所有Docker信息,根据Docker IP查询该宿主机及其下所有Docker信息等功能。

 

5、监控项调整

 

监控对运维来说是重中之重,京东MySQL 数据库监控采用的是Zabbix监控。在监控负载值获取上Docker与物理机是有区别的。在Docker上我们无法通过os系统命令抓取系统负载情况,目前京东的实现方式:在宿主机上通过专门开发监控程序,把计算结果实时存储到Redis中,Zabbix从Redis中读取对应监控值。

 

四、遇到的问题与解决方案

 

随着Docker集群规模越来越大,在推广中也经历了些痛点,下面我们来扒一扒踩过的坑,以及是如何解决的:

 

1、OpenStack集群规模受限。OpenStack遇到集群规模的问题,发生严重的信息不可靠问题;如:创建容器消息在MQ传输过程丢失,容器状态挂起,DB连接数过大,计算节点各种agent定时任务hang住,部署升级无法核对升级结果。

 

解决方案:由于社区暂时没有遇到这么大规模,没有任何现成的解决方案,研发团队只能自己动手创造。设计目标为单个集群1万台物理节点,开发了一个python版本的RPC(brood)框架,解除对MQ依赖。特别是依赖MQ操作DB的部分,全部改为使用京东自研的Python版本RPC框架,对数据库的全部操作均使用RPC自带支持的京东JIMDB(内存缓存集群)进行处理。成功解决了集群规模受限的问题。

 

2、性能、稳定性问题。规模壮大之后,遇到很多低概率但是实实在在发生了性能和稳定性问题,mac表满导致无法网络通信,UDP大报文硬塞,丢包,中断异常,系统slab集中回收性内存申请锁住时间过长。

 

解决方案:发现问题的根源在于Linux kernel,意识到做容器就是做Linux kernel,即刻组建了Linux Kernel 团队,修改内核代码,最终解决并维护了京东自己的Linux Kernel分支。

 

3、Zabbix监控agent不自动重启,加到rc.local里的任务不生效,虽不是难点,但往往容易忽视。

 

4、磁盘IO隔离性不太好,一台Docker磁盘繁忙程度比较高,会影响该宿主机上其他Docker 性能。避免性能要求敏感的系统与磁盘IO使用较高的在同一宿主机上。

 

5、Zabbix监控负载取值问题,Docker与物理机有区别,上面提及过,避免取值错误。

 

五、总结与展望

 

目前生产环境中70%的MySQL数据库都运行在Docker容器上。已顺利支撑了两个618、一个双11大促,经住了大流量的考验。京东Docker部署已近15万个,成为全世界规模最大的Docker集群。

 

Q&A
 
 

 

Q1:MySQL Docker使用的标准?

A1:将MySQL数据库部署环境Docker化,首先是技术成熟,并且有了一定经验。我们是从非核心重要程度低的开始,逐步接入。目前已经有超过70%的系统都部署到Docker上了。

 

但是对于一些空间上要求比较大的系统,由于业务发展的需求,数据库不可能拆得特别大,数据文件多于1T多的情况下是不太合适部署在Docker上的;再有就是在性能上要求特别高的,特别重要的核心系统目前仍跑在物理机上,后面随着Docker技术不断的改进,会陆续地迁到Docker上。

 

Q2:我是一个独立核算的部门,公司有其他产品要到Docker上跑,怎么衡量它应用的成本,按部门进行核算,需要考虑哪些因素?

A2:对于数据库来说,主要是CPU核数、内存、硬盘这三项。因为每个Docker配置不一样,数据库这边有8C、12G、500G,12C、24G、500G,12C、48G,1000G和16C、48G、1000G等类似模板,分别对应CPU核数、内存、硬盘。

 

Q3:刚才您遇到了两个问题里面,一个是IO在用的问题,我想部署Docker时,能不能指定Docker只能占用多少IO这种呢?

A3:内存CPU这个是Docker上通过宿主机可以严格进行控制隔离,IO其实是底层共用一块资源,在隔离性上不好,其实在Docker创建时,是指定了IO的使用情况,但还会存在互相影响和干扰的情况。

 

Q4:有可能其中一台会引起整个宿主机使用的情况,可能会产生这种干扰。您之前说那个模板,如果定好了500G,如果发现之前的不够用,这个时候可以对之前的模板进行更改吗?如果可以,是批量还是?

A4:这个是完全可以的,并且不影响应用的正常运行,但是有一定的条件,就是当前宿主机上有足够的剩余资源。比如当前是16C、32G、500G配置的Docker,打算升级成16核、32G、1T配置的的docker,需要保证当前宿主机上需要有大于500G的空闲硬盘。

 

对于扩容来说,目前是通过web触发来进行扩容操作的,完全满足当前的工作场景;对于批量来说,目前没有实现。主要是由于前期已经进行了容量划不会产生大批量的扩容情况。

 

Q5:数据量比较大,表增长肯定也会增大的,后期数据的归档问题怎么做?

A5:这个问题,普通物理机也有遇到。一般分两种情况:一个是业务上需要继续访问的,一般是通过程序,将历史数据归档道一个历史集群中,这样保证业务上也可以继续访问;另外一种是业务上历史过期数据,业务上不需要访问的,可以放到HBase或者Hadoop里,根据具体业务而定。  

 

Q6:我想了解一下Docker在MySQL备份怎么管理的?

A6:在Docker和物理机使用上没有太多区别。主要是通过dump或者xtrabback备份到本地,同时上传到存储中,并且定期的刻盘保存。

 

Q7:我想问一下你们做OLAP这一块,因为MySQL是不适合数据分析大查询这种东西的。我们公司也考虑把数据转到MySQL上,这还需要在线分析吗?我想问一下你们怎么做的?

A7:如果数据量比较小,也是可以考虑MySQL的,单独的从库做统计的查询,也可以考虑MySQL;另外,在选型的时候一定要根据实际考虑最适合的方案,不一定非要使用MySQL。

 

如果数据量达到一定规模的话,就需要单独的大数据团队来搞了。现在我们那边除DBA团队外之外,还有一个大数据部门,他们会定期地从MySQL抽取数据,两种模式,一种是实时,一种是离线,每天会把数据拉到大数据那边进行处理。

   

Q8:你们前面做一个中间件吗?

A8:有些系统采用了中间件,但有些系统分库分表是在应用端实现的,主要是这两种情况。

 

Q9:刚才你说Docker模板后续会不会考虑自动扩容?

A9:由于我们采用的是非共享存储模式,因此我们的自动扩容是有一定限度的,主要是受限于宿主机剩余的资源。在线扩容这块,目前我们已经做到了,但是是需要人工介入的触发,完全自动的扩容,暂时还没有考虑。

 

Q10:有一种方式就是数据卷容器的挂载。

A10:这个是有一定的适用场景,但对于数据库来说,并不适用,一般统一宿主机上的Docker不需要共享数据。

原文发布时间为:2017-03-16

本文来自云栖社区合作伙伴DBAplus

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
30天前
|
关系型数据库 MySQL Linux
Docker安装Mysql5.7,解决无法访问DockerHub问题
当 Docker Hub 无法访问时,可以通过配置国内镜像加速来解决应用安装失败和镜像拉取超时的问题。本文介绍了如何在 CentOS 上一键配置国内镜像加速,并成功拉取 MySQL 5.7 镜像。
273 2
Docker安装Mysql5.7,解决无法访问DockerHub问题
|
14天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
28 1
|
1月前
|
SQL 关系型数据库 MySQL
京东面试:什么情况下 mysql RR不能解决幻读? RR隔离mysql如何实现?
老架构师尼恩在其读者交流群中分享了关于MySQL事务隔离级别的深入解析,特别针对RR级隔离如何解决幻读问题进行了详细讨论。文章不仅解释了ACID中的隔离性概念,还列举了四种事务隔离级别(未提交读、提交读、可重复读、串行读)的特点及应用场景。尼恩通过具体的例子和图表,清晰地展示了不同隔离级别下的并发事务问题(脏读、不可重复读、幻读)及其解决方案,特别是RR级隔离下的MVCC机制如何通过快照读和当前读来防止幻读。此外,尼恩还提供了相关面试题的解答技巧和参考资料,帮助读者更好地准备技术面试。更多详细内容和实战案例可在《尼恩Java面试宝典》中找到。
|
1月前
|
关系型数据库 MySQL 数据库
MySQL数据库:基础概念、应用与最佳实践
一、引言随着互联网技术的快速发展,数据库管理系统在现代信息系统中扮演着核心角色。在众多数据库管理系统中,MySQL以其开源、稳定、可靠以及跨平台的特性受到了广泛的关注和应用。本文将详细介绍MySQL数据库的基本概念、特性、应用领域以及最佳实践,帮助读者更好地理解和应用MySQL数据库。二、MySQL
109 5
|
1月前
|
关系型数据库 MySQL 数据库
使用Docker部署的MySQL数据库,数据表里的中文读取之后变成问号,如何处理?
【10月更文挑战第1天】使用Docker部署的MySQL数据库,数据表里的中文读取之后变成问号,如何处理?
59 3
|
1月前
|
关系型数据库 MySQL 数据库
使用Docker部署的MySQL数据库如何设置忽略表名大小写?
【10月更文挑战第1天】使用Docker部署的MySQL数据库如何设置忽略表名大小写?
133 1
|
1月前
|
弹性计算 关系型数据库 MySQL
Docker安装MySQL
这篇文章详细介绍了如何使用Docker安装MySQL数据库服务,包括拉取镜像、配置数据卷以及启动容器的步骤。
282 0
Docker安装MySQL
|
1月前
|
关系型数据库 MySQL 数据库
如何使用Docker部署MySQL数据库?
【10月更文挑战第1天】如何使用Docker部署MySQL数据库?
162 0
|
1月前
|
关系型数据库 MySQL 数据库
docker mysql表名和数据库名不区分大小写
docker mysql表名和数据库名不区分大小写
18 0
|
8天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
23 4