当前位置: 首页 > Linux

为什么不建议将数据库部署在Docker容器中?

时间:2023-04-06 11:48:57 Linux

原文链接如下:https://www.toutiao.com/i6805...近年来,Docker在企业环境应用端大有可为。有状态服务容器化已经是大趋势,那么问题来了,作为系统核心的数据库是否需要容器化?对于数据库是否适合容器化这个问题,不同的人可能会给出不同的答案。在回答这个问题之前,我们先来看一下容器化部署数据库和传统数据库部署的一些对比。Docker不适合部署数据库的7大理由1.数据安全问题不要将数据存储在容器中,这也是Docker官方的容器使用技巧之一。可以随时停止或删除容器。当容器被rmed时,容器中的数据将会丢失。为了避免数据丢失,用户可以使用数据卷挂载来存储数据。但是容器的volume设计是围绕UnionFS镜像层提供持久化存储,数据安全性没有保障。如果容器突然崩溃,数据库没有正常关闭,数据可能会损坏。另外,容器中的共享数据卷组会对物理机的硬件造成很大的破坏。即使你想把Docker数据存储在宿主机上,也不能保证数据不会丢失。Docker卷是围绕UnionFS镜像层设计的,以提供持久存储,但它仍然缺乏保证。使用当前的存储驱动程序,Docker仍然存在不可靠的风险。如果容器崩溃并且数据库未正确关闭,则数据可能会损坏。2.性能问题大家都知道MySQL是关系型数据库,对IO的要求很高。当一台物理机运行多台时,IO会堆积起来,造成IO瓶颈,大大降低MySQL的读写性能。在Docker应用的十大难点专场上,某国有银行的架构师也指出:“数据库的性能瓶颈一般出现在IO上。出现在存储上。互联网上的数据库大多现在有一个sharenothing架构,这可能是不考虑迁移到Docker的一个因素。”可能有些同学对于性能问题也有相应的解决方案:(1)数据库程序和数据分离如果使用Docker运行MySQL,需要将数据库程序和数据分离,数据存放在共享存储中,程序被放置在容器中。如果容器异常或者MySQL服务异常,会自动启动一个新的容器。此外,建议不要将数据存储在宿主机中。宿主机和容器共享卷组,对宿主机损坏影响较大。(2)运行轻量级或分布式数据库。在Docker中部署轻量级或分布式数据库,Docker本身建议暂停服务,自动启动一个新的容器,而不是重启容器服务。(3)合理布局应用对于IO要求比较高的应用或者服务,将数据库部署在物理机或者KVM上比较合适。目前TXCloud的TDSQL和阿里的Oceanbase都是直接部署在物理机上,而不是Docker。3.网络问题要了解Docker网络,您必须对网络虚拟化有扎实的了解。还必须做好应对意外情况的准备。您可能需要在没有支持或其他工具的情况下修复错误。我们知道:数据库需要专用和持续的吞吐量来应对更高的负载。我们还知道,容器是管理程序和主机虚拟机背后的隔离层。然而,网络对于数据库复制至关重要,这需要主从数据库之间24/7的稳定连接。未解决的Docker网络问题在1.9中仍未解决。将这些问题放在一起,容器化使得数据库容器难以管理。我知道你是顶级工程师,任何问题都可以解决。但是,您需要花多少时间来解决Docker网络问题?将数据库放在专用环境中不是更好吗?节省时间专注于真正重要的业务目标。4.State在Docker中封装无状态服务很酷,可以编排容器,解决单点故障问题。但是数据库呢?将数据库放在相同的环境中,它将是有状态的,并使系统更容易发生故障。下次您的应用程序实例或应用程序崩溃时,数据库可能会受到影响。知识点Docker中的水平伸缩只能用于无状态计算服务,不能用于数据库。Docker快速扩张的一个重要特点是无状态。有数据状态的不适合直接放在Docker里面。如果Docker中安装了数据库,则需要单独提供存储服务。目前TXCloud的TDSQL(金融分布式数据库)和阿里云的Oceanbase(分布式数据库系统)都是直接运行在物理机上,没有运行在Docker上,便于管理。5、资源隔离在资源隔离方面,Docker确实不如虚拟机KVM。Docker使用Cgroups来实现资源限制,只能限制资源消耗的最大值,不能隔离其他程序占用自己的资源。如果其他应用过度占用物理机资源,会影响MySQL在容器中的读写效率。您需要的隔离级别越多,您获得的资源开销就越大。易于水平扩展是Docker相对于专用环境的一大优势。但是,Docker中的水平扩展只能用于无状态计算服务,不能用于数据库。我们看不到数据库有任何隔离能力,那为什么要把它放在容器里呢?6、云平台的不适用性大多数人都是通过公有云开始项目的。云简化了虚拟机操作和更换的复杂性,因此无需在无人工作的晚上或周末测试新的硬件环境。既然可以快速启动实例,为什么还需要担心实例运行的环境呢?这就是我们向云提供商支付大量费用的原因。当我们为实例放置数据库容器时,上面提到的这些便利是不存在的。因为数据不匹配,所以新实例将与现有实例不兼容。如果要限制实例使用单机服务,应该让DB使用非容器化环境。我们只需要为计算服务层预留弹性扩展的能力即可。7.运行数据库的环境要求DBMS容器和其他服务运行在同一台主机上是很常见的。但是,这些服务具有非常不同的硬件要求。数据库(尤其是关系型数据库)对IO的要求很高。一般的数据库引擎使用专用环境来避免并发资源的争用。如果将数据库放在容器中,就会浪费项目的资源。因为你需要为这个实例配置很多额外的资源。在公有云中,当你需要34G内存时,你启动的实例必须有64G内存。实际上,这些资源并未得到充分利用。如何处理?您可以分层设计并使用固定资源来启动不同层的多个实例。水平缩放总是比垂直缩放更好。小结关于上面的问题,是不是说数据库一定不能部署在容器里呢?答案是:并不是说我们可以将对数据丢失不敏感的业务(搜索、埋点)数字化,利用数据库分片来增加实例数,从而提高吞吐量。Docker适合运行轻量级或分布式数据库。当docker服务挂掉后,会自动启动一个新的容器,而不是继续重启容器服务。使用中间件和容器化系统,数据库可以自动伸缩、容灾、切换、多节点,也可以容器化。