哪些类型的数据库和数据最适合使用K8s?
2022-08-24 10:00:33
Kubernetes它是一种开源的容器编排解决方案,用于自动部署、扩展和管理容器化应用
哪些类型的数据库和数据最适合使用K8s?
Kubernetes它是一种开源的容器编排解决方案,用于自动部署、扩展和管理容器化应用。尽管如此。Kubernetes最初是为无状态应用编程设计的,但随着有状态工作负荷的日益流行,Kubernetes也可用于管理状态应用程序。
通常,容器是无状态的,如果容器崩溃或需要重启,容器中的信息肯定会丢失。作为一个容器编排器,Kubernetes在节点之间维持定期重启和移动容器。Kubernetes对于运行应用程序的容器来说,这是一个需要保存数据的状态工作负荷的重要问题。
数据库服务器是一个有状态的应用程序。
数据库怎么样?Kubernetes上运行?Kubernetes有机制管理此类应用程序吗?如果是这样,哪种类型的数据库和数据最适合使用?
在这篇文章中,我们将找到答案。
运行数据库的差异方式
以企业运行数据库服务器的不同方式为例:
本地自有数据库:目前,许多企业仍选择在本地或云中使用虚拟机来管理数据库服务器。公司负责设置数据库服务器,设置其安全性、安装补丁、升级、配备存储、提供可扩展性、扩展、备份和执行其他数据库管理员操作。这是最手动的方法,但它可以完全控制数据库和数据。
云代理数据库:大多数现代企业会选择AmazonRDS,Azure数据库、谷歌云数据库或Instaclustr等待更容易部署和扩展数据库服务器的解决方案。供应商负责存储、计算、网络带宽、安装、升级和可扩展性。作为消费者,公司只需要在供应商提供的案例中代管数据库,运行您选择的数据库引擎(如SQL或NoSQL)。
Kubernetes代管数据库:这种方式是上述两种方式的混合体。您可以在当地或云端运行。Kubernetes或者使用托管服务。通过这种方法,您可以使用它。Kubernetes许多优点,如自动调度、自修复或水平伸缩。但数据库的使用(如性能优化、备份和恢复)仍然需要注意,由于一些容器特性,可能会略有不同。
持久存储和K8s的其他特性
虽然开发Kubernetes其目的是管理不需要数据持久性的容器应用程序,但它现在也为管理状态应用程序提供了解决方案。(Persistentvolumes简称PV)[1]提供了一个API,允许Kubernetes管理员管理卷[2]与更多的存储类型[3]一起提供了一种安全抽象的存储和管理数据的方式。
然而,云是不可预测的,Kubernetes经常需要重启和重建pods。因此,很难在节点之间移动数据,并确保它们连接到正确的容器。更复杂的是,一些数据库需要在多节点组集中运行。
Kubernetes1.在5版[4]中引入了一些设计来帮助解决这些问题。StatefulSets[5]保证pods基于相同的容器规范,即使它们被移动到另一个节点,也保持唯一的容器规范ID。通过唯一ID将pods与长卷莲藕结合,即使再次调度,也能保持工作负荷的状态。DaemonSets[6]虽然有点复杂,但也是在集群的每个节点上运行工作副本的一种方式。
分布式状态工作负荷通常需要一系列预定义资源无法处理的复杂操作。例如,分布式数据库可能需要在数据库节点(在Kubernetes中,是一个pod)当出现故障时,执行一组特定的操作。这种操作的例子可以是选举领导、平衡数据等。
原生Kubernetes功能不能真正处理这些情况,但其自定义资源(Customresources)[7]能提供帮助。Customresources允许KubernetesAPI扩展领域的特定逻辑,定义新的资源类型和控制器[8]。Operator通过协助开发自定义解决方案,利用自定义资源管理应用程序及其部件。
OSS框架,如kubebuilder[10],或OperatorFramework[11]Operator,如PostgresOperator[12],MySQLOperatorforKubernetes[13],ElasticCloudonKubernetes(ECK)[14],或K8ssandra[15]。
分布式数据库的特性
大多数数据库引擎提供一种或多种形式来分发数据并使其可扩展。当选择需要在选择中进行时。Kubernetes运行数据库时,应考虑以下特点:
**复制:**数据库支持复制吗?如果支持,支持哪种复制(如双向复制、事务复制和快照)?这将有助于提高可靠性、容错性和可访问性。
**分块:**数据库能否在不同案例中对数据进行分区(即pod)存储不同的片段?这有助于增加冗余和分散负载。
**故障转移:**数据库能否从主节点、读写节点切换到其他只读节点,提高只读节点为主节点?这也将有助于提高可靠性、容错性和可访问性。
**可伸缩性:**数据库是否具有可伸缩性(向内扩展和向外扩展)?Kubernetes为水平扩展铺平了道路,但数据库需要根据需要添加或删除案例。这有助于处理增加的负荷或降低负荷下降时的成本。
具有这些特性的数据库(例如:MySQL,PostgreSQL,ClickHouse,Elasticsearch,MongoDB或Cassandra等)更容易应对异构云环境的不确定性。