Heim  >  Fragen und Antworten  >  Hauptteil

看到网上一片文章说:数据库不适合Docker及容器化?

文章连接
刚开始用docker,有点疑惑?

PHP中文网PHP中文网2755 Tage vor836

Antworte allen(5)Ich werde antworten

  • phpcn_u1582

    phpcn_u15822017-04-27 09:03:42

    关于数据库不适合放在docker里面,有两个歪果仁的文章,其一就是楼主所贴,其二是这篇,译文

    还是那个观点:

    量小的时候随便搞,量大了有些东西就不行了,传统型数据库和docker并不对路,建议不要直接容器化,非要把数据库容器化,那么需要各种系统的支撑,包括中间件系统、容器化系统。

    如果你的数据库能够自动伸缩、容灾、切换、自带多节点解决方案等,docker算是一个比较好的方案。

    但是如果不能,还是不要用docker。

    原文中也说得很清楚:

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

    流量小的情况下,什么东西容器化都行。数据库,应用,hadoop,各种节点,nginx。


    量大的情况下,存储相关的不适合容器化,应用层、业务层等无状态的服务适合容器化,缓存这类内存密集型的服务可以容器化。

    简单来说就是三个问题,容灾、性能和数据一致性。

    就mysql这种传统数据库而言,仅仅我所能列出来的问题就有如下这么多:

    1. mysql怎么容器化?

    2. 主库mysqld跪了怎么办?

    3. 主库dockerd跪了怎么办?

    4. 从库mysqld跪了怎么办?

    5. 从库dockerd跪了怎么办?

    6. 能否在高峰来临之际通过容器快速扩容mysql?方案?

    7. 数据主从切换方案?一致性如何保证?

    8. 高峰时期量足够大,有时候一般一台物理机的容量只够一个mysql进程。

    9. 那么同样是单台机器,为什么不能直接启动mysql?

    10. 为什么还要外面套一层容器?对性能损耗多少?

    11. mysql如何升级?

    12. 数据卷是否会丢失数据?(损坏容器我遇到过很多次了……)

    但是mysql也不是全然不能容器化。
    对数据丢失不敏感的业务(例如京东搜索搜到的商品)就可以数据化,利用数据库分片来实现通过增加实例数增加吞吐量。

    题主原文中提到的问题,有些东西是有槽点的,但是考虑的很周全。比如如下问题就很有槽点(关于共享数据目录):

    容易水平伸缩?是否要在多个实例之间共享数据目录?你不害怕直接数据并发问题和可能的数据损坏吗?使用专用数据环境部署多个实例不会更安全吗?最后搞一个主从复制?

    就我目前接触到的数据库来看,只有cassandra这类(个)(还有tidb和cockroachdb,但是目前还没遇到过大公司的用例)数据库适合容器化。

    但是cassandra自身也接近是无状态了:自己提供容灾,扩容,切换方案。


    以下提一下京东。

    京东是个异类,但是京东也提到过类似的问题和需要注意的地方。

    计算类应用、无状态应用优先,例如微服务特别容易迁移到弹性云。
    应用迁移到弹性云,最好选择统一的规格,避免各个实例的负载不均衡。
    应用从物理机迁移到弹性云后,实例数量会增加,相应对后端服务的连接数会增加,特别是数据库连接,所以需要防止连接过载。
    在弹性云上共享磁盘IO,要避免应用刷日志,减少本地读写文件,采用JFS或JIMDB来满足文件存储或共享数据需求。
    容器的CPU核数原低于原有物理机的核数,应用需要根据CPU核数来合理地配置线程数和网络参数。
    修改底层,让应用在运行时能准确地拿到自身容器的核数。

    甚至,对docker做了很多的定制。

    可以看京东分享。

    Antwort
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-27 09:03:42

    不适合, 而不是不能.

    如果单机没什么问题, 在某些情况下还是有利的. 比如之前我公司的oracle数据库调参数时导致数据库崩溃彻底起不来了, 还好那时用的是docker, 直接run一个, 把数据目录指向原来的就好了.

    集群的话不管怎么样, 用docker手工组, 或swarm这类工具也好, 都不怎么好搞. 还不如直接在物理机上搭建省事.

    国外有家公司就是专做docker的数据存储方案的. 比如flocker, 还有rancher的convoy

    Antwort
    0
  • PHPz

    PHPz2017-04-27 09:03:42

    docker放更适合无状态,不会变更服务。

    如大量集群的时候:
    编写好docker file。然后当代码上传到代码仓库的后,在然后部署让好docker file以后,再让发布脚本批量构建docker服务并把服务代码放进去。

    不仅仅是MySQL,类似于redis,mc都不适合放入docker中,或者说放把数据库放docker中有为了使用docker而这样做,并没有太多的好处。

    Antwort
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-04-27 09:03:42

    是的,因为docker的特性决定了它是不适合做数据储存的,不只是数据库,所有储存相关的服务都不适合用docker。

    Antwort
    0
  • 世界只因有你

    世界只因有你2017-04-27 09:03:42

    官方mysql镜像是把数据存储在哪个目录的我都看不明白。

    Antwort
    0
  • StornierenAntwort