Docker 不适合跑 MySQL 的 N 个原因

2023-05-16

  容器的定义:容器是为了解决“在切换运行环境时,如何保证软件能够正常运行”这一问题。

  目前,容器和 Docker 依旧是技术领域最热门的词语,无状态的服务容器化已经是大势所趋,同时也带来了一个热点问题被大家所争论不以:数据库 MySQL是否需要容器化?

  认真分析大家的各种观点,发现赞同者仅仅是从容器优势的角度来阐述 MySQL 需要容器化,几乎没有什么业务场景进行验证自己的观点;反过来再看反对者,他们从性能、数据安全等多个因素进行阐述 MySQL不需要容器化,也举证了一些不适合的业务场景。下面,我们就聊一下 Docker 不适合跑 MySQL 的 N 个原因!

  数据安全问题

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

  

  性能问题

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

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

 

  其实也有相对应的一些策略来解决这个问题,比如:

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

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

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

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

  (3)合理布局应用

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

  状态问题

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

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

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

  

  资源隔离方面

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

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

  

  难道 MySQL 不能跑在容器里吗?

  MySQL 也不是全然不能容器化。

  对数据丢失不敏感的业务(例如用户搜索商品)就可以数据化,利用数据库分片来来增加实例数,从而增加吞吐量。

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

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

  典型案例: 同程旅游、京东、阿里的数据库容器化都是不错的案例,大家可以自行去查看

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker 不适合跑 MySQL 的 N 个原因 的相关文章

  • MySQL“LIKE”搜索不起作用

    我通过 LOAD DATA INFILE 在 MySQL 中导入了一个 txt 数据库 一切似乎都正常 唯一的问题是 如果我使用以下查询在数据库上搜索记录 SELECT FROM hobby WHERE name LIKE Beading
  • 在 Intel 机器 (Mac) 上构建 ARM 架构的 Docker 镜像

    我希望能够从我的 Mac 构建 ARM 的 Docker 映像 我知道我可以使用 QEMU 在 Mac 上运行 ARM 容器 但我不知道如何为 ARM 构建 现在这有点复杂 我相信在不久的将来 docker 会让这一切变得更容易 基本上 您
  • Netstat不显示docker暴露的端口

    因为某些原因netstat没有列出 docker 暴露的端口 按照建议here https stackoverflow com questions 36454955 docker and netstat netstat is not sho
  • PHP PDO 使用 bindParam 第一个参数(不带冒号)[重复]

    这个问题在这里已经有答案了 请检查这个 user id int GET user id sql DELETE FROM users WHERE user id user id query db gt prepare sql query gt
  • docker 容器中的“(pygame parachute)分段错误”

    尝试在 docker 容器中使用 pygame 时出现以下错误 我想从容器中获取显示 Fatal Python error pygame parachute Segmentation Fault 重现 Docker已安装 docker ru
  • 如果 Row1 = 值 1,则更新其他行

    我有一个小的 php 脚本 用于访问 mySql 数据库 我想在数据库中插入新记录之前查看该数字 值 1 是否等于数据库中的记录 这也在第 1 行 所以我想 查看传入的电话号码是否等于数据库中的电话号码 如果是这样 则必须保持电话号码相同的
  • MySQL 排序顺序 - 排序规则?

    我在对 MySQL 中的 char 字段进行排序时遇到困难 问题是重音字符与非重音字符混淆 例如 Abc bd Acc 我认为这可能与整理有关 所以我将表格的排序规则更改为utf8 ut8 bin 看完之后这个帖子 https stacko
  • MySQL中如何声明变量?

    如何在mysql中声明一个变量 以便我的第二个查询可以使用它 我想写一些类似的东西 SET start 1 SET finish 10 SELECT FROM places WHERE place BETWEEN start AND fin
  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • 在 SQL 中,如何从 SELECT * FROM ... 中排除结果?

    我知道我的标题不太具有描述性 让我在这里详细解释一下 假设一个表有 26 个字段 例如字段 a 字段 z 我只想要一个选择查询只返回 15 个字段 所以 通常 我会执行 SELECT field a field b field o FROM
  • 删除行导致锁超时

    当我尝试从表中删除行时 我不断收到这些错误 这里的特殊情况是我可能同时运行5个进程 该表本身是一个 Innodb 表 约有 450 万行 我的 WHERE 子句中使用的列没有索引 其他指数按预期运行 这是在事务中完成的 首先删除记录 然后插
  • 获取带有计数的不同记录

    我有一张桌子personid and msg列 personid msg 1 msg1 2 msg2 2 msg3 3 msg4 1 msg2 我想得到总计msg对于每个personid 我正在尝试这个查询 select distinct
  • posts_search 中的自定义查询

    如何使用此查询作为我的自定义搜索查询 add filter posts search my search is perfect 20 2 function my search is perfect search wp query sWord
  • MySQL 与日语字符

    我试图弄清楚如何创建一个表 以便我可以在其中插入日语名字 现在我有 Type InnoDB Encoding UTF 8 Unicode utf8 Collation utf8 general ci 但是 当我插入字符时 它显示为 当我使用
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • 为什么 iconv 在 php:7.4-fpm-alpine docker 中返回空字符串

    给出以下代码
  • Mysql插入表后不显示右单引号(’)

    我有一个名为 测试 的表 我插入了一行 其中包含unicode字符右单引号 0x2019在名称字段中 SQL insert into Testing values Sno Name Address insert into Testing v
  • 通过触发器应用表的列权限

    现在 我有一个名为 Members 的表 其中包含内容 分为联系人数据 银行数据 现在 管理员应该能够创建 更新 删除用户 这些用户保存在另一个表中 该表只能访问管理员 用户应该获得自己的 mysql 用户帐户 管理员还应该能够设置权限 例
  • MySQL 转储未知选项“-no-beep”

    在旧服务器上我使用了mysql转储命令来备份 MySQL 数据库 在新服务器上 MySQL 版本为 5 6 相同的命令给出了错误 unknown option no beep 无论它插入什么 我也在互联网上搜索过 但找不到任何帮助 在 my
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主

随机推荐

  • 开源项目预览

    开源项目网址插入dev ide 打开预览 xff1a https dev ide
  • Debian搭建web服务器(最简单的搭建)

    apt install y apache2 安装完成之后 xff0c 浏览器中输入http localhost 或者 http 127 0 0 1 就可以看到apache2的默认页面 xff0c apache2默认网页文件存放在 var w
  • 编程的智慧

    编程的智慧 反复推敲代码 xff0c 质 gt 量 代码模块化 避免太长函数 xff08 40行 xff1f xff09 多复用提取成函数 复杂逻辑提取成辅助函数 xff0c 简化逻辑 复杂表达式做成中间变量 xff08 嵌套函数 xff0
  • 【问题】VS2010 VS2012 VS2013 安装之后提示 "无法打开文件 kernel32.lib" 解决方案

    VS2010 VS2012 VS2013 安装之后提示 无法打开文件 kernel32 lib 解决方案 相信很多小伙伴的在学习C C 43 43 的时候一定遇到过类似的问题 xff1a 安装好了VS环境 xff0c 写了第一个C C 43
  • 分布式文件系统—HDFS—IDEA的Hadoop可视化插件BigDataTools

    原文作者 xff1a xff1f xff1f 原文地址 xff1a idea新工具Big Data Tools安装 Big Data Tools插件为了连接hadoop集群 xff0c 可以在上面操作hdfs xff0c 方便好用 1 首先
  • 【C语言】两个整数最大公约数和最小公倍数

    题目 输入两个整数 xff0c 求这两个数的最大公约数和最小公倍数 我们先来讲最大公约数 第一种求法 xff08 辗转相除法 xff09 这个方法代码较洁简 xff0c 我也比较推荐就是刚开始有点比较难了解 首先 xff0c 来看看怎么求最
  • 在一个 less 文件中引用另一个 less 文件

    less loader webpack provides an advanced mechanism to resolve files The less loader applies a Less plugin that passes al
  • 给折腾ramdisk的朋友们一点建议

    Ramdisk是什么 xff0c 恐怕不需要我多说大家都知道 至于ramdisk有什么优点 xff0c 百度一下你能看到因为ramsik有着很快的读写速度所以 放临时文件能加快速度 xff0c 装软件可以秒开 等等各种优化的方法 xff0c
  • 网络安全工程师,如何“打怪升级”?

    近年来 xff0c 信息网络安全问题引发了社会各界的广泛关注 xff0c 越来越多的网络安全类人才受到各大公司的青睐 如果你的逻辑分析能力足够强 xff0c 而且同时还有IT领域工作经验 xff0c 那么恭喜你 xff0c 你已经拥有了成为
  • Docker不适合部署数据库的7大原因

    近2年Docker非常的火热 xff0c 各位开发者恨不得把所有的应用 软件都部署在Docker容器中 xff0c 但是您确定也要把数据库也部署的容器中吗 xff1f 这个问题不是子虚乌有 xff0c 因为在网上能够找到很多各种操作手册和视
  • 解决:VMware Workstation 与 Device/Credential Guard 不兼容

    VMware Workstation 与 Device Credential Guard 不兼容 在禁用 Device Credential Guard 后 xff0c 可以运行 VMware Workstation 出现问题的原因 xff
  • IIS部署网站提示handlers节点锁定,HTTP 错误 500

    新安装了一台Win 2016 服务器 xff0c 部署网站提示如下 xff1a 在cmd窗口中执行了 xff1a windir system32 inetsrv appcmd unlock config section system web
  • Debian简单配置squid

    安装squid apt install y squid 修改squid配置文件 xff0c 养成一个好习惯 xff0c 不管修改什么文件之前都先备份原文件 cp etc squid squid conf etc squid squid co
  • 软考--网络工程师(考试形式及重要考点)

  • 部署Kubernetes高可用集群(上)

    一 前置知识点 1 1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式 xff1a kubeadm Kubeadm是一个K8s部署工具 xff0c 提供kubeadm init和kube
  • 部署Kubernetes高可用集群(下)

    七 高可用架构 xff08 扩容多Master架构 xff09 Kubernetes作为容器集群系统 xff0c 通过健康检查 43 重启策略实现了Pod故障自我修复能力 xff0c 通过调度算法实现将Pod分布式部署 xff0c 并保持预
  • 记一次 Linux 被入侵全过程

    0x00 背景 周一早上刚到办公室 xff0c 就听到同事说有一台服务器登陆不上了 xff0c 我也没放在心上 xff0c 继续边吃早点 xff0c 边看币价是不是又跌了 不一会运维的同事也到了 xff0c 气喘吁吁的说 xff1a 我们有
  • TCP三次握手、四次挥手过程及原理

    TCP建立连接为什么是三次握手 xff0c 而不是两次或四次 xff1f TCP xff0c 名为传输控制协议 xff0c 是一种可靠的传输层协议 xff0c IP协议号为6 顺便说一句 xff0c 原则上任何数据传输都无法确保绝对可靠 x
  • 详解 Windows自带的MPIO(多路径)

    windows的MPIO 1 在双活系统中 xff0c 常常为客户端配置多路径 xff0c 来保证业务可持续 xff0c 那今天我们来聊聊windows自带的MPIO 2 首先先教大家如何安装windows自带的MPIO xff08 1 x
  • Docker 不适合跑 MySQL 的 N 个原因

    容器的定义 xff1a 容器是为了解决 在切换运行环境时 xff0c 如何保证软件能够正常运行 这一问题 目前 xff0c 容器和 Docker 依旧是技术领域最热门的词语 xff0c 无状态的服务容器化已经是大势所趋 xff0c 同时也带