容灾恢复是绝大多数企业级应用的基本要求
在没有Kubernetes也没有容器的时候,备份和恢复解决方案通常在虚拟机(VM)级别上实现。当应用程序在单个VM上运行时,容灾系统适用于这样的传统应用程序。但是,当使用Kubernetes对应用程序进行容器化管理时,这样的容灾系统就无法使用了。有效的Kubernetes容灾恢复方案必须针对容器化架构进行重新设计,并按Kubernetes的原生方式来运行。
传统的基于VM的备份和恢复解决方案,使用快照来收集数据,但这些数据对于某个具体容器化应用并不足够。因为任何一个特定的VM都将包含来自多个应用的数据。如果您尝试通过VM快照来备份APP 1,将会同时获取其他应用的多余数据。但这些数据从容器角度来看又不够:APP 1可能还会将数据存储在其他VM上。因此通过对某个单独VM的快照无法捕获所有APP1的数据。
基于分布式体系结构的现代应用需要的容灾方案,需要能够找到特定应用的所有相关数据和配置信息,并能够以零RPO(Recovery Point Objective,复原点目标)和接近零RTO(Recovery Time Object,复原时间目标)的方式进行恢复。
一个有效的Kubernetes容灾解决方案需要具备:
- 容器粒度的控制
- 能够备份数据和配置
- Kubernetes命名空间感知
- 针对多云和混合云架构的优化
- 保持应用的一致性
容灾解决方案必须满足以上五个标准,才能确保Kubernetes上运行的含大量数据的应用程序在容灾恢复的时候,满足服务水平协议(SLA)或相关法律要求。
让我们分析一下为什么这五个标准都很重要。
容器粒度控制
容器粒度控制容灾方案意味着用户可以备份特定的Pod或Pod组,而不是备份整个VM或服务器。这使得用户可以仅快照属于该应用程序的容器。
假设您有一个三节点Kubernetes集群,其中有一个三节点Cassandra环和三个单节点PostgreSQL数据库,分布在三个虚拟机上。使用传统的灾难恢复解决方案,备份群集的唯一方法是备份三个虚拟机。这将导致提取,转换和加载过程带来的复杂性增加,存储成本增加和RTO增加。备份充足数据的唯一方法是备份超出必要数据的更多数据。
使用容器粒度的方式,可以在三个VM上仅备份一个PostgreSQL数据库或三节点Cassandra环,而无需其他任何备份。
Kubernetes命名空间感知
传统的备份和恢复解决方案不是以Kubernetes的方式进行的。
Kubernetes中的命名空间通常运行多个相关的应用程序。例如,企业Kubernetes部署中的一种常见模式是使公司/部门所有的应用都运行在同一个命名空间内。在这种情况下,通常有必要一起备份Kubernetes命名空间中的所有应用程序。
但是,像每个单独的应用一样,命名空间分布在许多虚拟机上。每个虚拟机可能还有来自几个不同命名空间的Pod。如果没有支持命名空间的容灾解决方案,则完全备份将需要备份和存储远远超出必要的数据。即使采用了这种过分的备份策略,在发生故障的情况下也很难还原整个命名空间,从而导致较高的RTO。
应用的一致性
即使您想通过备份系统中的所有VM来解决上述问题,使用传统的容灾恢复方案也很难避免数据损坏。为了成功地备份分布式应用,而没有数据损坏的风险,在快照进行过程中,必须锁定应用程序中的所有Pods。基于VM的快照无法实现此目的,因为它们无法锁定整个应用程序,无法跨多个VM执行应用一致性的快照。
成功的快照,要使数据损坏风险最小化,并必须保持分布式架构的应用的一致性。这意味着在锁定属于应用程序的所有Pods的同时,来执行快照。
数据和配置备份
容灾系统的目标不仅是防止数据丢失,还在于保持RTO较低。您需要应用程序在遇到问题后尽快重新启动并运行。
这需要备份应用数据和配置信息。如果备份中不包含配置信息,则必须就地重建应用程序,这是一个缓慢,手动且可能容易出错的过程。但是,如果仅保存配置,则可能会丢失所有数据。
一个真正的Kubernetes的企业级容灾系统将同时包含数据和配置备份。这样在系统失败后,可以用一两个命令快速重新部署应用程序。
针对多云和混合云架构进行了优化
绝大多数企业在实践中,应用程序至少在两个环境中运行。这可能意味着多个本地数据中心或多个Amazon Web Services(AWS)区域。在容灾恢复的情况下,通常将一个数据中心作为主站点,而将第二个数据中心作为备份站点。但是,也有许多公司使用公有云和本地数据中心的组合来运行应用程序并满足其业务需求。在大多数情况下,企业会根据其RPO和RTO要求选择最佳的架构方式。
对于容灾恢复解决方案而言,结合这些不同的架构方式以支持不同级别的RPO和RTO至关重要。有效的容灾恢复解决方案应该能够提供同步和异步数据复制,具体取决于主群集和备份群集之间的延迟。
当主站点和备份站点之间的往返延迟通常在10毫秒以下时,可以实现允许RTO和RPO为零的同步复制。这种情况通常是当主集群和备份群集所在数据中心地理相距较近。
在某些情况下,企业希望主站点和备份站点之间的地理距离远一些。在这种情况下,RTO仍可以为零或接近零。但是延迟的增加,同步复制数据会产生比较大的性能问题。如果应用能够接受15分钟或1小时的RPO,则也是可接受的容灾方案。
Kubernetes的企业级容灾恢复方案,应为用户提供适用于多云或混合云架构的,同步复制或异步复制的选择。这样可以使用户能够基于自己的数据中心架构和业务需求情况,来选择不同的容灾恢复方案。
结论
当企业将关键业务应用迁移至Kubernetes时,重新思考和设计容灾恢复的方案非常重要。实际上可以做到在满足与容灾相关的SLA的同时,
public interface AutoCloseable {
void close(www.dayuzaixianyl.cn) throws Exception;
}
public interface Closeable extends AutoCloseable {
void close(www.wyuleezc.cn) throws IOException;
}
Channel是通道接口,针对于I/O相关的操作,需要打开和关闭操作。
public interface Channel extends www.baihuayllpt.cn Closeable {
boolean isOpen(www.qitianylezc.cn);
void close(www.yaoshiyulegw.com) throws IOException;
}
InterruptibleChannel是支持异步关闭和中断的通道接口。为了支持Thead的interrupt模型,当线程中断时,可以执行中断处理对象的回调,从而关闭释放Channel。
public interface InterruptibleChannel extends Channel {
void close(www.fengmingpt.com) throws IOException;
}
关于InterruptibleChannel可中断I/O详细解析可以看一下《JDK源码阅读-InterruptibleChannel与可中断IO》
Interruptible是线程中断接口,即上面提的Thead的interrupt模型。当线程中断时,则会调用中断操作。
public abstract interface Interruptible www.tianhyLzc.cn{
public abstract void interrupt(www.tongyayule.cn java.lang.Thread t);
}
public class Thread implements Runnable {
...
public void interrupt() {
if (this != Thread.currentThread())
checkAccess();
synchronized (blockerLock) {
Interruptible b = blocker;
if (b != null) {
interrupt0(); // Just to set the interrupt flag
b.interrupt(this);
return;
在Kubernetes上运行应用。
但它需要采用专为Kubernetes设计的容灾方法,与Kubernetes的工作方式深入结合。传统的基于VM的容灾解决方案无法做到这一点。
Portworx Enterprise 存储平台是专门为容器和Kubernetes构建的。它可为Kubernetes上运行的应用实现零RPO和接近零的RTO容灾恢复。并具有容器粒度控制的,命名空间感知的,应用一致性的容灾恢复。故障恢复可以完全自动化,从尽可能降低RTO。
来源:https://www.cnblogs.com/laobeipai/p/12040928.html