哪些实践或工具可以实现数据库的连续部署?


17

与尝试对数据库(尤其是RDBMS)使用相同的方法相比,连续交付或持续部署基础结构和代码相对简单。部署完成后,代码和基础架构将不会更改或发展。但是,如果数据库不是架构固有的可变组件,则将向数据库中添加新数据,从而构成数据。

我知道有一些做法,例如仅添加数据库对象(即表和列),从不修改或删除它们-这种纯粹的累加方式来处理数据库架构,具有确保架构向后兼容的优势,但代价是顺序复杂一些模式。

同样,还有诸如FlywayReady Roll之类的产品,它们可以帮助编写要在模式版本之间编写的迁移。

当前存在哪些其他实践和工具可以将数据库架构连续部署到关注数据完整性的生产环境中?


如果访问数据库的代码未更改,为什么需要更改数据库架构或进行迁移?(假设没有手动的数据库访问
权限

嘿@DanCornilescu,添加“索引”以减少/解决性能问题怎么样?
Pierre.Vriens

坦率地说,我对传统DB知之甚少-这个问题很可能适用于它们的索引。我正在使用Google的云数据存储,其更改索引通常也随应用程序代码更改一起出现。我的评论是一个诚实的问题,绝不是关于理查德问题(我赞成)的任何“抱怨”。
Dan Cornilescu

@DanCornilescu我也(诚实地)相信您在先前评论中写的内容(而我先前的评论只是试图在您的第一评论中提供对该问题的可能答案)。下一个(真实的)问题?
Pierre.Vriens

您可能会发现有趣的迁飞flywaydb.org
托尔比约恩Ravn的安徒生

Answers:



11

挑战


我知道有一些做法,例如仅添加数据库对象,即表和列,从不修改或删除它们

在我工作过的一家公司中,原始数据的滚动窗口大约相当于6个月,占用了10 TB的数据。然后将数据处理为RDBMS格式,该格式花费6 TB的可用数据,约占10年的可报告数据。关键是,大规模的实践根本不可行。存储很昂贵-可能是最大的计算费用。这提供了几个有趣的挑战:

  1. 备份 -innodb插件很棒,而且很不错,但是备份这么多数据的时间并不实用
  2. 还原时间 -对于大型数据集-特别是如果您需要复制以在还原后恢复到正常运行状态后可能需要几天甚至几周的时间才能赶上
  3. 创建/播种新实例 -您在开发/测试中可能要做的工作通常涉及数据集上的ETL(提取,转换和加载)作业。这些需要使用质量检查测试单元进行验证,但这需要以非破坏性的方式进行,以便保留原始生产数据集。在发生灾难时,您可能会愿意花较长的时间进行恢复,但要了解备份是一种保险政策,并且其目的是避免备份,DevOps开发工作流程实质上要求您能够执行恢复或恢复。定期(可能一天多次)复制数据
  4. 容量 -按照我刚才描述的规模存储大量数据可能会占用大量I / O。您不仅需要解决1-3中描述的问题,而且还需要以不导致生产系统停机或性能下降的方式进行。

尽管在较小规模上可能不需要考虑上述因素,但在较大规模上,这些成为巨大的问题。这意味着定义需求并预测数据集的大小非常重要

定义要求


因此,您需要定义几个需求:

  1. RTO-备份的RTO或还原时间目标是数据库备份解决方案的最重要驱动程序之一。虽然一开始它似乎与大多数其他问题都不相关,但是当您询问“如果我使用备份解决方案创建或播种新实例该怎么办?”时,它变得极为相关。在下一节中,我将介绍一些这样做的技术。
  2. RPO-备份的RPO或还原点目标定义了A)您可以还原的时间(分钟,小时,天,周,月或年)B)不同级别的备份间隔和C)您可以还原的粒度。例如,对于电子邮件数据库,通常需要消息级别备份(还原特定的电子邮件)。同样,您可能会发现几天内的数据完全没有用,因此一年再恢复也没有意义。
  3. 数据集的大小 -这很重要,因为对于1MB的数据库,大多数备份产品和解决方案都可以实现RTO。但是,对于10TB数据库,您会发现到LTO 3磁带的完整,行级备份可能无法实现RTO,并且可能会干扰RPO,因为备份开始超出您的备份窗口。您不能只对如此大的数据集进行mysqldump,但可能可以避免在1MB数据库上进行。
  4. 数据库一致性 -使用数据库时,在持续部署,站点可靠性,可伸缩性和高可用性方面产生巨大差异的最后一件事是您对一致性的需求(或缺乏一致性)。共有三种基本类型:即时一致性,即时(JIT)一致性和最终一致性

除了上述主要考虑因素之外,您还需要考虑许可和支持要求(开源或封闭源;内部支持,第三方支持或供应商支持)应用程序/语言要求(许多数据库的连接器可能很重要;您的应用已编译?您可以访问源代码吗?您可以重新编译它,或者由供应商提供吗?或者它以解释语言运行?)政治要求(您的组织仅信任Oracle吗?他们讨厌oracle吗?他们不信任MySql吗?您对MariaDB或Postgres感觉如何?对数据库引擎(innoDB,MyISAM,Blackhole,NDB集群或Spider)有什么看法,以及对历史或兼容性的要求(我们使用PL / SQL长达数年半的代码)是内置在Oracle引擎中的!我们怎么能移植到MariaDB?!?)

所有这些事情(显着)都会影响您可用的工具。

内部数据管理的一些选项


注意:以下内容并非详尽无遗,其他SE用户也应附上其他建议。

出于对通用考虑的考虑,让我为您提供一些解决上述问题的技术。首先,问问自己是否真的需要使用RDBMS,或者是否可以选择使用诸如Hadoop,CouchDB甚至面向对象存储(如swift)之类的非结构化数据。

其次,考虑研究基于云的解决方案。这将一些令人头疼的事情外包了,并将复杂的问题留给了高素质(和有偿)的个人。但是,从规模上看,您会发现这确实会消耗您的预算(云提供商确实会从中获利,并且在一定规模上,您只能自己聘请这些专家,),或者如果您在特定的安全或政治环境下工作需求(阅读:我们不能做云)考虑混合NFS / FibreChannel Filer。这些文件管理器中的大多数文件管理器(例如NetApp,Pure Storage和Tegile的文件管理器)都支持基于增量的快照和克隆技术,对于A)进行备份,B)恢复备份和C)播种新备份非常有用。

在这一点上,我需要指出的是,我不是备份和存储专家,因此在继续研究其他问题(和更绿色的牧场)之前,这个问题的某些部分是我无法完全解决的。

话虽这么说,这些产品使您可以在数据库下方拍摄差异快照。您将需要在一个数据库实例(建议使用只读从属服务器)上编写完整的“具有读取锁定的锁定表”,并转储您的binlog位置或GTID,但是对于这些文件管理器,您将能够使用这些快照来创建数据库的新实例。您将需要将binlog放在单独的分区上,而仅将数据库数据放在这些分区上。完成后,您将能够克隆这些分区(在NetApps上,这称为“ FlexClone

这是因为对于每个读取的块,文件管理器都必须确定数据是驻留在冻结的原始快照中还是驻留在增量中。对于具有多个快照的卷/存储,可能需要多次检查。您可以通过刷新数据(意味着丢弃快照并定期对其进行克隆-对于良好的连续部署环境可能自然而自然地发生)来解决此问题,或者通过永久拆分卷(在NetApp术语中称为“ Flex Split”) ),这将需要一些时间来永久解决增量问题,并创建一个全新的独立卷。

这些增量克隆具有减少总体存储需求的额外好处-您可以产生多个克隆或生产数据库数据实例来进行开发,测试和验证。如果仅保留大型数据集的一个副本以及较小的增量(可能是小型增量),则可以降低总体存储成本和占地面积。

这里唯一的技巧是,由于“备份”仍驻留在文件管理器中,因此这可能无法构成完整的备份解决方案。为此,您可能需要使用NetApp称为Snap Mirror的东西,该文件将在文件管理器甚至数据中心之间镜像数据(使用rsync风格的技术),或者使用某种类型的集成备份解决方案,该解决方案可以将一个增量快照或一个快照备份到磁带上。弹性克隆。

但是,这有一个主要缺陷:您的所有数据-开发人员,测试人员和生产人员仍在同一文件管理器和存储头上使用I / O。要解决此问题,请考虑在第二个文件管理器上创建一个从数据库实例,这可以成为您测试和/或开发文件管理器的种子点,或者考虑为应用程序层使用负载平衡器/应用程序交付控制器将生产请求镜像到您的测试(和/或开发)环境。这样做还有一个好处,那就是在将产品流量投放到QA /测试环境之前,先针对可能不会立即注意到的问题进行生产,然后再推广到生产环境。然后,您可以根据生产流量和用户行为检查日志中是否存在错误。

然后,这应该允许您使用一些脚本以编程方式生成和销毁整个(大型)数据集,以用于连续部署方法。

可扩展性和高可用性

当您询问连续部署时,DevOps 不仅考虑了连续部署-因此,我将介绍一些有关冗余,可伸缩性和高可用性的信息。

我提到了JIT,即刻和最终的一致性。这就是各种RDBMS引擎的用武之地。只需配置循环异步复制,最终一致性就相对容易了。但是,这可能会导致一些冲突*(如果您的应用程序层在复制完成之前在集群的一侧和集群的另一侧更新数据,该怎么办?)要立即保持一致性,请查看将强制同步复制的Galera集群,但是导致可伸缩性问题(如何将其复制到灾难恢复站点或在地理位置上进行负载平衡,而又不会由于网络层的传播延迟而导致明显的延迟?)您还可以查看是否可以在数据中心内进行同步复制以及在站点之间进行异步复制,但这似乎是两全其美。

但是,通常,大多数人并不需要完全同步复制- 通常仅在非常特殊(且非常特殊)的高写入环境中需要这种复制,而表分片需要多主机。大多数应用程序可以使用数据库代理来处理即时一致性。例如,ScaleArc将监视复制状态并跟踪刚刚写入的位置(发送后续的读取请求,直到复制赶上),以提供及时的一致性和外观数据库一致性。ScaleArc与Postgres,MySQL,MariaDB,Oracle和MSSQL兼容,并且可以使用正则表达式对无法使用分片键的应用程序进行数据库分片/分区。它还具有强大的REST API,供您的配置管理软件与之交互-他们的支持团队非常出色

同样,您可能希望考虑由MariaDB团队为MariaDB开发的免费替代产品MaxScale。但是,它缺少GUI和ScaleArc的某些缓存功能。

最后,MySQL架构(如果可以承受那么多的RAM,则只有RAM中的MySQL群集)是其他潜力-尤其是MySQL的新代理。这可以为您的环境提供可伸缩性和冗余组件。

Postgres和Oracle应该具有所需的复制和分片功能,但如果需要代理,ScaleArc可以很好地配对。

最终,如果您不能简单地使用基于云的环境并让您的云提供商为您解决上述问题,那么所有这些因素加在一起便构成了一个高度适合连续部署和开发的环境。


6

我们在工作中使用Flyway来管理应用程序中的Postgres架构,并使用Pillar来管理Cassandra架构。我们发现,如果应用程序管理自己的架构是最好的。

在应用程序管理自己的模式之前,我们曾拥有过管理模式,这让我们感到非常恐怖。


6

我认为,除非您将架构责任转移给应用程序团队,否则仅靠工具本身并不会真正有帮助。

我们确实使用liquibase飞行用在工作中,其中应用程序团队负责创建变更集。

与此同时,您可以避免纯粹的累加方式。
要求每个应用程序都与其先前版本兼容,当必须进行模式更改时,应用程序将在模式中集成新列,对其进行写入,并且仍然可以从前一列读取和写入(允许以前的版本仍具有相同的数据)。
允许该应用程序的下一版本停止更新旧列,并且仅允许第三版本删除当前未使用的列。

显然,如果出现问题,需要定期备份。
适当的数据子集可能会在集成测试中产生问题,以避免在生产中出现问题,这也是一个好主意。理想情况是获取生产数据的匿名子集。


4

我们在工作中使用liquibase为此我会高度评价。我们的质量检查工具QASymphony也使用它。

我们在内部针对MSSQL和Oracle数据库使用它,而QASymphony在postgres + mysql实例中都使用/使用了它。


4

要在大型机环境的上下文中并且特定于DB2®数据库来回答这个问题,通常有两种常用的(不便宜的...)替代方法可供选择:

  • BMC的DB2®对象管理。以下是有关它的一些详细信息(链接页面中的引用):

    对数据库中的对象进行更改,甚至只是执行日常管理任务,都是艰巨而危险的工作。有许多任务需要跟踪,一个失误可能会对可用性和数据完整性造成灾难性的影响。您可以使用BMC Object Administration for DB2 11减少工作量和风险,这是一组可帮助您的工具:

    • 减少管理复杂且分散的DB2环境所需的时间。
    • 在整个应用程序生命周期中使例行任务自动化,以提高完整性。
    • 通过简化的DB2目录导航和变更管理提高生产力。
    • 通过以最少的中断执行更改和维护来增强应用程序的可用性。
  • IBM的z / OS版DB2管理工具

    它简化了与安全管理整个应用程序生命周期中的DB2对象和模式相关的复杂任务,同时对可用性的影响最小。

    • 允许用户快速轻松地浏览DB2目录
    • 在不知道确切的SQL语法的情况下生成和执行动态SQL语句
    • 在执行之前管理和跟踪对DB2对象定义所做的更改,以解决任何潜在的冲突
    • 帮助构建DB2命令以针对数据库和表执行
    • 使用户能够创建,更改,迁移,删除和反向工程DB2对象
    • 生成并执行实用程序作业,使用户可以利用LISTDEF和模板来提高生产率

与SCM工具集成

不久前,我受到客户的挑战,要在他们的SCM生命周期(由SERENA ChangeMan ZMF管理)中实际“集成” BMC替代品。这种集成背后的想法是“将我们的DB2 DBA团队(使用DDL进行处理)视为开发团队的特例,不小心使用了一些特殊的编辑器(BMC工具)来生成要迁移的代码(DDL) ”。

关于此集成的唯一(但真正的!)挑战是也要促进“可重新启动性”,这是这种DBA工具的主要优点之一:

  • 可重新启动性意味着,当此DBA工具执行其工作时(根据需要完成的工作的性质,有时需要长时间运行的工作),可能会发生意外事件(死锁,时间浪费等)。

  • 如果发生任何这些事情,并且您不想从备份中重新启动(在开始之前),那么DBA工具希望您从错误开始的(检查)点(以及从哪里开始)重新启动。您希望一切都重新执行)。

  • 更好的是(或者我应该说“甚至更糟”?),如果DBA工具的新手并不真正知道如何从这样的检查点重新启动,而只是再次尝试(从头开始),那么DBA工具将完全失败出现某种用户错误。并带有诸如“ 直到您告诉我您要我在最后一个失败点之后如何继续前进之前,我拒绝做任何事情(以免使事情变得更糟) ” 的指示。

  • 最后,要在正在使用的SCM工具中实现这种可重新启动性的真正线索,还需要对SCM工具进行调整。实际上是允许它用于重新启动失败的SCM程序(通常与重新交付到目标测试/产品环境有关)...而不是仅仅重新提交失败的SCM程序(这是那些SCM工具通常从这种情况下恢复的方式) )。

奖励:BMC替代品的SCM集成完成后,客户决定将其DBA工具更改为IBM替代品。即使这两种选择看起来并不完全相同,但它对SCM集成的影响却很小:仅需替换(在某些可重用的SCM定制中)对BMC替代的某些调用,就相当于对IBM的调用。替代方案...(使用DevOps术语)由 /

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.