Docker容器可以使用容器平台管理自动重启实现自修复吗?
容器的自修复功能是经常被吹嘘的。因为容器是衣服,人躺下了,衣服也躺下了,容器平台能够马上发现人躺下了,于是可以迅速将人重新唤醒工作。
而虚拟机是房子,人躺下了,房子还站着。因而虚拟机管理平台不知道里面的人能不能工作,所以容器挂了会被自动重启,而虚拟机里面的应用挂了,只要虚拟机不挂,很可能没人知道。
这些说法都没错,但是人们慢慢发现了另外的场景,就是容器里面的应用没有挂,所以容器看起来还启动着,但是应用已经不工作没有反应了。
当启动容器的时候,虽然容器的状态起来了,但是里面的应用还需要一段时间才能提供服务。
所以针对这种场景,容器平台会提供对于容器里面应用的 health check,不光看容器在不在,还要看里面的应用能不能用,如果不能,可自动重启。
一旦引入了 health check,和虚拟机的差别也不大了,因为有了 health check,虚拟机也能看里面的应用是否工作了,不工作也可以重启应用。
还有就是容器的启动速度快,秒级启动,如果能够自动重启修复,那就是秒级修复,所以应用更加高可用。
这个观点当然不正确,应用的高可用性和重启的速度没有直接关系。高可用性一定要通过多个副本来实现,在任何一个挂掉之后,不能通过这一个应用快速重启来解决,而是应该靠挂掉的期间,其他的副本马上把任务接过来进行解决。
虚拟机和容器都可以有多副本,在有多个副本的情况下,重启是 1 秒还是 20 秒,就没那么重要了,重要的是挂掉的这段时间内,程序做了什么。
如果程序做的是无关紧要的操作,那么挂了 20 秒,也没啥关系;如果程序正在进行一个交易和支付,那挂掉 1 秒也不行,也必须能够修复回来。
所以应用的高可用性要靠应用层的重试,幂等去解决,而不应该靠基础设施层重启的快不快来解决。
对于无状态服务,在做好重试的机制的情况下,通过自动重启修复是没有问题的,因为无状态的服务不会保存非常重要的操作。
对于有状态服务,容器的重启不但不是推荐的,而且可能是灾难的开始。
一个服务有状态,例如数据库,在高并发场景下,一旦挂了,哪怕只有 1 秒,我们必须要弄清楚这 1 秒都发生了什么,哪些数据保存了,哪些数据丢了,而不能盲目的重启,否则很可能会造成数据的不一致性,后期修都没法修。
例如高频交易下的数据库挂了,按说 DBA 应该严格审核丢了哪些数据,而不是在 DBA 不知情的情况下,盲目的重启了,DBA 还觉得没什么事情发生,最终很久才能发现问题。
所以容器是比较适合部署无状态服务的,随便重启都可以。
而容器部署有状态容器不是不能,而是要非常小心,甚至都是不推荐的。
虽然很多的容器平台都支持有状态容器,然而平台往往解决不了数据问题,除非你对容器里面的应用非常非常熟悉。
当容器挂了,你能够准确的知道丢了哪些,哪些要紧,哪些不要紧,而且要写代码处理这些情况,然后才能支持重启。
网易这面的数据库在主备同步的情况下,是通过修改 MySQL 源代码,保证主备之间数据完全同步,才敢在主挂了的情况下,备自动切换主。
而宣传有状态容器的自动重启,对于服务客户来讲是很不经济的行为,因为客户往往没有那么清楚应用的逻辑,甚至应用都是买的。
如果使用有状态容器,任凭自动重启,最终客户发现数据丢失的时候,还是会怪到你的头上。
所以有状态的服务自动重启不是不可用,需要足够专业才行。
Docker容器可以使用容器平台管理自动重启实现自修复吗?的更多相关文章
- docker镜像、容器以及命令操作
docker image docker image是一个极度精简版的Linux程序运行环境,官网的java镜像包括的东西更少,除非是镜像叠加方式的如centos+java7 docker image是 ...
- docker自动重启容器
docker run --restart=always -d --name myunbuntu ubuntu /bin/bash -c "l am a docker" //无 ...
- Tomcat Docker容器自动重启问题排查
1. 问题 前两天发现 APP 刷新数据偶尔出现等半天没有响应的情况,感觉不像 APP 的问题,就查了下服务端的日志. 服务端用的是 Java,部署采用的 Docker 官方的 tomcat 镜像,并 ...
- Docker背后的容器管理——Libcontainer深度解析
Libcontainer 是Docker中用于容器管理的包,它基于Go语言实现,通过管理namespaces.cgroups.capabilities以及文件系统来进行容器控制.你可以使用Libcon ...
- 容器、容器集群管理平台与 Kubernetes 技术漫谈
原文:https://www.kubernetes.org.cn/4786.html 我们为什么使用容器? 我们为什么使用虚拟机(云主机)? 为什么使用物理机? 这一系列的问题并没有一个统一的标准答案 ...
- Watchtower - 自动更新 Docker 镜像与容器
git 地址:https://github.com/containrrr/watchtower Docker images docker pull containrrr/watchtower:i386 ...
- Docker进阶之五:容器管理
容器管理 一.创建容器常用选项 docker container --help 指令 描述 资源限制指令 -i, --interactive 交互式 -m,--memory 容器可以使用的最大内存量 ...
- 【原创】基于Docker的CaaS容器云平台架构设计及市场分析
基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交 ...
- Docker容器中用户权限管理
在Linux系统中有一部分知识非常重要,就是关于权限的管理控制:Linux系统的权限管理是由uid和gid负责,Linux系统会检查创建进程的uid和gid,以确定它是否有足够的权限修改文件,而非是通 ...
随机推荐
- Python 名称空间与作用域、闭包与装饰器
Python 的名称 Python 的名称(Name)是对象的一个标识(Identifier).我们知道,在 Python 里面一切皆对象,名称就是用来引用对象的.说得有点玄乎,我们以例子说明. 例如 ...
- lua连接数据库操作示例代码
lua连接数据库可以使用resty.mysql库 示例代码如下: local mysql = require "resty.mysql" local db, err = mysql ...
- intel EPT 机制详解
2016-11-08 在虚拟化环境下,intel CPU在处理器级别加入了对内存虚拟化的支持.即扩展页表EPT,而AMD也有类似的成为NPT.在此之前,内存虚拟化使用的一个重要技术为影子页表. 背景: ...
- (2.7)Mysql之SQL基础——表的操作与查看
(2.7)Mysql之SQL基础——表的操作与查看 搜索关键字:mysql表操作,comment注释操作,mysql临时表 0.临时表 create temporary table 1.创建表(在in ...
- 0604-Zuul构建API Gateway-Zuul的回退
一.概述 参看地址:https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#hystrix-f ...
- 聊一聊python的单例模式
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- org.apache.ibatis.binding.BindingException: Mapper method 'attempted to return null from a method with a primitive return type (long).
一.问题描述 今天发现测试环境报出来一个数据库相关的错误 org.apache.ibatis.binding.BindingException: Mapper method 'attempted to ...
- js的同步异步
由于js没有多线程,所以处理多任务的时候,可以用异步回调来解决.js中setTimeout.setInterval.ajax(jq中可以选择同步或异步)均会开启异步.遇到异步模块,会将其推入值任务队列 ...
- iClap:产品经理再忙也要看《琅琊榜》
最先知道<琅琊榜>,是半年前偶然看了整整21分钟的<琅琊榜>片花,对麒麟才子梅长苏这一角色甚是期待,开播后每集必看,重复看,此剧果真不负众望,口碑爆棚,收视爆红,确是一部久违的 ...
- fzu1901Period II
地址:http://acm.fzu.edu.cn/problem.php?pid=1901 题目: Problem 1901 Period II Accept: 442 Submit: 1099 ...