Docker容器可以使用容器平台管理自动重启实现自修复吗?

容器的自修复功能是经常被吹嘘的。因为容器是衣服,人躺下了,衣服也躺下了,容器平台能够马上发现人躺下了,于是可以迅速将人重新唤醒工作。

而虚拟机是房子,人躺下了,房子还站着。因而虚拟机管理平台不知道里面的人能不能工作,所以容器挂了会被自动重启,而虚拟机里面的应用挂了,只要虚拟机不挂,很可能没人知道。

这些说法都没错,但是人们慢慢发现了另外的场景,就是容器里面的应用没有挂,所以容器看起来还启动着,但是应用已经不工作没有反应了。

当启动容器的时候,虽然容器的状态起来了,但是里面的应用还需要一段时间才能提供服务。

所以针对这种场景,容器平台会提供对于容器里面应用的 health check,不光看容器在不在,还要看里面的应用能不能用,如果不能,可自动重启。

一旦引入了 health check,和虚拟机的差别也不大了,因为有了 health check,虚拟机也能看里面的应用是否工作了,不工作也可以重启应用。

还有就是容器的启动速度快,秒级启动,如果能够自动重启修复,那就是秒级修复,所以应用更加高可用。

这个观点当然不正确,应用的高可用性和重启的速度没有直接关系。高可用性一定要通过多个副本来实现,在任何一个挂掉之后,不能通过这一个应用快速重启来解决,而是应该靠挂掉的期间,其他的副本马上把任务接过来进行解决。

虚拟机和容器都可以有多副本,在有多个副本的情况下,重启是 1 秒还是 20 秒,就没那么重要了,重要的是挂掉的这段时间内,程序做了什么。

如果程序做的是无关紧要的操作,那么挂了 20 秒,也没啥关系;如果程序正在进行一个交易和支付,那挂掉 1 秒也不行,也必须能够修复回来。

所以应用的高可用性要靠应用层的重试,幂等去解决,而不应该靠基础设施层重启的快不快来解决。

对于无状态服务,在做好重试的机制的情况下,通过自动重启修复是没有问题的,因为无状态的服务不会保存非常重要的操作。

对于有状态服务,容器的重启不但不是推荐的,而且可能是灾难的开始。

一个服务有状态,例如数据库,在高并发场景下,一旦挂了,哪怕只有 1 秒,我们必须要弄清楚这 1 秒都发生了什么,哪些数据保存了,哪些数据丢了,而不能盲目的重启,否则很可能会造成数据的不一致性,后期修都没法修。

例如高频交易下的数据库挂了,按说 DBA 应该严格审核丢了哪些数据,而不是在 DBA 不知情的情况下,盲目的重启了,DBA 还觉得没什么事情发生,最终很久才能发现问题。

所以容器是比较适合部署无状态服务的,随便重启都可以。

而容器部署有状态容器不是不能,而是要非常小心,甚至都是不推荐的。

虽然很多的容器平台都支持有状态容器,然而平台往往解决不了数据问题,除非你对容器里面的应用非常非常熟悉。

当容器挂了,你能够准确的知道丢了哪些,哪些要紧,哪些不要紧,而且要写代码处理这些情况,然后才能支持重启。

网易这面的数据库在主备同步的情况下,是通过修改 MySQL 源代码,保证主备之间数据完全同步,才敢在主挂了的情况下,备自动切换主。

而宣传有状态容器的自动重启,对于服务客户来讲是很不经济的行为,因为客户往往没有那么清楚应用的逻辑,甚至应用都是买的。

如果使用有状态容器,任凭自动重启,最终客户发现数据丢失的时候,还是会怪到你的头上。

所以有状态的服务自动重启不是不可用,需要足够专业才行。

原文地址:https://www.cnblogs.com/ymwang/p/8628746.html

时间: 2024-11-06 09:34:49

Docker容器可以使用容器平台管理自动重启实现自修复吗?的相关文章

Docker背后的容器管理——Libcontainer深度解析

Libcontainer 是Docker中用于容器管理的包,它基于Go语言实现,通过管理namespaces.cgroups.capabilities以及文件系统来进行容器控制.你可以使用Libcontainer创建容器,并对容器进行生命周期管理. 容器是一个可管理的执行环境,与主机系统共享内核,可与系统中的其他容器进行隔离. 在2013年Docker刚发布的时候,它是一款基于LXC的开源容器管理引擎.把LXC复杂的容器创建与使用方式简化为Docker自己的一套命令体系.随着Docker的不断发

【转载】基于Docker的CaaS容器云平台架构设计及市场分析

[转自]http://www.cnblogs.com/darkprince/p/5115739.html 基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交付持续化,业务服务化. 容器将成为新一代应用的标准交付件,容器云将帮助企业用户构建研发流程和云平台基础设施.缩短应用向云端交付的周期,降低运营门槛.加速企业向互联网技术和业务的双转型. 容器云将

【原创】基于Docker的CaaS容器云平台架构设计及市场分析

基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交付持续化,业务服务化. 容器将成为新一代应用的标准交付件,容器云将帮助企业用户构建研发流程和云平台基础设施.缩短应用向云端交付的周期,降低运营门槛.加速企业向互联网技术和业务的双转型. 容器云将对接各类代码托管库,实现自动化持续集成和DOCKER镜像构建,为新一代应用交付和开发运维一体化奠定了基础.

Docker 镜像与容器管理(2)

title: Docker 镜像与容器管理(2) date: 2018-12-14 17:04:05 tags: Docker categories: Docker copyright: true --- Docker是基于Go语言实现的开源容器项目,Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口,Docker诞生于2013年年初,最初发起者是dotCloud公司.D

DOCKER学习_002:Docker的镜像容器管理

一 Docker的基本信息 前面已经安装了Docker,现在看一下已安装Docker的安装环境以及其他信息 1.1 系统环境 [[email protected] ~]# uname -r 3.10.0-957.27.2.el7.x86_64 [[email protected]-server3 ~]# cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core) 1.2 Docker版本 [[email protected] ~]#

Docker入门二:容器管理

Docker入门二:容器管理 LinuxDocker time: 2019-12-3 容器管理 docker常用命令 注: 命令中的CONTAINER,可以是conainer_id,也可以是container name docker system info # 查看docker系统信息 docker container ls -a 查看当前已经创建的container docker container ls: -a 显示所有容器 -q 仅显示ID -s 显示container的文件大小 快速启动

docker镜像与容器管理(二)

镜像: 静态的只读文件,是一个只读的模板. 容器: 是从镜像创建的一个运行实例,容器是带有运行时需要的可写文件层. 镜像工作原理:     启动一个新的容器时,docker会加载镜像,在镜像之上添加一个读写层,     并将镜像中的目录复制一份到/var/lib/docker/containers/容器ID的目录下,     容器内修改已存在的文件,会将该文件从只读层复制到读写层,并覆盖只读层的文件,实现了文件系统隔离,     当删除容器后,读写层的数据将会删除,镜像不变. 镜像文件存储:  

Docker命令和容器名称的自动补齐

Docker命令和容器名称的自动补齐 问题描述: 在使用docker命令在进行容器相关操作(如停止.启动.重启.查看日志等)操作的时候容器名称不自动补全. Linux补全命令机制 Linux系统许多命令都会提供该命令自身的命令补齐脚本,在安装命令时会自动安装自动补齐脚本--如果有的话.该机制在Linux中被称为bash-complete.在/usr/share/bash-completion/completions目录下有许多命令自动补齐的脚本,可自行查阅.与docker有关的,有2个:dock

docker镜像、容器管理

Docker优势 1) 更高效的利用系统资源 无论是应用执行速度.内存损耗或者文件存储速度,都要比传 统虚拟机技术更高效. 2)更快速的启动时间 Docker 容器应用,由于直接 运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级.甚至毫秒级的启 动时间. 3)一致的运行环境 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性 4)持续交付和部署 使用 Docker 可以通过定制应用镜像来实现持续集成.持续交付.部署. 二:为什么要使用Docker 不仅仅开发团队