Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >为什么不建议把数据库部署在docker容器内?

为什么不建议把数据库部署在docker容器内?

作者头像
IT大咖说
发布于 2020-05-06 11:09:19
发布于 2020-05-06 11:09:19
6.1K0
举报
文章被收录于专栏:IT大咖说IT大咖说

前言

近2年Docker非常的火热,各位开发者恨不得把所有的应用、软件都部署在Docker容器中,但是您确定也要把数据库也部署的容器中吗?

这个问题不是子虚乌有,因为在网上能够找到很多各种操作手册和视频教程,小编整理了一些数据库不适合容器化的原因供大家参考,同时也希望大家在使用时能够谨慎一点。

目前为止将数据库容器化是非常不合理的,但是容器化的优点相信各位开发者都尝到了甜头,希望随着技术的发展能够更加完美的解决方案出现。

Docker不适合部署数据库的7大原因

1、数据安全问题

不要将数据储存在容器中,这也是 Docker 官方容器使用技巧中的一条。容器随时可以停止、或者删除。当容器被rm掉,容器里的数据将会丢失。为了避免数据丢失,用户可以使用数据卷挂载来存储数据。但是容器的 Volumes 设计是围绕 Union FS 镜像层提供持久存储,数据安全缺乏保证。如果容器突然崩溃,数据库未正常关闭,可能会损坏数据。另外,容器里共享数据卷组,对物理机硬件损伤也比较大。

即使你要把 Docker 数据放在主机来存储 ,它依然不能保证不丢数据。Docker volumes 的设计围绕 Union FS 镜像层提供持久存储,但它仍然缺乏保证。

使用当前的存储驱动程序,Docker 仍然存在不可靠的风险。如果容器崩溃并数据库未正确关闭,则可能会损坏数据。

2、性能问题

大家都知道,MySQL 属于关系型数据库,对IO要求较高。当一台物理机跑多个时,IO就会累加,导致IO瓶颈,大大降低 MySQL 的读写性能。

在一次Docker应用的十大难点专场上,某国有银行的一位架构师也曾提出过:“数据库的性能瓶颈一般出现在IO上面,如果按 Docker 的思路,那么多个docker最终IO请求又会出现在存储上面。现在互联网的数据库多是share nothing的架构,可能这也是不考虑迁移到 Docker 的一个因素吧”。

针对性能问题有些同学可能也有相对应的方案来解决:

(1)数据库程序与数据分离

  如果使用Docker 跑 MySQL,数据库程序与数据需要进行分离,将数据存放到共享存储,程序放到容器里。如果容器有异常或 MySQL 服务异常,自动启动一个全新的容器。另外,建议不要把数据存放到宿主机里,宿主机和容器共享卷组,对宿主机损坏的影响比较大。

(2)跑轻量级或分布式数据库

  Docker 里部署轻量级或分布式数据库,Docker 本身就推荐服务挂掉,自动启动新容器,而不是继续重启容器服务

(3)合理布局应用

  对于IO要求比较高的应用或者服务,将数据库部署在物理机或者KVM中比较合适。目前TX云的TDSQL和阿里的Oceanbase都是直接部署在物理机器,而非Docker 。

3、网络问题

要理解 Docker 网络,您必须对网络虚拟化有深入的了解。也必须准备应付好意外情况。你可能需要在没有支持或没有额外工具的情况下,进行 bug 修复。

我们知道:数据库需要专用的和持久的吞吐量,以实现更高的负载。我们还知道容器是虚拟机管理程序和主机虚拟机背后的一个隔离层。然而网络对于数据库复制是至关重要的,其中需要主从数据库间 24/7 的稳定连接。未解决的 Docker 网络问题在1.9版本依然没有得到解决。

把这些问题放在一起,容器化使数据库容器很难管理。我知道你是一个顶级的工程师,什么问题都可以得到解决。但是,你需要花多少时间解决 Docker 网络问题?将数据库放在专用环境不会更好吗?节省时间来专注于真正重要的业务目标。

4、状态

在 Docker 中打包无状态服务是很酷的,可以实现编排容器并解决单点故障问题。但是数据库呢?将数据库放在同一个环境中,它将会是有状态的,并使系统故障的范围更大。下次您的应用程序实例或应用程序崩溃,可能会影响数据库。

知识点在 Docker 中水平伸缩只能用于无状态计算服务,而不是数据库。

Docker 快速扩展的一个重要特征就是无状态,具有数据状态的都不适合直接放在 Docker 里面,如果 Docker 中安装数据库,存储服务需要单独提供。

目前,TX云的TDSQL(金融分布式数据库)和阿里云的Oceanbase(分布式数据库系统)都直接运行中在物理机器上,并非使用便于管理的 Docker 上。

5、资源隔离

资源隔离方面,Docker 确实不如虚拟机KVM,Docker是利用Cgroup实现资源限制的,只能限制资源消耗的最大值,而不能隔绝其他程序占用自己的资源。如果其他应用过渡占用物理机资源,将会影响容器里 MySQL 的读写效率。

需要的隔离级别越多,获得的资源开销就越多。相比专用环境而言,容易水平伸缩是Docker的一大优势。然而在 Docker 中水平伸缩只能用于无状态计算服务,数据库并不适用。

我们没有看到任何针对数据库的隔离功能,那为什么我们应该把它放在容器中呢?

6、云平台的不适用性

大部分人通过共有云开始项目。云简化了虚拟机操作和替换的复杂性,因此不需要在夜间或周末没有人工作时间来测试新的硬件环境。当我们可以迅速启动一个实例的时候,为什么我们需要担心这个实例运行的环境?

这就是为什么我们向云提供商支付很多费用的原因。当我们为实例放置数据库容器时,上面说的这些便利性就不存在了。因为数据不匹配,新实例不会与现有的实例兼容,如果要限制实例使用单机服务,应该让 DB 使用非容器化环境,我们仅仅需要为计算服务层保留弹性扩展的能力。

7、运行数据库的环境需求

常看到 DBMS 容器和其他服务运行在同一主机上。然而这些服务对硬件要求是非常不同的。

数据库(特别是关系型数据库)对 IO 的要求较高。一般数据库引擎为了避免并发资源竞争而使用专用环境。如果将你的数据库放在容器中,那么将浪费你的项目的资源。因为你需要为该实例配置大量额外的资源。在公有云,当你需要 34G 内存时,你启动的实例却必须开 64G 内存。在实践中,这些资源并未完全使用。

怎么解决?您可以分层设计,并使用固定资源来启动不同层次的多个实例。水平伸缩总是比垂直伸缩更好。

总结

针对上面问题是不是说数据库一定不要部署在容器里吗?

答案是:并不是

我们可以把数据丢失不敏感的业务(搜索、埋点)就可以数据化,利用数据库分片来来增加实例数,从而增加吞吐量。

docker适合跑轻量级或分布式数据库,当docker服务挂掉,会自动启动新容器,而不是继续重启容器服务。

数据库利用中间件和容器化系统能够自动伸缩、容灾、切换、自带多个节点,也是可以进行容器化的。

来源:

https://www.toutiao.com/i6805798581971190276/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT大咖说 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
为什么不建议在 Docker 中跑 MySQL Redis
容器的定义:容器是为了解决“在切换运行环境时,如何保证软件能够正常运行”这一问题。
猫头虎
2024/04/08
5790
为什么不建议在 Docker 中跑 MySQL Redis
你在 Docker 中跑 MySQL?恭喜你,可以下岗了!
来源 | https://www.toutiao.com/i6675622107390411276
程序猿DD
2021/10/14
1.1K0
你还在 Docker 中跑 MySQL?恭喜你,好下岗了!
目前,容器和 Docker 依旧是技术领域最热门的词语,无状态的服务容器化已经是大势所趋,同时也带来了一个热点问题被大家所争论不以:数据库 MySQL 是否需要容器化?
用户8639654
2021/08/24
5740
数据库部署在Docker中,Are You Crazy ?
最近在兼职做 IT 咨询期间遇到过许许多多问题,其中咨询较多的问题之一就是在 Docker 容器中部署数据库。每每接到这个咨询我就想说一句:Are you crazy? Docker 在这几年可以说是
喵叔
2021/01/17
1.2K0
数据库部署在Docker中,Are You Crazy ?
招商银行 | 基于 K8S+DOCKER 构筑容器数据库平台建设及应用实践
招行ACS私有云上线投产后, MySQL作为云上主要服务的RDS数据库服务,规模急剧增长且部分承载着分行核心业务,对业务连续性要求也越来越高,因此迫切需要建立并完善云MySQL支持服务体系和提升MySQL服务能力。
爱可生开源社区
2021/09/08
2.2K0
招商银行 | 基于 K8S+DOCKER 构筑容器数据库平台建设及应用实践
临时工说:降本增笑,开猿down机,什么是无脑数据库上docker K8s与潜在风险
最近滴滴的故障的问题,相信各大群都有分析,故障点一致指向了K8S ,Docker。 实际上对于Docker本身数据库工程师并不是很熟悉,基于数据库的本身的重要性和承载的业务量等区别,不少大型的应用是不会使用docker 来承载数据库应用的。
AustinDatabases
2023/12/05
3520
临时工说:降本增笑,开猿down机,什么是无脑数据库上docker K8s与潜在风险
商业银行基于容器云的分布式数据库架构设计与创新实践
本文介绍了某商业银行基于 TiDB 和 Kubernetes(简称 K8s) 构建的云化分布式数据库平台,重点解决了传统私有部署模式下的高成本、低资源利用率及运维复杂等问题。
PingCAP
2024/12/09
2910
商业银行基于容器云的分布式数据库架构设计与创新实践
云时代数据库的核心特点
作者简介:崔秋,PingCAP 联合创始人,重度开源爱好者,曾任职于搜狗、豌豆荚,长期从事广告系统基础组件相关的研究,现主要从事开源 NewSQL 数据库 TiDB/TiKV 相关的设计和研发工作。
PingCAP
2017/05/18
2.1K0
基于K8S的容器云平台如何部署微服务?
K8S是第一个将“一切以服务为中心,一切围绕服务运转”作为指导思想的创新型产品,它的功能和架构设计自始至终都遵循了这一指导思想,构建在K8S上的系统不仅可以独立运行在物理机、虚拟机集群或者企业私有云上,也可以被托管在公有云中。
小小科
2018/10/22
7.8K1
基于K8S的容器云平台如何部署微服务?
【赵渝强老师】数据库不适合Docker容器化部署的原因
在Docker的容器中可以部署运行一个MySQL数据库,并通过数据卷将运行在容器中的MySQL数据库的数据进行持久化。如果这时候运行MySQL的容器被销毁了,数据也将会发生丢失。因此在Docker中部署数据库服务时,一定要考虑数据持久化的问题。但数据库并不适合Docker容器化部署。
赵渝强老师
2025/05/31
1150
【赵渝强老师】数据库不适合Docker容器化部署的原因
容器化数据库必经之道
但是公司业务发展的速度实在太快,来了一个厂商或者应用就要求我们上线一个RDS实例,并且要求实例具备高可用、可扩展能力,随时上线或者下线,领导又要求提高物理硬件资源利用率。业务部门整天催着我们快速提供数据库服务,数据库实例多了后,运维难度和复杂度直线上升。公司IT发展战略朝着微服务和互联网化全面改造,DevOps建设又旨在打通运维和开发部门壁垒,作为DBA运维人员该如何适应这种转型?
沃趣科技
2020/04/10
1.5K0
容器化数据库必经之道
TiDB 容器化部署面面观丨「能量钛」圆桌论坛回顾
近日,由 TiDB 社区重磅策划的「能量钛」圆桌论坛活动圆满落幕。本次论坛特邀云原生社区创始人宋净超老师担任主持,与来自支流科技、360、58 集团、汽车之家、PingCAP 的五位资深技术大咖,围绕 “当数据库遇上 Kubernetes” 主题,探讨了他们对数据库容器化部署及运维的实践与思考。
PingCAP
2021/06/21
4690
TiDB 容器化部署面面观丨「能量钛」圆桌论坛回顾
【赵渝强老师】在Docker中运行达梦数据库
Docker是一个客户端服务器(Client-Server)架构。Docker客户端和Docker守护进程交流,而Docker的守护进程是运作Docker的核心,起着非常重要的作用(如构建、运行和分发Docker容器等)。达梦官方提供了DM 8在Docker容器中进行部署的镜像文件,下面通过具体的步骤进行演示。
赵渝强老师
2025/03/22
1890
【赵渝强老师】在Docker中运行达梦数据库
传统企业PaaS平台功能设计与业务上云思考
伴随着Docker技术的兴起,以及容器集群管理平台Mesos、Kubernetes、Swarm、Rancher等的大行其道,仿佛PaaS平台及其相关技术一下进入了黄金时期,各种各样的技术组合,各种各样的技术验证,以及伴随着容器相关的创业公司布道,仿佛只要有了PaaS平台及其相关的技术,就能解决一切的企业IT问题。但是,企业IT,尤其是非互联网传统企业,PaaS平台的构建与业务上云是一个长期的过程,绝不是一个docker+kubernetes/Mesos/Swarm构建完以后就能完成的,IaaS年代是这样,PaaS年代也是这样。
孙杰
2019/10/29
2.9K0
翻过那座山,就能看见海|kubernetes让DBA更优雅地管理数据库
标题中的DBA其实包含两层含义:Database Architect 与 Database Administrator,我在这里都简称DBA了。
沃趣科技
2018/03/21
5K6
翻过那座山,就能看见海|kubernetes让DBA更优雅地管理数据库
美团点评Docker容器管理平台
本文介绍美团点评的Docker容器集群管理平台(以下简称“容器平台”)。该平台始于2015年,是基于美团云的基础架构和组件而开发的Docker容器集群管理平台。目前该平台为美团点评的外卖、酒店、到店、猫眼等十几个事业部提供容器计算服务,承载线上业务数百个,日均线上请求超过45亿次,业务类型涵盖Web、数据库、缓存、消息队列等。 为什么要开发容器管理平台 作为国内大型的O2O互联网公司,美团点评业务发展极为迅速,每天线上发生海量的搜索、推广和在线交易。在容器平台实施之前,美团点评的所有业务都是运行在美团私有云
美团技术团队
2018/03/12
2.2K0
美团点评Docker容器管理平台
刚拿到offer入职就让我搞Docker容器部署,这怎么玩?
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/09/07
5820
刚拿到offer入职就让我搞Docker容器部署,这怎么玩?
容器集群支持数据库实践
京东容器数据库系统,管理1800台物理计算节点,生产1W+ 多MySQL Docker容器实例。架构简单可靠,Docker容器计算平台与MySQL集群管理平台解耦处理。为描述方便,京东容器化数据库系统命名为CDS,底层京东Docker容器计算平台命名为JDOS。 本文重点介绍JDOS如何支持CDS。CDS是更大的话题,后续数据库团队会分享相关实践。 介绍 CDS依赖京东坚实的JDOS技术,生产运行1W+个MySQL容器实例。CDS借助JDOS技术优势获得主要3个方面的技术收益: CDS借助Docker容器
CSDN技术头条
2018/02/12
1.8K0
容器集群支持数据库实践
阿里如何实现100%容器化镜像化?八年技术演进之路回顾(转)
八年时间,阿里集团实现了 100%内部容器化镜像化,经历了几代演进。本文将从最初的架构开始,向大家介绍下阿里内部的容器化演化过程。
用户1172223
2018/10/11
1.2K0
阿里如何实现100%容器化镜像化?八年技术演进之路回顾(转)
浅谈国产数据库多租户方案:提升云计算与SaaS的资源管理效率
近年来,“数据库多租户”这一概念在技术圈内频频出现,成为云计算和SaaS(软件即服务)架构中的重要组成部分。多租户架构不仅为企业提供了高效的资源隔离与共享解决方案,还能大幅降低成本,提高系统的可扩展性与维护效率。很多人认为,它是SaaS模式下的核心技术之一,而有些人则将其视为“高端拼房”。
猫头虎
2025/04/24
2390
浅谈国产数据库多租户方案:提升云计算与SaaS的资源管理效率
推荐阅读
相关推荐
为什么不建议在 Docker 中跑 MySQL Redis
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档