草庐IT

翻译 | Kubernetes Operator 对数据库的重要性

RadonDB开源社区 2023-03-28 原文

作者:Stephen Thorn

翻译:刘玲玲

原文:https://www.percona.com/blog/2020/10/08/the-criticality-of-a-kubernetes-operator-for-databases/

一些刚接触 Kubernetes 的公司尝试使用传统环境中运行数据库的方法在 Kubernetes 中运行数据库。但是,不建议这样做。因为这可能会导致数据丢失,并且也不建议这样管理生产工作负载。为什么这样做很危险?又如何解决这个问题?

适合 Kubernetes 的工作负载

在考虑将数据库迁移到 Kubernetes 之前,请确保应用程序的其余部分是云原生的,并可以使用 Kubernetes。如果您已经开始对数据库进行垂直弹性伸缩和水平弹性伸缩,并需要编排数据库来控制成本,将其迁移至 Kubernetes 上就是个不错的选择。

将数据库工作负载转移到 Kubernetes 上有两个理想的使用场景:微服务和统一抽象层。‍

庞大的单一数据集可能会阻碍发挥 Kubernetes 的一些优点:自修复和高可用性。这可能是一个问题,因为在加入数据库集群时,需要耗费时间将数据物理传输到新 Pod 实例上。如果数据集太大,由于物理限制,这个过程会很慢,并影响性能和数据库的可用性。而微服务就非常合适,因为它的数据集相对较小,使得 Kubernetes 能很好地进行自动化处理。

希望充分利用云原生应用程序和数据库的公司也非常适合 Kubernetes。如果想利用统一抽象层在任何地方部署和运行数据库,Kubernetes 是一个很好的选择。可以将数据库移动到任何运行着 Kubernetes 的地方。

我们对大型非分片数据集以及 Kubernetes 在处理这些数据集时的局限性进行了讨论,但我们还应该看看什么样的工作负载更适合传统平台。对吞吐量比较敏感的应用程序在 Kubernetes 上表现可能没有那么好,或者不是很划算。Kubernetes 基本是为容器编排而设计的,而不是为需要极低延迟的高性能数据库而设计的。也许这能够实现,但代价是什么呢?对于高性能的分布式数据库也同样如此。

如何看待 Pod?

Pets 和 Cattle 是 DevOps 中的一对概念。Pets 表示在出现问题时需要关注单个服务器的部署方式,Cattle 表示在出现问题时用副本替换服务器的能力。在 Kubernetes 的运作方式中,当出现应用程序无法控制的因素时,可以在任何时候销毁、创建或移动 Pod。Kubernetes 使用一个调度程序(scheduler),它可以销毁和重建 Pod,以满足您的 Kubernetes 集群配置需求。

这对于无状态应用程序非常有用,因为应用程序中的任何失败都将导致包含应用程序的 Pod 被销毁和重新创建,而不需要人工交互,并极大地加快了问题的解决。这对于数据库来说并不理想,因为我们不希望数据库突然停止工作,并造成数据丢失或损坏。Kubernetes 可以使用 StatefulSet 提供持久标识符来帮助解决这个问题。这有利于管理有状态工作负载,但是要如何发挥高可用性和利用 Kubernetes 的自动化优势呢?

如何看待数据库?

从设计上讲,数据库需要保持其身份、信息,最重要的是,数据在任何时候都是安全和可访问的。数据库是应用程序的支柱,因为它们是应用程序正常运行所依赖的真实数据来源。数据库操作中的任何错误都将迅速导致应用程序无法运行。简单来说,数据库很重要。

我们如何在 Kubernetes 中安全地运行数据库,并确保数据库部署是高可用的?

通过使用 StatefulSet 和持久卷(Persistent Volume),可以保持数据的完整性,但是我们还需要另外的工具来承担数据库管理任务,例如确保故障转移、恢复数据库成员、重新加入高可用架构以及其他特定技术功能。幸运的是,Kubernetes 是可扩展的,并且拥有 Operator,用于自动执行管理服务的关键任务。

自动化,自动化,自动化

我们了解了在 Kubernetes 中安全运行数据库的复杂性,以及一些用来帮助弥合自动化和传统人工在功能之间差距的概念。在一些数据库 Operator 的帮助下,我们可以按照预期的方式安全地运行数据库。这些 Operator 能够将一些通常由数据库管理员完成的任务自动化执行,例如:

  • 自动部署,严格的一致性,无单点故障
  • 自动伸缩,通过更改 size 参数添加或删除集群或 ReplicaSet 成员
  • 自动备份和恢复
  • 自动修复,从单个集群或 ReplicaSet 成员的故障中自动恢复
  • 自动管理密码轮换系统用户
  • 简化更新

总结

由于运行数据库环境的复杂性和对高可用的要求,以及动态 Kubernetes 环境带来的风险,强烈建议在 Kubernetes 中部署数据库时,使用 Operator 来实现。

欢迎使用 RadonDB MySQL Kubernetes 一款高可用 MySQL 集群 Operator!

有关翻译 | Kubernetes Operator 对数据库的重要性的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  3. ruby - Rails -- :id attribute? 所需的数据库索引 - 2

    因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration

  4. ruby-on-rails - 如何让 datamapper 与 postgresql 数据库一起工作? - 2

    我已经找到了几个使用datamapper的示例,并且能够让它们正常工作。不过,所有这些示例都是针对sqlite数据库的。我正在尝试将数据映射器与postgresql一起使用。我将datamapper中的调用从sqlite3更改为postgres,并且我已经安装了dm-postgres-adapter。但它仍然不起作用。我还需要做什么? 最佳答案 与SQLite不同,PostgreSQL不将数据库存储在单个文件中。在你拥有createdyourdatabase之后,尝试这样的事情:DataMapper.setup:default,{:

  5. ruby-on-rails - rails 多态关联(遗留数据库) - 2

    我使用的是遗留数据库,所以我无法控制数据模型。他们使用了很多多态链接/连接表,就像这样createtableperson(per_ident,name,...)createtableperson_links(per_ident,obj_name,obj_r_ident)createtablereport(rep_ident,name,...)其中obj_name是表名,obj_r_ident是标识符。因此链接的报告将按如下方式插入:insertintoperson(1,...)insertintoreport(1,...)insertintoreport(2,...)insertint

  6. ruby-on-rails - 在现有数据库上进行 Rails 迁移 - 2

    我正在创建一个新的Rails3.1应用程序。我希望这个新应用程序重用现有数据库(由以前的Rails2应用程序创建)。我创建了新的应用程序定义模型,它重用了数据库中的一些现有数据。在开发和测试阶段,一切正常,因为它在干净的表数据库上运行,但是当尝试部署到生产环境时,我收到如下消息:PGError:ERROR:column"email"ofrelation"users"alreadyexists***[err::localhost]:ALTERTABLE"users"ADDCOLUMN"email"charactervarying(255)DEFAULT''NOTNULL但是我在迁移中有这

  7. ruby-on-rails - 在不重新查询数据库的情况下重新排序 Rails 中的事件记录? - 2

    例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果

  8. ruby - Google-api-ruby-client 翻译 API 示例 - 2

    很高兴看到google代码:google-api-ruby-client项目,因为这对我来说意味着Ruby人员可以使用GoogleAPI-s来完善代码。虽然我现在很困惑,因为给出的唯一示例使用Buzz,并且根据我的实验,Google翻译(v2)api的行为必须与google-api-ruby-client中的Buzz完全不同。.我对“Explorer”演示示例很感兴趣——但据我所知,它并不是一个探索器。它所做的只是调用一个Buzz服务,然后浏览它已经知道的关于Buzz服务的事情。对我来说,Explorer应该让您“发现”所公开的服务和方法/功能,而不一定已经知道它们。我很想听听使用这个

  9. ruby-on-rails - 如何在 Ruby on Rails 中将数组持久保存到数据库? - 2

    我正在尝试将一个数组的数组保存到我在Rails中的SQLite数据库中。现在,我有一个可以容纳这样一个数组的对象,并且实例似乎可以毫无问题地保存。但是,它显然没有保存到数据库中——当我在与创建数组的View不同的View中调用My_Object.array上的函数时,结果为nil并且不起作用。例如:classMy_Object当我调用My_Object.new(:array=>[[1,2,3],[4,5,6]])时,一切似乎都正常工作,但我不能在其他任何地方访问:array属性,结果都是nil。有什么想法吗? 最佳答案 首先在您的表

  10. ruby - 如何断开现有的 ruby​​ 续集与数据库的连接? - 2

    我的意思是之前建立的那个DB=Sequel.sqlite('my_blog.db')或DB=Sequel.connect('postgres://user:password@localhost/my_db')或DB=Sequel.postgres('my_db',:user=>'user',:password=>'password',:host=>'localhost')等等。Sequel::Database类没有名为“disconnect”的公共(public)实例方法,尽管它有一个“connect”。也许有人已经遇到过这个问题。我将不胜感激。 最佳答案

随机推荐