联系电话: 18171260050

行业动态

  • 20,Apr,2022

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

  Docker在过去ocker非常受欢迎。开发人员迫不及待地想将所有应用程序部署在Docker容器中,但你确定你也应该部署数据库容器吗?这个问题不是空的,因为你可以在网上找到很多操作手册和视频教程。这里整理了一些数据库不适合容器化的原因供您参考。同时,我希望您在使用时能谨慎。到目前为止,将数据库容器化是非常不合理的,但我相信所有开发人员都尝到了容器化的优势。我希望随着技术的发展,能出现更完美的解决方案。

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

部署数据库的七个原因不适合Docker。

 1.不要将数据存储在容器中,这也是Docker官方容器使用技能之一。容器可以随时停止。或删除。当容器被RM丢失时,容器中的数据将丢失。为了避免数据丢失,用户可以使用数据卷来存储数据。然而,容器的Volumes设计是围绕UnionFS镜像层提供持久存储,数据安全缺乏保证。如果容器突然崩溃,数据库没有正常关闭,数据可能会损坏。此外,容器中共享的数据卷对物理机器的硬件也有很大的损坏。即使你想将Docker数据存储在主机中,它仍然不能保证不丢失数据。使用当前的存储驱动程序,Docker仍然存在不可靠的风险。如果容器崩溃,数据库没有正确关闭,数据可能会损坏。

 2.众所周知,MySQL是一个关系数据库,对IO有很高的要求。当一台物理机运行多次时,IO会累积,导致IO瓶颈,大大降低MySQL的读写性能。在Docker应用的十大难点特别节目中,一家国有银行的一位架构师也提出:数据库的性能瓶颈通常出现在IO上。如果遵循Docker的想法,许多docker最终的IO请求将再次出现在存储上。现在互联网上的大多数数据库都是sharenothing的架构,这可能是一个不考虑迁移到docker的因素。

一些学生也可能有相应的解决性能问题的方案:

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

如果使用Docker运行MySQL,则需要将数据库程序与数据分离,将数据存储在共享存储中,并将程序放入容器中。如果容器异常或MySQL服务异常,自动启动新容器。此外,建议不要将数据存储在宿主机中。宿主机和容器共享卷对宿主机的损坏有很大影响。

(2)运行轻量级或分布式数据库。

Docker部署了轻量级或分布式数据库。Docker本身建议挂断服务,自动启动新容器,而不是继续重启容器服务。

(3)合理布局应用。

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

3.如果你想了解Docker网络,你必须对网络虚拟化有深入的了解。数据库需要特殊和持久的吞吐量来实现更高的负载。未解决的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服务挂断时,新容器将自动启动,而不是继续重新启动容器服务。数据库可以通过中间件和集成系统自动扩展。容灾。切换。它有多个节点,也可以集成。