当前位置: 首页 > 后端技术 > Java

你还在Docker中运行MySQL吗?恭喜你,你可以下岗了!

时间:2023-04-02 01:40:58 Java

来源:toutiao.com/i6675622107390411276/容器定义:容器就是解决“切换运行环境时如何保证软件能够正常运行”的问题。目前,容器和Docker仍然是技术领域最热门的词汇。无状态服务容器化是大势所趋,同时也带来了一个大家争论不休的热点问题:数据库MySQL是否需要容器化?仔细分析了大家的各种观点,发现支持者只是从容器优势的角度解释MySQL需要容器化,几乎没有业务场景来验证他们的观点;另一方面,看看对手。多重因素说明了MySQL不需要容器化,也证明了一些不适合的业务场景。之前推过一篇文章:接下来说说Docker不适合跑MySQL的N个原因!数据安全问题不要将数据存储在容器中,这也是Docker官方的容器使用技巧之一。可以随时停止或删除容器。当容器被rmed时,容器中的数据将会丢失。为了避免数据丢失,用户可以使用数据卷挂载来存储数据。但是容器的volume设计是围绕UnionFS镜像层提供持久化存储,数据安全性没有保障。如果容器突然崩溃,数据库没有正常关闭,数据可能会损坏。另外,容器中的共享数据卷组会对物理机的硬件造成很大的破坏。每个人都知道性能问题。MySQL是关系型数据库,对IO的要求很高。当一台物理机运行多台时,IO会堆积起来,造成IO瓶颈,大大降低MySQL的读写性能。在Docker应用的十大难点专场中,某国有银行的架构师也指出:“数据库的性能瓶颈一般出现在IO上。出现在存储上。互联网上的数据库大多现在有一个sharenothing架构,这可能是不考虑迁移到Docker的一个因素。”其实有一些相应的策略可以解决这个问题,比如:1)数据库程序和数据分离如果使用Docker来运行MySQL,需要将数据库程序和数据分离,数据存储在共享存储中,并将程序放在容器中。如果容器异常或者MySQL服务异常,会自动启动一个新的容器。此外,建议不要将数据存储在宿主机中。宿主机和容器共享卷组,对宿主机损坏影响较大。2)运行轻量级或分布式数据库。在Docker中部署轻量级或分布式数据库。Docker本身建议服务挂掉后自动启动一个新的容器,而不是继续重启容器服务。3)合理布局应用对于IO要求比较高的应用或者服务,将数据库部署在物理机或者KVM上比较合适。目前腾讯云的TDSQL和阿里的Oceanbase都是直接部署在物理机上,而不是Docker。状态问题Docker中的水平扩展只能用于无状态计算服务,不能用于数据库。Docker快速扩张的一个重要特点是无状态。有数据状态的不适合直接放在Docker里面。如果Docker中安装了数据库,则需要单独提供存储服务。目前腾讯云的TDSQL(金融分布式数据库)和阿里云的Oceanbase(分布式数据库系统)都是直接运行在物理机上,没有运行在Docker上,便于管理。资源隔离在资源隔离方面,Docker确实不如虚拟机KVM。Docker使用Cgroups来实现资源限制,只能限制资源消耗的最大值,不能隔离其他程序占用自己的资源。如果其他应用过度占用物理机资源,会影响MySQL在容器中的读写效率。您需要的隔离级别越多,您获得的资源开销就越大。易于水平扩展是Docker相对于专用环境的一大优势。但是,Docker中的水平扩展只能用于无状态计算服务,不能用于数据库。MySQL不能跑在容器里吗?MySQL并非完全可容器化。以下场景仍然适用。1)对数据丢失不敏感的业务(如用户搜索产品)可以数字化,利用数据库分片增加实例数,从而提高吞吐量。2)Docker适用于运行轻量级或分布式数据库。当docker服务挂掉后,会自动启动一个新的容器,而不是继续重启容器服务。3)数据库可以通过中间件和容器化系统实现自动伸缩、容灾、切换、多节点,也可以容器化。典型案例:同程旅行、京东、阿里的数据库容器化都是很好的案例,大家可以自己去看看。近期热点文章推荐:1.1,000+Java面试题及答案(2021最新版)2.别在满屏的if/else中,试试策略模式,真的很好吃!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!