版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/79877076

容器化 RDS 系列文章:

即使不使用 Kubernetes,在编排持久化 workload 时,你都须要了解编排框架和 Cloud Provider 是怎样交互的。数据又是怎样被写"坏"的。下面描写叙述的场景具有普遍意义,也是必须要回答的问题。

简单场景

从存储池中获取 RW Volume,挂载到指定 Node 上,并在该 Node 上启动持久化应用 MySQL。

Volume 使用流程大致例如以下:

  • 生成 Volume

  • mount 到数据库实例所在节点,数据库启动

略微复杂一点

  • 从存储池中获取 Volume,挂载到指定 Node 上,并在该 Node 上启动持久化应用 MySQL

  • MySQL具备重建/故障切换/又一次调度的能力

Volume 使用流程也会更复杂一些:

  • 生成 Volume

  • mount 到数据库实例所在节点,数据库启动

  • 数据库实例由于recreate/failover/rescheduling,被调度新节点

  • Volume 从原节点 unmount

  • mount 到新节点,数据库启动

相比上个场景。添加了3个环节。
复杂一点

大多数情况下 Kubernetes 不会直接管理 bare-metal。而是执行在第三方 Cloud Provider 上(GCE/Azure/AWS/OpenStack),Kubernetes 会作为 Volume 的使用者,由 Cloud Provider 负责 Volume 的生命周期,所以之前的 mount/unmount 会有所变化:

  • Volume 在 mount 之前,须要“通知” Cloud Provider

  • Volume 在 unmount 之后,须要“通知” Cloud Provider

假设Volume 在 unmount 之后,没有“通知” Cloud Provider,Cloud Provider 会保证该 Volume 不会被挂载到其它 Node 上,“多点挂载”在大多数场景下会导致“Data Corruption”。所以加入这两个步骤是有必要的,Cloud Provider 须要感知 Volume 的“使用场景”(譬如在 GCE 环境,是不同意RW Volume 同一时候挂载到多个节点)。

这两个步骤被称为 attach/detach。

Volume 使用流程也会更复杂一些:

  • 生成 Volume

  • attach 到数据库实例所在节点

  • mount 到数据库实例所在节点,数据库启动

  • 数据库实例由于recreate/failover/rescheduling,被调度其它节点

  • Volume 从原节点 unmount

  • Volume 从原节点 detach

  • attach 到新节点

  • mount 到新节点。数据库启动

再复杂一点

须要继续思考一个问题:谁来“通知”Cloud Provider?
Kubernetes 1.3 之前,以上全部的工作由 Kubelet 完毕。由Volume Plugin 适配第三方 Cloud Provider 的逻辑。

但 Kubelet 是执行在 Node 端的 Agent。
一旦 Node 重新启动 / Crash / 网络故障,都会导致无法“通知”Cloud Provider,即便该 Volume 已经没有应用訪问。Cloud Provider 都不会让不论什么节点使用它。
当然。还会有其它问题,譬如多个 Kubelet 带来的“race condition”。

解耦 Attach-Mount-Unmount-Detach

流程不变,Kubernetes 1.3 之后。尝试使用专门的 Controller 管理 Attach 和 Detach 操作。

该 Controller 被叫做 AttachDetach Controller。它执行在已有的 Controller Plane 上。

通过“volumes.kubernetes.io/controller-managed-attach-detach”启动该特性(默认使用该特性)。
问题还没有解决

attach-mount-umount-detach流程的串行有序是保障数据不被写“坏”的基础。

  • Volume 在 mount 之前,Kubelet 会先确认是否已经 attach

  • Volume 在 detach 之前,AttachDetach Controller 会确认是否已经 unmount

所以。假设 Volume 不能被 Kubelet 成功地 unmount,AttachDetach Controller 不能进行 detach 操作。
又回到之前的问题。
Kubelet 是执行在 Node 端的 Agent,一旦 Node 重新启动 / Crash / 网络故障,都会导致无法完毕 unmount 操作。 
AttachDetach Controller 不可能无限制的等待前置动作 unmount,所以通过參数 maxWaitForUnmountDuration(默认6分钟)解决该问题。

超过 maxWaitForUnmountDuration。AttachDetach Controller 会启动 force detaching。

这破坏了 attach-mount-umount-detach 流程的串行有序,一个 RW Volume 在多个节点上挂载的可能性出现了。

数据可能被写“坏"

Kuberetes 集群的正常执行,依赖 API Server 跟 Kubelet 的正常交互,能够理解为”心跳”。

“心跳”丢失的可能性非常多,譬如:

  1. Node 重新启动 / Crash。

  2. Node 跟 API Server 网络故障;

  3. Node 在高负载下,Kubelet无法获得 CPU 时间分片;

  4. 等等

换句话说,一旦“心跳”丢失,集群无法推断 Node 的真实状态。

这时执行在 Controller Plane 之上的 NodeLifecycle Controller 会把该节点标记为“ConditionUnknown”。
一旦超过阈值podEvictionTimeout,NodeLifecycle Controller会对该节点上执行的 MySQL 进行驱赶,Scheduler会将 MySQL调度到其它“available”节点。
配合上 force detaching 导致的“多点挂载”,多个实例对同一个 Volume 的“Write”导致“Data Corruption”。

容器化 RDS:你须要了解数据是怎样被写"坏"的的更多相关文章

  1. 容器化RDS|计算存储分离 or 本地存储?

    随着交流机会的增多(集中在金融行业,规模都在各自领域数一数二),发现大家对 Docker + Kubernetes 的接受程度超乎想象, 并极有兴趣将这套架构应用到 RDS 领域.数据库服务的需求可以 ...

  2. Docker最全教程——数据库容器化之持久保存数据(十一)

    上一节我们讲述了SQL Server容器化实践(注意,SQL Server现在也支持跨平台),本节将讲述如何持久保存数据,并且接下来将逐步讲解其他数据库(MySql.Redis.Mongodb等等)的 ...

  3. python + docker, 实现天气数据 从FTP获取以及持久化(五)-- 利用 Docker 容器化 Python 程序

    背景 不知不觉中,我们已经完成了所有的编程工作.接下来,我们需要把 Python 程序 做 容器化 (Docker)部署. 思考 考虑到项目的实际情况,“持久化天气”的功能将会是一个独立的功能模块发布 ...

  4. 面向UI编程:ui.js 1.0 粗糙版本发布,分布式开发+容器化+组件化+配置化框架,从无到有的艰难创造

    时隔第一次被UI思路激励,到现在1.0的粗糙版本发布,掐指一算整整半年了.半年之间,有些细节不断推翻重做,再推翻再重做.时隔今日,终于能先出来个东西了,这个版本很粗糙,主体功能大概能实现了,但是还是有 ...

  5. .NET Core+MySql+Nginx 容器化部署

    .NET Core容器化@Docker .NET Core容器化之多容器应用部署@Docker-Compose .NET Core+MySql+Nginx 容器化部署 GitHub-Demo:Dock ...

  6. .NET微服务 容器化.NET应用架构指南(支持.NET Core2)

    介绍 企业通过使用容器,日益实现成本节约.解决部署问题并改进 DevOps 和生产操作. 通过创建 Azure 容器服务.Azure Service Fabric 等产品,同时与 Docker.Mes ...

  7. 浅谈surging服务引擎中的rabbitmq组件和容器化部署

    1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...

  8. Docker最全教程——Redis容器化以及排行榜实战(十三)

    前言 容器教程的路还很长,笔者尽量根据实践来不断地完善.由于在编写的过程中还会有完善和补充,后续可能会以番外来补充. 接下来会分享TeamCity.树莓派等内容,节奏可能会有点跳脱. 另外,长沙.NE ...

  9. 一份.NET 容器化的调查小结

    小编在上个月在微信公众号"dotnet跨平台" 做了一个针对.NET 容器化的调查:https://mp.weixin.qq.com/s/oszbuIORT0G8XLLgMZzkn ...

随机推荐

  1. 详解 Redis 应用场景及应用实例

    redis(二)高级用法 详解 Redis 应用场景及应用实例 Redis 它是什么?它用来做什么?它的优势与短板如何? 告诉你Redis是一个牛逼货

  2. Mac 上 Charles 抓取 iso http、https数据包

    一.下载charles包. http://www.charlesproxy.com/download/ 选择mac版本的最新包Charles is 3.11.4. http://www.charles ...

  3. MySQL 出现You can't specify target table for update in FROM clause错误解决方法

    MySQL出现You can’t specify target table for update in FROM clause 这个错误的意思是不能在同一个sql语句中,先select同一个表的某些值 ...

  4. excel 导入mysql

    1. excel 导出csv格式,很简单导出即可 2. 使用命令行,进入mysql之后,使用命令行 tips: 删除第一行的属性名,csv后面若有空数据也可以删除,当然你不删除也没有关系,可以在mys ...

  5. python的数据结构之栈

    栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶.栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构. 由于栈具有后入先出的特点,所以任何不在栈顶的元素 ...

  6. emmet前端模板

    https://github.com/emmetio/emmet/blob/master/lib/snippets.json "emmet.extensionsPath": &qu ...

  7. cmus 命令行播放器使用

    安装 sudo eopkg it cmus 启动 cmus 设置输出 :set output_plugin=pulse 导入本地音乐 :add /home/your_username/Music 查看 ...

  8. zTree更新自定义标签>>>

    zTree>>>>>>>>>>>>>>>>>>>>>>>> ...

  9. MFC实现一元稀疏多项式运算器

    MFC实现一元稀疏多项式运算器 基本要求 输入并建立两个多项式 多项式a与b相加,建立和多项式c 多项式a与b相减,建立差多项式d 输出多项式a, b, c, d.输出格式:比如多项式a为:A(x)= ...

  10. angular 表单元素的使用总结

    工作中form表单元素最常用的是input,问题没有太多,现在总结下select ,radio组,checkbox的使用 1 select 常用的使用方式,如下 var Cityis = [{id:0 ...