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

目前,容器和 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)数据库利用中间件和容器化系统能够自动伸缩、容灾、切换、自带多个节点,也是可以进行容器化的。

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

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

  1. 你在 Docker 中跑 MySQL?恭喜你,可以下岗了!

    欢迎关注方志朋的博客,回复"666"获面试宝典 容器的定义:容器是为了解决"在切换运行环境时,如何保证软件能够正常运行"这一问题. 目前,容器和 Docker ...

  2. php mysql query 行数_如何在PHP中获取MYSQL数据库返回的数据的行数?

    展开全部 1. mysql_num_rows 可得到e69da5e887aa3231313335323631343130323136353331333337383861查询记录数<?php $c ...

  3. 在docker中使用MySQL数据库

    为什么80%的码农都做不了架构师?>>>    概述 我是一直想把所有的程序都跑在docker里面,这样一方面是为了便于管理,另外一方面也可以增强自己对docker的理解,所以今天我 ...

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

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

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

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

  6. docker 中安装 MySQL 以及使用

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

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

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

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

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

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

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

最新文章

  1. Java assert关键字
  2. Springboot 2.返回cookies信息的get接口开发 和 带cookis去请求
  3. vue refs v-for 使用注意
  4. lucene之Field属性的解释
  5. Android Studio项目结构介绍
  6. 160 - 25 CodeZero.1
  7. 动感灯箱制作流程培训_2000多年的灯箱发展史,你知道多少?
  8. DDNS实现内网服务器映射到公网(阿里云)
  9. 网页错误排查 如何?
  10. 侧边栏_第四课 侧边栏和过滤器
  11. 4、matplotlib中的子图相关subplot
  12. linux安装中文输入法 -谷歌拼音
  13. TFS2010学习之一
  14. Linux关闭防火墙
  15. WeUI - 微信官方推出的免费开源 UI 组件库,上手简单,风格简约,在微信生态开发轻量项目的绝佳选择
  16. Text to face:寻找黛玉-从语言描述到人脸图像生成
  17. Golang底层原理学习笔记(一)
  18. [CTF]2021长安战疫 WP
  19. 直流电机双闭环调速Matlab仿真实验
  20. 王者荣耀测试自己本命英雄软件,抖音王者荣耀本命英雄测试app

热门文章

  1. 直播 | 清华大学李一鸣:后门攻击简介
  2. 深度解读NLP文本情感分析Pipeline
  3. 从无监督构建词库看「最小熵原理」,套路是如何炼成的
  4. Python数据分析实战项目-共享单车骑行数据分析
  5. 判断dialog是否显示_如何成为一流的仪表维修工之液位测量仪表故障检查判断思路...
  6. 导入jar时出现invalid LOC header (bad signature)
  7. xxxx无法转换为java.lang.Class<? extends javax.validation.Payload>
  8. 使用回溯算法分析八皇后问题
  9. 2019牛客暑期多校训练营(第二场)
  10. CG CTF WEB SQL注入1