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

随着交流机会的增多(集中在金融行业,规模都在各自领域数一数二),发现大家对 Docker + Kubernetes 的接受程度超乎想象, 并极有兴趣将这套架构应用到 RDS 领域。数据库服务的需求可以简化为:
实现数据零丢失的前提下,提供可接受的服务能力。
因此存储架构的选型至关重要。到底是选择计算存储分离还是本地存储?
本文就这个问题,从以下几点展开:

  • 回顾:计算存储分离, 本地存储优缺点
  • MySQL 基于本地存储实现数据零丢失
  • 性能对比
  • 基于 Docker + Kubernetes 的实现

来分享个人理解。

回顾:计算存储分离,本地存储优缺点

还是从计算存储分离说起。

计算存储分离

先说优点:

  • 架构清晰
  • 计算资源 / 存储资源独立扩展
  • 提升实例密度,优化硬件利用率
  • 简化实例切换流程:将有状态的数据下沉到存储层,Scheduler 调度时,无需感知计算节点的存储介质,只需调度到满足计算资源要求的 Node,数据库实例启动时,只需在分布式文件系统挂载 mapping volume 即可。可以显著的提高数据库实例的部署密度和计算资源利用率。

    以 MySQL 为例

  • 通用性更好,同时适用于 Oracle、MySQL,详见:《容器化RDS——计算存储分离架构下的"Split-Brain"》。

从部分用户的上下文来看,存在如下客观缺点:

  • 引入分布式存储,架构复杂度加大。一旦涉及到分布式存储的问题,DBA 无法闭环解决。
  • 分布式存储选型:

    选择商用,有 Storage Verdor Lock In 风险。

    选择开源,大多数用户(包括沃趣)都测试过 GlusterFS 和 Ceph,针对数据库(Sensitive Lantency)场景,性能完全无法接受。

本地存储

如果在意计算存储分离架构中提到的缺点,本地存储可以有效的打消类似顾虑,无需引入分布式存储,避免Storage Verdor Lock In 风险,所有问题都由DBA 闭环解决,但是,需要依赖数据库自有方案实现数据零丢失。

以 MySQL 为例
还会引入类似问题:

  • 物理容量受限于单机容量;
  • 调度更复杂,选定数据库实例的存储类型(比如 SSD)后,一旦该实例发生“failover”,只能调度到拥有 SSD 的物理节点,这导致调度器需要对物理节点“Physical Topology Aware”;

  • 密度难提升,这是“Physical Topology Aware”的副作用;
  • 因数据库的不同方案差异性较大,通用性无法保证。

接下来,进入正题,看一下 MySQL 基于本地存储如何实现数据库零丢失。

MySQL 基于本地存储数据零丢失

最常用的是基于 Replication 模型将数据复制到 MySQL Cluster 中所有成员。
MySQL Master-Slave Replication(类似 Oracle DataGuard)提供了基于 binlog 的数据库层的复制模型,在高并发压力下节点间同步数据速率最快,单位时间内的交易量受其他节点的影响极小,该架构可通过 vip 漂移的方式实现 “failover”。

MySQL Master-Slave Replication
但严格意义上来说,这是基于 binlog 的 Asynchronous Replication 模型,因此集群中所有成员存在数据不一致的可能,在“failover”时无法保证数据零丢失。
可见如果基于 Replication 模型,Synchronous Replication 是实现数据零丢失的前提。
传统的 Synchronous Replication 一般会采用两阶段提交或分布式锁,这会带来如下几个问题:

  • 单位时间内事务能力(TPS)会跟集群成员数量成反比
  • 增加集群成员会显著且无法预期的增加事务响应时间
  • 增加了集群成员数据复制的冲突和死锁的可能性

针对以上问题 Galera Cluster 提出 Certification-based Replication 来解决传统 Synchronous Replication 中遇到的问题,实现如下:

Deferred Update Replication 延迟更新复制
这个流程图中,有几个细节需要分享:

  • 将基于 binlog 改为基于 write-set,write-set 中包含修改的数据,Global Transaction ID(后面简称 GTID)和 Primary Key。

    GTID 类似 45eec521-2f34-11e0-0800-2a36050b826b:94530586304

    94530586304 为 64-bit 有符号整型,用来表示事务在序列中的位置

  • 将传统的 Synchronous Replication 改为 Deferred Update Replication,并将整个过程大致分解成四个阶段,本地阶段、发送阶段、验证阶段和应用阶段,其中:

    本地阶段:乐观执行,在事务 Commit 前,假设该 Transcation 在集群中复制时不会产生冲突。

    发送阶段:优化同步时间窗口,除去全局排序并获取 GTID 为同步操作,冲突验证和事务应用都为异步,极大的优化了复制效率。

    验证阶段:只有收到该事务的所有前置事务后(不能有 “hole”),该事务和所有未执行的前置事务才能并发验证,不然不能保证 Global Ordering,因此这里需要牺牲效率,引入一定的串行化。

    需要等待事务 3

于是就有了 Galera Cluster 在 MySQL 分支中的实现 MariaDB Galera Cluster(简称 MGC)和 Percona Xtradb Cluster(简称 PXC)。

为避免“split-brain”问题,需要至少三节点组成集群,对计算资源和存储资源的容量要求至少增加2倍,会进一步降低资源的部署密度。
越来越多的用户也期望通过该方案实现跨 IDC 多活,那么需要在规划阶段想清楚:
IDC 和数据库节点的拓扑架构,以保证在 1 个 IDC 出问题的情况,集群可以持续提供服务。
首先 IDC(物理或逻辑)最少需要3个,再看看数据库节点数量分别为 3、4、5、6、7 的拓扑关系 :

  • 3 数据库节点:

  • 4 数据库节点:设置权重避免”split-brain” (? + ? ) + ? + ?

  • 5 数据库节点:

  • 6 数据库节点:

  • 7 数据库节点 : 可支持两种拓扑关系

同时,还有 MySQL Group www.taohuayuan178.com  Replication(简称 MGR)[1],类似 Galera Cluster:

  • 基于Corosync实现(Totem协议),插件式安装,MySQL 官方原生插件。
  • 集群架构,支持多写(建议单写)
  • 允许少数节点故障,同步延迟较小,保证强一致,数据零丢失
  • 单位时间的交易量受 flow control 影响。

这里还需要提一下 Vitess:

  • 该项目由 Youtube 开源,从文档看功能极为强大,高度产品化。
  • 作为第二个存储类项目(第一个是 Rook,有意思是存储类而不是数据库类)加入 CNCF,目前还处于孵化阶段(incubation-level)。
  • 笔者没有使用经验,也不知道国内有哪些用户,不做评论。

关于 MGR 和 Vitess 网上已有大量介绍,这里不再赘述。

性能对比

在数据零丢失的前提下,看看这几种架构在性能上的对比:

  • MGR 5.7.17 / PXC 5.7.14-26.17
  • MGR 5.7.17 / PXC 5.7.17-29.20 www.wanmeiyuele.cn/ MariaDB 10.2.5 RC
  • 本地存储 / 计算存储分离

性能对比 1:MGR 5.7.17 / PXC 5.7.14-26.17

测试背景描述:

  • MGR 5.7.17 对比 PXC 5.7.14-26.17(基于 Galera 3实现)
  • 负载模型:OLTP Read/Write (RW)
  • durability:sync_binlog=1,innodb_flush_log_at_trx_commit=1
  • non-durability:sync_binlog=0,innodb_flush_log_at_trx_commit=2

测试数据 :

来自于 MySQL 官方[2]
测试结果:
在设置 durability 的情况下,MGR 最大吞吐约是PXC 5.7.14-26.17(基于 Galera 3 实现)的3倍,优势明显。
以上数据来自于MySQL 官方,公平起见,再来看看 Percona 在相同负载模型下的测试数据。

性能对比 2:MGR 5.7.17 /www.micheng178.com  PXC 5.7.www.hbs90.cn/

测试背景描述:

  • 增加了 MariaDB 参与对比
  • PXC 升级到 5.7.17-29.20,该版本改进了MySQL write-set 复制层性能[3]。
  • 负载模型:依然使用 OLTP www.365soke.cn Read/Write (RW)
  • durability:sync_binlog=1
  • non-durability:sync_binlog=0

测试数据:

设置 durability,数据来自于 Percona[3]

设置 non-durability,数据来自于 Percona[3]
测试结果:
在负载模型相同的情况下(durability 和 non-durability)PXC 5.7.17-29.20 性能与 MGR 5.7.17 不分伯仲。如果使用 PXC,推荐使用 5.7.17-29.20 或以上版本。

性能对比3:本地存储 / 计算存储分离

为了对比本地存储和计算存储分离,专门使用 MGR + 本地存储架构和 基于分布式存储的计算存储分离架构做性能对比。
测试结果:
在负载模型相同的情况下,前者比后者 OLTP 下降32.12%,Select 下降5.44%,Update 下降 24.18%,Insert 下降 58.18%,Delete 下降 11.44%。
详细内容可留意 @波多野 同学 和 @韩杰 同学的测试报告,这里不再赘述。

基于 Docker + Kubernetes 的实现

Docker + Kubernetes + MGR / Galera Cluster

在 GitHub 上,可以看到基于 Docker + Kuberetes + PXC 的 demo[4]。需要说明的是,这仅仅是个玩具,离部署到生产环境还有极大差距。
我们已有计划实现满足生产环境的:

  • Docker + Kubernetes + PXC
  • Docker + Kubernetes + MGC
  • Docker + Kubernetes + MGR

并集成到 QFusion 来支持计算存储分离架构和本地存储架构混合部署,架构示意图如下:

目前原型验证阶段已通过,预计2018年Q2发布。

Docker + Kubernetes + Vitess

在 GitHub 上,同样可以看到基于 Docker + Kubernetes 的 demo[5],有兴趣的同学可以玩一下。
性能只是选型需要考量的一部分,要使用到生产环境或者产品化,实际要考量的因素更多:

  • 运维:部署、备份
  • 弹性:计算存储扩容,集群扩容
  • 高可用:比如 “failover” 的细微差别对业务的影响
  • 容错:比如网络对集群的影响,尤其是在网络抖动或有明显延时的情况下
  • 社区活跃度
  • ……

以现有软硬件的开放程度,各种架构或者产品狭义上的“黑科技”并不多,常常看到的:『xxx 比 xxx 快 xxx 倍』严格来说应该是『xxx 比 xxx 在特定场景 xxx 下快 xxx 倍』。并不存在“一枪毙命”的“Silver Bullet”,只是 Docker + Kubernetes 为混合部署带来可能。哪种更受青睐,拭目以待,用户会是最好的老师。

《人月神话》中提到“No Silver Bullet”,原意是用来论述软件工程领域的生产力问题。
由于软件的复杂性本质,使得真正的银弹并不存在,没有任何一项技术或方法可使软件工程的生产力在十年内提高十倍。

相关链接

    1. https://dev.mysql.com/doc/refman/5.7/en/group-replication-background.html
    2. http://mysqlhighavailability.com/performance-evaluation-mysql-5-7-group-replication/
    3. https://www.percona.com/blog/2017/04/19/performance-improvements-percona-xtradb-cluster-5-7-17/
    4. https://github.com/kubernetes/kubernetes/tree/master/examples/storage/mysql-galera
    5. https://github.com/kubernetes/kubernetes/tree/master/examples/storage/vitess

原文地址:https://www.cnblogs.com/qwangxiao/p/8735187.html

时间: 2024-08-26 17:19:14

容器化RDS|计算存储分离 or 本地存储?的相关文章

(尚030)Vue_案例_存储数据(localStorage本地存储技术)

当刷新页面时,会变为原来的状态 1.问题:当我刷新是不希望改变原来状态 需要缓存我当前的数据 2.究竟是缓存在内存里还是在文件里??? 缓存在文件里,因为浏览器关闭了,内存就没了;而我们需要重新打开浏览器状态还在 可以用localStorage这种本地技术(本质是缓存在文件里) 3.存储带来的问题 什么时候存?什么时候读?存啥东西进去? 界面显示是根据todos显示的,所以需要将todos存起来; 我随便做任何操作后,都是我最后的状态,也就是只要我的界面发生改变就需要存(todos改变就要存)

边缘计算容器化是否有必要?

简要 由于容器有轻量级.安全性.秒级启动等优秀的特性,容器天然的轻量化和可移植性,非常适合边缘计算的场景,这一点边缘计算的厂家和开发者们都心知肚明.而且鉴于K8S已经成为云原生编排的事实标准,因此携手K8S进入边缘将很有可能结束边缘计算当前混沌的状态,并定义云端和边缘统一的应用部署和管理的标准. Kubernetes 的优势与挑战 Kube+Edge就是依托K8S的容器编排和调度能力,实现云边协同.计算下沉.海量设备的平滑接入.Kube+Edge架构上包含两部分,分别是云端和边缘侧.云端负责应用

H5本地存储(转)

H5本地存储 一.本地存储由来的背景 众所周知Html4时代Cookie的大小.格式.存储数据格式等限制,网站应用如果想在浏览器端存储用户的部分信息,那么只能借助于Cookie.但是Cookie的这些限制,也就导致了Cookie只能存储一些ID之类的标识符等简单的数据,复杂的数据就更别扯了. 下面是Cookie的限制: 关闭浏览器再打开可读到 1, 大多数浏览器支持最大为 4096 字节的 Cookie. 2, 浏览器还限制站点可以在用户计算机上存储的 Cookie 的数量.大多数浏览器只允许每

HTML5 学习笔记(三)——本地存储

目录 一.HTML4客户端存储 1.1.提交表单发送到服务器的信息 1.2.客户端本地存储概要 二.localStorage 2.1.添加 2.2.取值 2.3.修改 2.4.删除 2.5.跨页面与跨域 2.6.存储位置与SQLite 2.7.用途.练习与兼容性 三.sessionStorage 3.1.sessionStorage使用 3.2.Web本地存储事件监听 3.3.cookie.sessionStorage.localStorage比较 四.Web SQL Database 4.1.

常用的本地存储-----cookie篇

1.引言 随着浏览器的处理能力不断增强,越来越多的网站开始考虑将数据存储在「客户端」,那么久不得不谈本地存储了. 本地存储的好处: 一是避免取回数据前页面一片空白,如果不需要最新数据也可以减少向服务器的请求次数,从而减少用户等待从服务端获取数据的时间. 二是网络状态不佳时仍可以显示离线数据. 2.本地存储 用chrome浏览器打开一个网页,F12进入开发者模式,点击Application,我们可以看到: 以上的Local Stroage . Session Stroage . IndexedDB

Web端本地存储

1.需求背景:当用户在页面上添加一行一行的数据时,突然发现网络断掉了,页面上编辑的数据没法保存进数据库,所以需要一个本地端的临时保存功能,以便在网络通畅后重新加载出来! 2.解决方案: 结合网上搜刮,考虑到了这几种方式:1)采用cookie; 2)看能不能采用浏览器的页面缓存来模拟 3)使用html5 1)cookie使用(做测试是直接用浏览器打开没有效果,需要放到站点下) 所有浏览器都支持,所以不需要去考虑兼容性的问题; 浏览器对于同一domain最多支持20个左右cookie,每个cooki

cookie本地存储

本地存储 所谓的本地存储,其实就是把一些信息,存储到客户端版本地,存储的信息不会因为页面的跳转或关闭而消失,这样就可以实现很多功能需求了. 特点 虽然是存储到本地了,但是有浏览器中间的访问限制,例如:谷歌下存储的信息在IE中访问不到 还会存在域名和域名之间的访问限制,例如:在谷歌下访问京东,存储了京东的客户信息,当我们用谷歌浏览器打开了百度,百度是无法获取原来在京东下存储的本地信息的 本地存储应用的案例: 登录的时候,记住用户名和密码,其实就是把信息存储到客户端本地,下一次再打开页面的时候,直接

基于easyui的本地存储(web storage)

Web Storage是HTML5引入的一个非常重要的功能,可以在客户端本地存储数据,类似HTML4的cookie,但可实现功能要比cookie强大的多,cookie大小被限制在4KB,Web Storage官方建议为每个网站5MB. Web Storage又分为两种: sessionStorage localStorage 从字面意思就可以很清楚的看出来,sessionStorage将数据保存在session中,浏览器关闭也就没了:而localStorage则一直将数据保存在客户端本地: 不管

HTML5系列三(多媒体播放、本地存储、本地数据库、离线应用)

各浏览器对编码格式的支持情况 audio和video元素的属性介绍 1.src:媒体数据的URL地址 <video src="pr6.mp4"></video> <video src="pr6.mp4" width="320" height="240"></video> 2.autoplay:是否自动播放 <video src="pr6.mp4" aut