欢迎关注方志朋的博客,回复”666“获面试宝典

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

目前,容器和 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 也不是全然不能容器化。

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

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

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

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

(感谢阅读,希望对你所有帮助)

来源:toutiao.com/i6675622107390411276

热门内容:如果要存 IP 地址,用什么数据类型比较好?大部人都会答错!当 Docker 遇到 Intellij IDEA,再次解放了生产力~你真的会写for循环吗?来看看这些常见的for循环优化方式居然有人提问“国家何时整治程序员的高薪现象”?Spring官宣新家族成员:Spring Authorization Server!最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

你在 Docker 中跑 MySQL?恭喜你,可以下岗了!相关推荐

  1. mysql自动从另外表取数_你在 Docker 中跑 MySQL?恭喜你,好下岗了!

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

  2. docker连不上宿主机mysql_宿主机连接docker中的mysql

    宿主机连接docker中的mysql dokcer安装mysql docker run \ --name mysql \ -v $PWD/mysql:/var/lib/mysql \ -p 3306: ...

  3. Docker中部署mysql后SpringBoot连接时提示表不存在(修改表名忽略大小写)

    场景 Docker中部署mysql数据库: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/99213563 在上面使用Docker ...

  4. 以两台Linux主机在docker中实现mysql主主备份以用nginx实现mysql高可用

    使用nginx反向代理主主备份的两台mysql,连接时连接nginx,当其中一台myql停止后,仍然可以正常使用,如果使用k8s 会简单许多.所谓主主复制就是在主从复制的基础上掉了个头. 请博主买块糖 ...

  5. 如何在docker中运行MySQL实例(转载)

    如何在docker中运行MySQL实例 转自:https://blog.csdn.net/siying8419/article/details/79670246 通常初学者学习docker时,不太清楚 ...

  6. Docker中创建MySQL容器,将宿主机目录直接挂载到目录

    Docker中创建MySQL容器,将宿主机目录直接挂载到目录 1.在Docker中下载MySQL镜像 docker pull mysql:5.7.25 2.创建目录/tmp/mysql/data和/t ...

  7. docker 中安装 MySQL 以及使用

    环境:我使用3A服务器搭建centos7 简介 这里的实现思路是,先拉取完 MySQL 镜像之后,启动 MySQL 容器,然后将 MySQL 的配置文件拉取到本地,关闭之前启动的容器,重新使用挂载的方 ...

  8. 连接云服务器Docker中的Mysql 详细图文操作(全)

    目录 前言 1. 安装mysql 2. 开启远程连接 3. 防火墙 4. 入站规则 5. 连接mysql 前言 在云服务器上通过docker搭建的mysql 本地的navicat连接mysql的时候一 ...

  9. 远程连接不上docker中的mysql解决办法

    远程连接不上docker中的mysql解决办法 查看docker中线程,发现mysql中行动状态 我首先删除docker中的映射(先停止,再删除): //停止运行mysql01 dcoerk stop ...

最新文章

  1. 一场“交通进化”将至: 5G带给车联网与自动驾驶哪些升级?
  2. 这家芯片公司98%员工学历不足本科,却要布局全产业链冲刺IPO,网友:认真的吗?...
  3. Docker中容器数据持久化-数据卷的简单使用
  4. linux下socket编程-TCP
  5. Enterprise Library 企业库 V4.1
  6. SpringMVC的XML配置解析
  7. 散文绘画集《心欢喜,灵快乐》研讨会在京举行
  8. 前端学习(1553):复习2
  9. Nginx负载均衡配置和健康检查
  10. Introduction to replication 翻译
  11. 软件安装-Mysql数据库
  12. 面试题之说几个Object类常用方法以及作用
  13. 一年用掉近3000吨草莓的奈雪,背后是供应链数字化持续投入
  14. 实验一:MongoDB的基本操作
  15. 云计算第四次作业—web网站的搭建
  16. 大数据说婚恋--再不给女性减负,结婚率和出生率都升不回来了
  17. 王者荣耀4.4日服务器维护,一天不玩都受不了?玩家4.4号当天利用王者荣耀BUG强行进入游戏!...
  18. IDC企业为何热衷进军宽带接入网领域?
  19. 希尔排序实现与复杂度、稳定性分析
  20. Referer的作用

热门文章

  1. codechef ANUCBC(背包)
  2. Android Java使用JavaMail API发送和接收邮件的代码示例
  3. 动态规划:求最大公共子串
  4. (原)War3 脚本分析5-基础脚本资源
  5. joomla网页无任何显示输出
  6. 2021-2022-1 线性代数知识点总结的视频
  7. 【组队学习】【29期】2. 计算机视觉
  8. 技术图文:进一步完善自动化交易系统 - 02
  9. Matlab编程与数据类型 -- 分支条件选择语句if/end
  10. 【ACM】杭电OJ 1862