你在 Docker 中跑 MySQL?恭喜你,可以下岗了!
欢迎关注方志朋的博客,回复”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?恭喜你,可以下岗了!相关推荐
- mysql自动从另外表取数_你在 Docker 中跑 MySQL?恭喜你,好下岗了!
容器的定义:容器是为了解决"在切换运行环境时,如何保证软件能够正常运行"这一问题. 目前,容器和 Docker 依旧是技术领域最热门的词语,无状态的服务容器化已经是大势所趋,同时也 ...
- docker连不上宿主机mysql_宿主机连接docker中的mysql
宿主机连接docker中的mysql dokcer安装mysql docker run \ --name mysql \ -v $PWD/mysql:/var/lib/mysql \ -p 3306: ...
- Docker中部署mysql后SpringBoot连接时提示表不存在(修改表名忽略大小写)
场景 Docker中部署mysql数据库: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/99213563 在上面使用Docker ...
- 以两台Linux主机在docker中实现mysql主主备份以用nginx实现mysql高可用
使用nginx反向代理主主备份的两台mysql,连接时连接nginx,当其中一台myql停止后,仍然可以正常使用,如果使用k8s 会简单许多.所谓主主复制就是在主从复制的基础上掉了个头. 请博主买块糖 ...
- 如何在docker中运行MySQL实例(转载)
如何在docker中运行MySQL实例 转自:https://blog.csdn.net/siying8419/article/details/79670246 通常初学者学习docker时,不太清楚 ...
- Docker中创建MySQL容器,将宿主机目录直接挂载到目录
Docker中创建MySQL容器,将宿主机目录直接挂载到目录 1.在Docker中下载MySQL镜像 docker pull mysql:5.7.25 2.创建目录/tmp/mysql/data和/t ...
- docker 中安装 MySQL 以及使用
环境:我使用3A服务器搭建centos7 简介 这里的实现思路是,先拉取完 MySQL 镜像之后,启动 MySQL 容器,然后将 MySQL 的配置文件拉取到本地,关闭之前启动的容器,重新使用挂载的方 ...
- 连接云服务器Docker中的Mysql 详细图文操作(全)
目录 前言 1. 安装mysql 2. 开启远程连接 3. 防火墙 4. 入站规则 5. 连接mysql 前言 在云服务器上通过docker搭建的mysql 本地的navicat连接mysql的时候一 ...
- 远程连接不上docker中的mysql解决办法
远程连接不上docker中的mysql解决办法 查看docker中线程,发现mysql中行动状态 我首先删除docker中的映射(先停止,再删除): //停止运行mysql01 dcoerk stop ...
最新文章
- 一场“交通进化”将至: 5G带给车联网与自动驾驶哪些升级?
- 这家芯片公司98%员工学历不足本科,却要布局全产业链冲刺IPO,网友:认真的吗?...
- Docker中容器数据持久化-数据卷的简单使用
- linux下socket编程-TCP
- Enterprise Library 企业库 V4.1
- SpringMVC的XML配置解析
- 散文绘画集《心欢喜,灵快乐》研讨会在京举行
- 前端学习(1553):复习2
- Nginx负载均衡配置和健康检查
- Introduction to replication 翻译
- 软件安装-Mysql数据库
- 面试题之说几个Object类常用方法以及作用
- 一年用掉近3000吨草莓的奈雪,背后是供应链数字化持续投入
- 实验一:MongoDB的基本操作
- 云计算第四次作业—web网站的搭建
- 大数据说婚恋--再不给女性减负,结婚率和出生率都升不回来了
- 王者荣耀4.4日服务器维护,一天不玩都受不了?玩家4.4号当天利用王者荣耀BUG强行进入游戏!...
- IDC企业为何热衷进军宽带接入网领域?
- 希尔排序实现与复杂度、稳定性分析
- Referer的作用