精华内容
下载资源
问答
  • 停止点检查内容
    千次阅读
    2020-01-21 10:50:20

    一片文章不仅仅是理论的探讨,更多的是应该对实际问题的解决。 写这篇文字的目的是为了解决一个用户体验的问题,如下描述。

     

    部分手机出现下面图片,影响用户体验

     

    这里写图片描述

     

     

    为什么会有如此现象呢?

    网友们不停的吐槽,优酷、金山词霸等App都有如此现象,连微信、QQ都曾经有过。 哥们惊呆了,还是深深的挖掘一下吧!

    void startForeground(int id, Notification notification); 使此服务在前台运行,提供正在进行的服务在此状态下向用户显示的通知。 默认情况下是后台服务,这意味着service在系统回收内存(比如在浏览器里显示大图片)的时候可以被kill掉。如果你比较在意这个service的挂掉,比如像后台音乐播放器这种突然挂了会影响用户的情况,就可以使用ForegroundService来提示用户。

    startForeground

    -> com.android.server.am.ActivityManagerService#setServiceForeground

    -> com.android.server.am.ActiveServices#setServiceForegroundLocked

    在其中先获取对应的ServiceRecord:

    ServiceRecord r = findServiceLocked(className, token, userId);

    r.foregroundNoti = notification;
    r.isForeground = true;
    r.postNotification();

    在postNotification()方法中: 判断notification的mSmallIcon == null,如果是打印日志 Slog.v(TAG, "Attempted to start a foreground service ("+ name + ") with a broken notification (no icon: " + localForegroundNoti + ")");

    然后构建一个新的Notification,

    标题填上“appName is running”,

    内容填上“Tap for more information or to stop the app.”

    然后通过NotificationManagerService.enqueueNotification()更新通知。

    结果,就看到这么一个东西。

    使用场景: 一般这个是为了让Service不容易被杀死,才设置一个notification。 但是此时又不想让用户看到这个通知,该怎么做呢?

    最好的办法是没有这个需求。

    经过查找源码:

    SDK_INT< 18, postNotification()没有判断iflocalForegroundNoti.icon;

    18 =< SDK_INT < 23, postNotification()中if (localForegroundNoti.icon == 0);

    23 =< SDK_INT, postNotification()中if (localForegroundNoti.getSmallIcon() == null);

    小于APi 18,传一个new Notification()是不会显示通知的。

    大于等于18就不行了,但是可能通过在启动一个service,然后startForeground一个相同的id, 然后立刻stopForeground(true),可以将其消失(注意:这其实是google的bug)。

    实测android 6.0生效。

    但是在7.1.2上,这种方法已经失效了,所以,这些版本无法解决。

    尝试了各种反射调用之后,使用外部的notificationManager始终无法去掉由此产生的通知。

    因为NotificationManagerService中做了权限检查的限制,无法绕过。

     

     

     

    结论:

    1.更好的方法是startForeground一个真实有效的notification过去。

    2.startForeground只要传的id相同,不管是不是一个进程,不管是不是同一个notification, 都会用最新的notification覆盖旧的,只显示一个。

    更多相关内容
  • Hyper-V 2016中的标准检查点和生产检查点 2017年1月24日由埃里克Siron12 检查点是几乎所有虚拟机管理程序中发现的最古老的功能之一。尽管它无处不在,但这项技术还是有很多困惑。它是什么?什么时候合适?在哪里...

    Hyper-V 2016中的标准检查点和生产检查点

     

    2017124日由 埃里克Siron12

    检查点是几乎所有虚拟机管理程序中发现的最古老的功能之一。尽管它无处不在,但这项技术还是有很多困惑。它是什么?什么时候合适?在哪里不应该使用它?为什么这么多人说不使用它?Hyper-V2016年发行版通过添加一种新型的检查点(奇怪地称为生产检查点)使情况更加混乱,即使它们不比标准检查点更适合生产环境。但是,它们确实向检查点机制添加了更多范围的有效用例。要正确使用检查点,您需要了解它们。

    什么是Hyper-V检查点?

    Hyper-V检查点是虚拟机生命周期的不变点。虚拟机仍然可以正常使用,但是检查点受到保护,不会对虚拟机进行任何更改。通常将此类更改理解为是指附加的虚拟硬盘中的数据。那只是故事的一部分。虚拟机的任何更改都不会影响检查点。它还与虚拟硬盘的断开/连接,网络拓扑更改,内存重新分配以及有关可修改的虚拟机的几乎所有其他事物隔离。

    检查点过程很简单,但是结果有些矛盾,因此令人困惑。以下是适用于标准检查点和生产检查点的通用说明,省略了区别性详细信息。

    1. 检查点服务将创建虚拟机配置文件的副本,并将其放置在虚拟机已配置的Checkpoint File Location
    2. 检查点服务会为连接到虚拟机的每个VHD [X]文件创建一个差异磁盘。这些差异磁盘始终与其父VHD [X]文件放在同一文件夹中。
    3. 创建检查点将完全忽略直通磁盘。
    4. 虚拟机继续从原始配置文件运行,并继续从原始VHD [X]文件读取未更改的数据。

    这部分看起来很简单。混乱源于Hyper-V处理这些文件以进行更改的方式。

    • Hyper-V将虚拟机配置的更改分配给其原始配置文件(在2012 R2和更早版本中为XML,在2016年为VMCX)。Hyper-V不会对检查点服务在上面的步骤1中创建的配置文件的副本进行任何更改。
    • Hyper-V将虚拟机连接的虚拟硬盘中的数据更改写入AVHD [X]文件。Hyper-V 不会对原始VHD [X]文件进行任何更改。
    • Hyper-V将直通磁盘中的数据更改直接写入直通磁盘。

    了解所有这些很重要,因为我发现检查点行为存在很多混乱。人们正在复制并修改AVHD [X]文件,以为他们在某种程度上操纵检查点。实际上,他们正在使用活动的虚拟机。实际上,我们经常使用诸如属于该检查点的AVHDX文件…”之类的术语,实际上,检查点与AVHDX文件没有任何关系(检查点树中嵌套层的检查点有,但现在让我们考虑一下具有单个检查点的虚拟机)。

    让我们看一下带有检查点的虚拟机的可视化:

    检查点图

     

    如果您打算对文件做任何事情,那么了解虚拟机状态的哪一部分拥有每个文件就至关重要。如果您不打算将其提高到这个水平,那么最重要的要了解的是虚拟机是所有这些部分的总和。虚拟机的惰性部分从技术上讲可以独立存在,但是更改虚拟机的任何部分都会导致在活动状态下发生的任何事情变为无效。

    快照呢?它们如何与检查点相关?

    大多数其他虚拟机管理程序,包括较旧版本的Hyper-V,都将此技术称为快照Hyper-V的先驱Virtual Server将其称为检查点。System Center Virtual Machine Manager始终使用该术语。为了使所有内容保持同步,Microsoft已经开始逐渐将其称为检查点,但是您仍然会看到许多对快照的引用。一个明显的位置是保存它们的文件夹。

    还有其他技术称为快照。最值得注意的是卷影复制服务(VSS)快照。这是新生产检查点中非常重要的部分,因此我们将在该部分中对此进行扩展。

    如何使用Hyper-V检查点作为备份?

    简短的答案是:您不能将Hyper-V检查点用作备份。根据定义,备份是数据的重复。检查点不重复数据

    可以做的是导出检查点。这将创建数据的副本,因此有资格作为备份。它没有使用专用的备份应用程序有效,但是如果您没有更好的选择,它会做到。

    但是,检查点出口使很多人感到困惑。他们被告知AVHDX文件属于检查点。因此,他们自然地认为导出检查点将捕获AVHDX中所有已更改的数据。不幸的是,前提是不正确的。AVHDX不属于检查点;它属于活动的虚拟机。如果导出检查点,则可以得到发生检查点被采取为止的所有事情,但是之后没有任何事情。如果要导出在检查点之后发生的事件,则需要导出虚拟机的活动状态,或者采用另一个检查点并将其导出。Hyper-V可以导出实时虚拟机,因此可以利用它。

    如果需要更改的数据,则需要深入研究API。这些更改由原始数据块表示,因此您将需要一些编程技能来充分利用它们。但是,我认为大多数人并不真正了解这些更改不是完整的文件。

    本节最重要的一点是,检查点不是备份

    如何使用应用删除还原检查点功能?

    创建检查点后,可以使用三个操作来管理它。

    应用检查点

    应用操作是最恰当的命名。当您应用检查点时,检查点将变为虚拟机的活动状态。当您使用GUI来应用检查点时,将有机会捕获另一个检查点中的当前活动状态。如果您拒绝,则在最新检查点和虚拟机的活动状态之间发生的所有事情都将永久丢失在较早的文章中,我们已经编写了检查点应用程序的说明

    Apply具有两个主要用途:

    • 您想像使用特定检查点时一样使用虚拟机。通过这种用法,建议您在出现提示时采取另一个检查点。
    • 您不喜欢虚拟机的当前状态,而是想使用其他状态。通过这种用法,采取另一个检查点的鼓励并不那么强烈。

    根据您的情况,您可能更喜欢还原操作。

    还原检查点

    恢复也是一个恰当的名称,尽管它不能说明全部内容。还原应用” 完全相同,除了

    • 您无法选择检查点。还原总是应用最新的检查点。
    • 您没有选择检查点当前状态的选项。它是永久丢失的。

    还原有一种用途:

    • 您不喜欢虚拟机的当前状态,而是想回到先前的检查点。

    当紧接在前一个检查点是您想要的位置并且您不在乎保持当前状态时,Revert优于Apply

    删除检查点

    如果从字面上删除了检查点,那么它将破坏上面可视化图中分隔线左侧的所有内容。更改后的数据将成为孤立数据并且毫无用处。但是,它确实删除了\ Snapshot文件夹中代表任何配置差异的文件,因此该动词确实保留了一定的适用性。我要说的是,合并在描述删除检查点时会发生什么方面做得更好。源VHDXAVHDX文件中的数据将合并回到源VHDX文件中。没有数据被删除。只有原始虚拟机配置信息会丢失,而有利于当前配置(例如,动态内存设置)。在较早的文章中,我们已经编写了删除检查点的说明

    标准和生产Hyper-V检查点之间有什么区别?

    从历史上看,从管理程序的角度来看,虚拟机通常是一个黑匣子。这意味着虚拟机管理程序知道所有CPU和内存以及I / O活动都在其中发生,但是它并不真正知道某些是什么。因此,快照/检查点本质上在某个时间点冻结​​了虚拟机的活动……就像它们所命名的摄影快照一样。快照中没有捕获快照后发生的任何事情……就像它们以其命名的摄影快照一样。由于管理程序不知道虚拟机内部正在发生什么,因此它只是将这些资源锁定在当时的状态。这是一个标准检查点。

    新的所谓生产检查点依赖于虚拟机管理程序技术的最新进展。包括Hyper-V在内的大多数公司现在都有一些技巧可以进入黑匣子并与内部运行的特殊设计的组件进行交互。对于Hyper-V,它们在Windows中称为集成服务,在Linux中称为集成组件。这些服务之一是  备份(卷影复制)服务,该服务又与卷影复制服务(我们大多数人都简称为“ VSS” 交互。

    有关VSS的许多文章可以(并且已经)写过。它的核心是备份应用程序和操作系统之间的网关。存在VSS是为了解决在进行备份时数据可能并且确实会更改的事实。我们已经有一篇文章集,涵盖与VSS和备份相关的术语和机制。关于VSS的最重要的了解是,它为应用程序提供了停止所有I / O并将未完成的数据和操作从内存刷新到磁盘的功能,从而使备份不会丢失任何内容。要了解VSS在宇宙中的位置,最重要的一点是,并非所有应用程序都可以利用它。这就是我们在标准生产检查点之间进行区分的地方。

    标准检查站的特征是什么?

    从最初的检查点是什么部分开始。那里的所有内容都适用于标准检查点。此外,标准检查点还可以捕获:

    • 虚拟机CPU活动的活动状态
    • 虚拟机内存的活动状态

    标准检查点的简短形式定义是:虚拟机与采用检查点时的状态完全相同

    让我们来看看它的作用。在虚拟机内部,我在桌面上创建了一个新的文本文件,在记事本中将其打开,键入一些文本,并在不保存文件的情况下执行了检查点操作:

    未保存的数据预检查点

     

    接下来,我进行了一些更改:

    标准后检查点更改

     

    然后我将其还原(请记住,这会使我失去检查点之后所做的一切):

    还原的标准检查点

     

    那么,这时,记事本中的哪些内容存在于VMVHDX中?没什么,就是那样。我什么也没保存 但是,文档的内存版本中的所有文本仍然存在,因为已保存了内存状态。检查点代表在执行检查点的确切时刻的虚拟机。记事本不知道发生了什么事。虚拟机中任何地方唯一意识到没有什么不同的是时间服务。我确实启用了时间同步服务,因此时钟已立即更新。

    生产检查站的特征是什么?

    从最初的检查点是什么部分开始。那里的所有内容都适用于生产检查点。与标准检查点不同,生产检查点不会捕获其他任何内容。相反,它们在来宾中触发VSS。在其中运行的任何已注册VSS编写器的应用程序都将执行编写器要执行的所有操作。例如,Microsoft Exchange将其日志提交到存储。Windows还将阻止正在进行的I / O发生和刷新文件系统队列。

    重要的是要知道,活动的CPU操作和内存状态不会受到任何保护。

    为了演示,我将继续使用与上面标准检查点部分相同的VM。我合并(删除)了该检查点。我将虚拟机设置为使用生产检查点,然后使用一个检查点。完成此操作后,我将执行与标准检查点相同的操作:在记事本文件中键入了一些数据。然后,我还原了检查点。

    首先要注意的是,在还原的标准检查点还原虚拟机的确切状态的情况下,还原完成后,还原到生产检查点的虚拟机将关闭:

    恢复生产检查点

     

    之后,我打开了虚拟机的电源并打开了在桌面上创建的文件。看起来是这样的:

    恢复生产检查点后数据丢失

     

    数据怎么了?首先,我从未保存过它。这些话只在记忆中。其次,Notepad.exe没有VSS编写器。当生产检查点触发VSS时,Notepad.exe不知道要做什么,因此它什么也没做。

    什么时候应该使用检查点?

    在计划内的事件中,应该将检查点用于短期保护,否则可能会对虚拟机造成无法挽回的损害。对于标准和生产检查点都是如此。检查点的有效用法示例:

    • 一个不是特别值得信赖的供应商想要升级其应用程序。在永久提交之前,您希望看到该应用程序在您的环境中正常运行。
    • Microsoft / Windows更新,尤其是在以前的更新已严重破坏的系统上。
    • 用于测试进行系统级更改的开发中应用程序的系统。

    无论您出于何种原因使用检查点,它们仅用于短期用途。我听说有人允许检查站放置长达一年的时间,然后才决定对此采取任何措施。即使他们可以毫无问题地解决问题,但这也不是该技术的良好用法。就个人而言,我不希望检查站居住超过几个小时。我认为深层次的升级过程可能会保证一个检查点可以使用一两天。我不能给您一个严格的规则,但是我可以给您一个可靠的经验法则:永远不要让检查点超过它的用处。我的意思是,对于您拥有的每个检查点,请问自己:如果还原此检查点,虚拟机的状态是否有用,否则我会丢失太多?如果没有用,请现在合并它。

    有些人说:我从不在生产中使用检查点(暗示您也不应使用检查点),并以一连串的借口为它辩护。其中一些借口:

    • 我听说别人发生了不好的事情。”-这些都是可怕的原因。
    • 不同的磁盘会占用大量空间,可能会占用太多空间,以至于我的虚拟机会暂停。” —这是事实。但是,差异磁盘(AVHDX)的增长速度仅与对VM数据所做的更改一样快。如果寿命不长,它们就不会增长到难以控制的规模。另外,无论如何,您都应该监视空间使用情况。
    • 不同的磁盘会损害性能。” —差异磁盘会影响性能,但是它被夸大了。对于初学者来说,大多数人使用的IOPS并不像他们认为的那么多。另外,除非您已经接近容量或要嵌套检查点/差异磁盘,否则对性能的影响是最小的。这是一个可管理的问题,甚至不能说是从不使用检查点的可靠借口。最多是提醒您明智地使用检查点。
    • 人们忘记删除检查点。”-主管管理员找到一种管理方法。我使用Nagios监视我的(您需要注册才能访问Hyper-V检查点监视器)。如果太多,请设置Outlook提醒和/或任务。偶尔运行Get-VMSnapshot。此借口的有效性为零。

    我应该使用标准检查点还是生产检查点?

    不允许使用术语生产检查点来暗示不能在生产中使用标准检查点。在生产环境中始终支持标准检查点。在某些情况下,它们仍然是首选。

    标准检查点的用例

    我假设我的记事本演示不指示正常的服务器操作。但是,有很多基于服务器的应用程序不响应VSS事件。 当满足以下所有条件时,对于要在虚拟机中保护的应用程序,标准检查点优于生产检查点:

    • 该应用程序不支持VSS
    • 该应用程序主动处理虚拟机拥有的VHDX中的数据,或者执行内存中的操作,如果可以避免的话,这些操作必定不会丢失。这不适用于针对远程服务器上的数据的内存中操作,因为还原的虚拟机上的数据状态不会同步到任何远程服务器。
    • 采取检查点时,应用程序处于活动状态(正在运行)。

    这类应用程序的示例是不支持VSS的数据库和邮件服务器。我曾与许多使用非常古老的数据库技术的供应商合作(阅读:应用程序供应商及其客户可以避免使用现代RDBMS的许可费用)。这些最好由标准检查点提供。

    生产检查点的用例

    通常,在任何要求标准检查点的条件都不成立时,最好使用生产检查点。让我们直接指定它们。当任何条件适用于您要保护的应用程序时,请选择生产检查点而不是标准检查点

    • 该应用程序可识别VSS
    • 该应用程序是被动的,处于只读状态,或从远程计算机提供数据。
    • 该应用程序已停止

    生产检查点有许多明显的用途,因此我将跳过这些检查点。对于像Apache Web服务器那样充当远程SQL Server前端的产品,生产检查点将是一个不错的选择。如果还原,则Apache Web服务器将从关闭状态恢复,因此它将不会尝试继续执行采用检查点时处于活动状态的任何操作。如果改用标准检查点,并且Web用户试图更新记录,则可能导致某些数据不一致。

    是否有应避免所有检查站的情况?

    我显然不赞成检查站的从不理念。但是,某些应用程序的虚拟机永远不应被检查点:

    • 多域控制器环境中的Active Directory域服务器。多DC环境中域控制器的标准检查点可能会导致USN回滚。运行Windows Server 2012或更高版本的域控制器应该不受干扰,但是USN的回滚可能会造成灾难性的后果,以致风险不值得。如果使用生产检查点,从技术上讲,您也应该安全,但是,再次这样做可能不值得。如果您的环境足够复杂,无法证明多个域控制器的合理性,则它们根本不应运行任何可以证明使用Hyper-V检查点合理性的东西。具有单个域控制器的环境不能遇到USN回滚,但是我仍然看不到那里的检查点有效的用例。
    • 集群成员。此限制对受Microsoft故障转移群集和非Microsoft群集技术保护的应用程序同样适用。检查点可能会导致这些应用程序中的USN回滚。当这些应用程序与其他成员同步时,这些其他成员将不必费心跟踪该同步点之前的任何对象的状态。如果将成员还原到检查点,它将不知道不知道的内容,其他成员也不知道为什么不知道。如果由于某些原因必须检查点,请先停止集群并关闭所有其他成员。当集群成员仅是数据的前端并且不将任何内容保留在本地时,这会有一些例外,但是您必须对这些应用程序中的数据流有深刻的了解。
    • 具有先天复制的应用程序。我认为我们正在这里建立模式。如果您的应用程序正在执行某些操作以将本地数据与其他服务器上的其他应用程序进行同步,则对于任何检查点而言,这都不是一个好用处,除非您确保还原不会对其他成员或其数据造成负面影响。

    生产检查点可以解决其中一些问题。还原带有生产检查点的虚拟机时,至少知道发生了什么事。该内容通常等效于从完整备份中还原。如果您了解您的应用程序在这种情况下将如何反应,那么您将了解它如何对生产检查点的应用程序作出反应。

    生产检查点的一个好处是,对于运行虚拟机,它们要比标准检查点小。生产型虚拟机不需要内存状态,因此它们不保存副本。标准检查点在捕获时会保留虚拟机内存确切状态的磁盘上副本。

    如何在Hyper-V 2016中配置检查点?

    此版本的检查点配置过程已更改。在以前的版本中,唯一可以更改的是放置检查点文件的位置。在2016年(包括Windows 10 Client Hyper-V)中,您可以:

    • 完全禁用虚拟机的检查点。
    • 在标准或生产检查点之间进行选择。
    • 当生产检查点操作失败时,允许创建标准检查点。
    • 选择将虚拟机的检查点文件放置在何处(这仅适用于配置和状态信息文件; AVHD [X]始终与其VHD [X]父代位于同一位置。

    默认情况下,为每个虚拟机启用标准后备的生产检查点。若要更改这些设置,请在Hyper-V管理器中打开虚拟机的设置,然后切换到“ 检查点选项卡:

    Hyper-V 2016中的检查点设置

     

    您还可以使用PowerShell,它是批量操作的理想选择。该cmdletSet-VM。检查点类型的参数选择很容易使用-CheckpointType。它接受DisabledStandardProductionProductionOnly的值。使用SnapshotFileLocation参数告诉它将配置和状态信息文件放置在何处。

    2016年检查站的分类混乱

    Get-VMSnapshot的输出包含一个SnapshotType字段,您可能会认为该字段可以帮助您区分生产检查点和标准检查点。如果您尝试将其用于此目的,则将发现它始终指示检查点类型为标准,即使它是生产类型也是如此。该字段适用于Hyper-V副本,而不适用于新的Production检查点类型。我找不到任何地方可以从外部确定检查点是生产还是标准。我建议您在创建时为它们命名。

     

    展开全文
  •   flink将之前某个时间所有的状态保存下来,这份就是所谓的检查点(checkpoint)。检查点是 Flink 容错机制的核心。检查是针对故障恢复的结果而言的:故障恢复之后继续处理的结果,应该与发生故障前完全一致。...


    1. 检查点(Checkpoint)

      flink将之前某个时间点所有的状态保存下来,这份存档就是所谓的检查点(checkpoint)。检查点是 Flink 容错机制的核心。检查是针对故障恢复的结果而言的:故障恢复之后继续处理的结果,应该与发生故障前完全一致。所以有时又会把 checkpoint 叫作一致性检查点


    1.1 检查点的保存

    (1) 周期性的触发保存

      检查点作为应用状态的一份存档,其实就是所有任务状态在同一时间点的一个快照(snapshot),它的触发是周期性的。每隔一段时间检查点保存操作被触发时,就把每个任务当前的状态复制一份,按照一定的逻辑结构放在一起持久化保存起来,就构成了检查点

    (2) 保存的时间点

      当所有任务都恰好处理完一个相同的输入数据的时候,将它们的状态保存下来。首先,这样避免了除状态之外其他额外信息的存储,提高了检查点保存的效率。其次,一个数据要么就是被所有任务完整地处理完,状态得到了保存;要么就是没处理完,状态全部没保存:这就相当于构建一个事务(transaction)。如果出现故障,恢复到之前保存的状态,故障时正在处理的所有数据都需要重新处理;所以只需要让源(source)任务向数据源重新提交偏移量、请求重放数据就可以了。这需要源任务可以把偏移量作为算子状态保存下来,而且外部数据源能够重置偏移量;(典型应用 Kafka)


    1.2 从检查点恢复状态

      当发生故障时,需要找到最近一次成功保存的检查点来恢复状态
    在这里插入图片描述
    具体的步骤为:

    (1)重启应用

      遇到故障之后,第一步当然是重启,所有任务的状态会清空
    在这里插入图片描述

    (2)读取检查点,重置状态

      找到最近一次保存的检查点,从中读出每个算子任务状态的快照,分别填充到对应的状态中。这样,Flink 内部所有任务的状态,就恢复到了保存检查点的那一时刻
    在这里插入图片描述

    (3)重放数据

      从检查点恢复状态后如果直接继续处理数据,那么保存检查点之后、到发生故障这段时间内的数据就相当于丢掉了;这会造成计算结果的错误。为了不丢数据,应该从保存检查点后开始重新读取数据,这可以通过 Source 任务向外部数据源重新提交偏移量(offset)来实现。这样,整个系统的状态已经完全回退到了检查点保存完成的那一时刻
    在这里插入图片描述

    (4)继续处理数据

    在这里插入图片描述

    注:
      想要正确地从检查点中读取并恢复状态,必须知道每个算子任务状态的类型和先后顺序(拓扑结构);因此为了可以从之前的检查点中恢复状态,在改动程序、修复 bug 时要保证状态的拓扑顺序和类型不变。状态的拓扑结构在 JobManager 上可以由 JobGraph 分析得到,而检查点保存的定期触发也是由 JobManager 控制的;所以故障恢复的过程需要 JobManager 的参与


    1.3 检查点算法

      在不暂停整体流处理的前提下,将状态备份保存到检查点。在 Flink中,采用了基于 Chandy-Lamport 算法的分布式快照

    (1)检查点分界线(Barrier)

      借鉴水位线(watermark)的设计,在数据流中插入一个特殊的数据结构,专门用来表示触发检查点保存的时间点。收到保存检查点的指令后,Source 任务可以在当前数据流中插入这个结构;之后的所有任务只要遇到它就开始对状态做持久化快照保存。由于数据流是保持顺序依次处理的,因此遇到这个标识就代表之前的数据都处理完了,可以保存一个检查点;而在它之后的数据,引起的状态改变就不会体现在这个检查点中,而需要保存到下一个检查点。这种特殊的数据形式,把一条流上的数据按照不同的检查点分隔开,所以就叫作检查点的分界线(Checkpoint Barrier)。检查点分界线中带有一个检查点 ID,这是当前要保存的检查点的唯一标识
    在这里插入图片描述
      在 JobManager 中有一个检查点协调器(checkpoint coordinator),专门用来协调处理检查点的相关工作。检查点协调器会定期向 TaskManager 发出指令,要求保存检查点(带着检查点 ID);TaskManager 会让所有的 Source 任务把自己的偏移量(算子状态)保存起来,并将带有检查点 ID 的分界线(barrier)插入到当前的数据流中,然后像正常的数据一样像下游传递;之后 Source 任务就可以继续读入新的数据了。每个算子任务只要处理到这个 barrier,就把当前的状态进行快照;在收到 barrier 之前,还是正常地处理之前的数据,完全不受影响

    (2)分布式快照算法

      通过在流中插入分界线(barrier)需要保持顺序一致,在一条单一的流上,数据依次进行处理,顺序保持不变;不过对于分布式流处理来说,想要保持数据的顺序就不是那么容易了。
      Flink 使用了 Chandy-Lamport 算法的一种变体,被称为异步分界线快照(asynchronous barrier snapshotting)算法。算法的核心就是两个原则:当上游任务向多个并行下游任务发送 barrier 时,需要广播出去;而当多个上游任务向同一个下游任务传递 barrier 时,需要在下游任务执行分界线对齐(barrier alignment)操作,也就是需要等到所有并行分区的 barrier 都到齐,才可以开始状态的保存

    在这里插入图片描述
    具体过程:
    (1)JobManager 发送指令,触发检查点的保存;Source 任务保存状态,插入分界线
      JobManager 会周期性地向每个 TaskManager 发送一条带有新检查点 ID 的消息,通过这种方式来启动检查点。收到指令后,TaskManger 会在所有 Source 任务中插入一个分界线(barrier),并将偏移量保存到远程的持久化存储中
    在这里插入图片描述
    (2)状态快照保存完成,分界线向下游传递
      状态存入持久化存储之后,会返回通知给 Source 任务;Source 任务就会向 JobManager 确认检查点完成,然后像数据一样把 barrier 向下游任务传递
    在这里插入图片描述
    (3)向下游多个并行子任务广播分界线,执行分界线对齐
      对于下一个检查点要保存的内容,不应立即处理,而是要缓存起来、等到状态保存之后再做处理
    在这里插入图片描述
    (4)分界线对齐后,保存状态到持久化存储
    在这里插入图片描述
    (5)先处理缓存数据,然后正常继续处理
      完成检查点保存之后,任务就可以继续正常处理数据。这时如果有等待分界线对齐时缓存的数据,需要先做处理;然后再按照顺序依次处理新到的数据

    注:
      当 JobManager 收到所有任务成功保存状态的信息,就可以确认当前检查点成功保存。之后遇到故障就可以从这里恢复
      由于分界线对齐要求先到达的分区做缓存等待,一定程度上会影响处理的速度;当出现背压(backpressure)时,下游任务会堆积大量的缓冲数据,检查点可能需要很久才可以保存完毕。为了应对这种场景,Flink 1.11 之后提供了不对齐的检查点保存方式,可以将未处理的缓冲数据(in-flight data)也保存进检查点。这样,当我们遇到一个分区 barrier 时就不需等待对齐,而是可以直接启动状态的保存了


    1.4 检查点配置

    (1) 启用检查点

      默认情况下,Flink 程序是禁用检查点的。如果想要为 Flink 应用开启自动保存快照的功能,需要在代码中显式地调用执行环境的.enableCheckpointing()方法:

    StreamExecutionEnvironment env = 
    StreamExecutionEnvironment.getExecutionEnvironment();
    // 每隔 1 秒启动一次检查点保存
    env.enableCheckpointing(1000);
    

    (2)检查点存储(Checkpoint Storage)

      检查点具体的持久化存储位置,取决于检查点存储(CheckpointStorage)的设置。默认情况下,检查点存储在 JobManager 的堆(heap)内存中。而对于大状态的持久化保存,Flink也提供了在其他存储位置进行保存的接口,这就是 CheckpointStorage。具 体 可以通过调用检查点配置的 .setCheckpointStorage() 来 配 置 , 需 要 传 入 一 个CheckpointStorage 的实现类。Flink 主要提供了两种 CheckpointStorage:作业管理器的堆内存(JobManagerCheckpointStorage)和文件系统(FileSystemCheckpointStorage)

    // 配置存储检查点到 JobManager 堆内存
    env.getCheckpointConfig().setCheckpointStorage(new 
    JobManagerCheckpointStorage());
    // 配置存储检查点到文件系统
    env.getCheckpointConfig().setCheckpointStorage(new 
    FileSystemCheckpointStorage("hdfs://namenode:40010/flink/checkpoints"));
    

    (3)其他高级配置

    (1)检查点模式(CheckpointingMode)
      设置检查点一致性的保证级别,有精确一次(exactly-once)和至少一次(at-least-once)两个选项。默认级别为 exactly-once,而对于大多数低延迟的流处理程序,at-least-once 就够用了,而且处理效率会更高

    (2)超时时间(checkpointTimeout)
      用于指定检查点保存的超时时间,超时没完成就会被丢弃掉。传入一个长整型毫秒数作为参数,表示超时时间

    (3)最小间隔时间(minPauseBetweenCheckpoints)
      用于指定在上一个检查点完成之后,检查点协调器(checkpoint coordinator)最快等多久可以发出保存下一个检查点的指令。这就意味着即使已经达到了周期触发的时间点,只要距离上一个检查点完成的间隔不够,就依然不能开启下一次检查点的保存。这就为正常处理数据留下了充足的间隙。当指定这个参数时,maxConcurrentCheckpoints 的值强制为 1

    (4)最大并发检查点数量(maxConcurrentCheckpoints)
      用于指定运行中的检查点最多可以有多少个。由于每个任务的处理进度不同,完全可能出现后面的任务还没完成前一个检查点的保存、前面任务已经开始保存下一个检查点了。这个参数就是限制同时进行的最大数量。如果前面设置了 minPauseBetweenCheckpoints,则 maxConcurrentCheckpoints 这个参数就不起作用了

    (5)开启外部持久化存储(enableExternalizedCheckpoints)
      用于开启检查点的外部持久化,而且默认在作业失败的时候不会自动清理,如果想释放空间需要自己手工清理。里面传入的参数 ExternalizedCheckpointCleanup 指定了当作业取消的时候外部的检查点该如何清理。
    DELETE_ON_CANCELLATION:在作业取消的时候会自动删除外部检查点,但是如果是作业失败退出,则会保留检查点。
    RETAIN_ON_CANCELLATION:作业取消的时候也会保留外部检查点

    (6)检查点异常时是否让整个任务失败(failOnCheckpointingErrors)
      用于指定在检查点发生异常的时候,是否应该让任务直接失败退出。默认为 true,如果设置为 false,则任务会丢弃掉检查点然后继续运行

    (7)不对齐检查点(enableUnalignedCheckpoints)
      不再执行检查点的分界线对齐操作,启用之后可以大大减少产生背压时的检查点保存时间。这个设置要求检查点模式(CheckpointingMode)必须为 exctly-once,并且并发的检查点个数为 1


    1.5 保存点(Savepoint)

      原理和算法与检查点完全相同,只是多了一些额外的元数据。事实上,保存点就是通过检查点的机制来创建流式作业状态的一致性镜像(consistent image)的。保存点中的状态快照,是以算子 ID 和状态名称组织起来的,相当于一个键值对。从保存点启动应用程序时,Flink 会将保存点的状态数据重新分配给相应的算子任务

    (1)使用保存点

    (1)创建保存点
      要在命令行中为运行的作业创建一个保存点镜像,只需要执行:

    bin/flink savepoint :jobId [:targetDirectory]
    

      对于保存点的默认路径,可以通过配置文件 flink-conf.yaml 中的 state.savepoints.dir 项来设定:

    state.savepoints.dir: hdfs:///flink/savepoints
    

      对于单独的作业,可以在程序代码中通过执行环境来设置:

    env.setDefaultSavepointDir("hdfs:///flink/savepoints");
    

      由于创建保存点一般都是希望更改环境之后重启,所以创建之后往往紧接着就是停掉作业的操作。除了对运行的作业创建保存点,可以在停掉一个作业时直接创建保存点:

    bin/flink stop --savepointPath [:targetDirectory] :jobId
    

    (2)从保存点重启应用

      提交启动一个 Flink 作业,使用的命令是 flink run;现在要从保存点重启一个应用,其实本质是一样的:

    bin/flink run -s :savepointPath [:runArgs]
    

    2. 状态一致性

    2.1 状态一致性的三种级别

    最多一次(AT-MOST-ONCE)
      当任务发生故障时,最简单的做法就是直接重启,别的什么都不干;既不恢复丢失的状态,也不重放丢失的数据。每个数据在正常情况下会被处理一次,遇到故障时就会丢掉,所以就是最多处理一次

    至少一次(AT-LEAST-ONCE)
      在实际应用中,希望至少不要丢掉数据。这种一致性级别就叫作至少一次(at-least-once),就是说是所有数据都不会丢,肯定被处理了;不过不能保证只处理一次,有些数据会被重复处理。
      在有些场景下,重复处理数据是不影响结果的正确性的,这种操作具有幂等性。如 UV
      为了保证达到 at-least-once 的状态一致性,需要在发生故障时能够重放数据。最常见的做法是,可以用持久化的事件日志系统,把所有的事件写入到持久化存储中。这时只要记录一个偏移量,当任务发生故障重启后,重置偏移量就可以重放检查点之后的数据了。Kafka 就是这种架构的一个典型实现

    精确一次(EXACTLY-ONCE)
      最难实现的状态一致性语义。exactly-once 意味着所有数据不仅不会丢失,而且只被处理一次,不会重复处理。也就是说对于每一个数据,最终体现在状态和输出结果上,只能有一次统计
      


    2.2 端到端的状态一致性

      在实际应用中,一般要保证从用户的角度看来,最终消费的数据是正确的。而用户或者外部应用不会直接从 Flink 内部的状态读取数据,往往需要将处理结果写入外部存储中。这就要求不仅要考虑 Flink 内部数据的处理转换,还涉及从外部数据源读取,以及写入外部持久化系统,整个应用处理流程从头到尾都应该是正确的。所以完整的流处理应用,应该包括了数据源、流处理器和外部存储系统三个部分。这个完整应用的一致性,就叫作端到端(end-to-end)的状态一致性,它取决于三个组件中最弱的那一环。一般来说,能否达到 at-least-once 一致性级别,主要看数据源能够重放数据;而能否达到 exactly-once 级别,流处理器内部、数据源、外部存储都要有相应的保证机制


    3. 端到端精确一次(end-to-end exactly-once)

      由于检查点保存的是之前所有任务处理完某个数据后的状态快照,所以重放的数据引起的状态改变一定不会包含在里面,最终结果中只处理了一次。所以,端到端一致性的关键点,就在于输入的数据源端和输出的外部存储端

    3.1 输入端保证

      数据源可重放数据,或者说可重置读取数据偏移量,加上 Flink 的 Source 算子将偏移量作为状态保存进检查点,就可以保证数据不丢。这是达到 at-least-once 一致性语义的基本要求,也是实现端到端 exactly-once 的基本要求


    3.2 输出端保证

      为了实现端到端 exactly-once,我们还需要对外部存储系统、以及 Sink 连接器有额外的要求。保证 exactly-once 一致性的写入方式有两种:

    (1)幂等(idempotent)写入

      一个操作可以重复执行很多次,但只导致一次结果更改

    (2)事务(transactional)写入

      事务(transaction)是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所做的所有更改都会被撤消。事务有四个基本特性:原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)和持久性(Durability)。
      用一个事务来进行数据向外部系统的写入,事务与检查点绑定。当 Sink 任务遇到 barrier 时,开始保存状态的同时就开启一个事务,接下来所有数据的写入都在这个事务中;待到当前检查点保存完毕时,将事务提交,所有写入的数据就真正可用了。如果中间过程出现故障,状态会回退到上一个检查点,而当前事务没有正常关闭(因为当前检查点没有保存完),所以也会回滚,写入到外部的数据就被撤销了

    (1)预写日志(write-ahead-log,WAL)
    ①先把结果数据作为日志(log)状态保存起来
    ②进行检查点保存时,也会将这些结果数据一并做持久化存储
    ③在收到检查点完成的通知时,将所有结果一次性写入外部系统

    (2)两阶段提交(two-phase-commit,2PC)
    真正基于事务的,它需要外部系统提供事务支持
    ①当第一条数据到来时,或者收到检查点的分界线时,Sink 任务都会启动一个事务。
    ②接下来接收到的所有数据,都通过这个事务写入外部系统;这时由于事务没有提交,所以数据尽管写入了外部系统,但是不可用,是预提交的状态。
    ③当 Sink 任务收到 JobManager 发来检查点完成的通知时,正式提交事务,写入的结果真正可用


    展开全文
  • loadrunner检查点函数详解

    千次阅读 2018-07-12 10:58:15
    LoadRunner检查点函数主要有下面四个:1)web_find()函数用于从 HTML 页中搜索指定的文本字符串;2)web_reg_find()函数注册一个请求,以在下一个操作函数(如 web_url)检索到的HTML网页上搜索指定的文本字符串...

    LoadRunner检查点函数主要有下面四个:

    1web_find()函数用于从 HTML 页中搜索指定的文本字符串;

    2web_reg_find()函数注册一个请求,以在下一个操作函数(如 web_url)检索到的HTML网页上搜索指定的文本字符串;

    3web_image_check()函数用于从HTML页面中查找指定的图片;

    4web_global_verfication()属于注册函数,注册一个在web页面中搜索文本字符串的请求,与web_reg_find只在下一个Action函数中执行搜索不同的是它在之后所有的Action类函数中执行搜索指定的文本字符串;

    一、web_find()函数

    web_find("test ","LeftOf=百度一下",LAST);

    语法介绍:test是定义检查函数的名称,Leftof为左边界,RighOf为右边界,What为检查内容。如下图以百度为例

    LoadRunner检查点函数介绍

    1.注意事项:

    1)使用web_find函数,必须要设置Vuser—>Run Time Setting…—>Preferences,勾选Enable lmage and text check复选框。

    2web_find函数,检查原理是在服务器返回的页面上查找内容,所以要放在被检查函数后面。

    二、web_image_check()函数

    web_image_check("test_image","Alt=","Src= http://www.baidu.com/img/baidu_sylogo1.gif",LAST);

    语法介绍:test_image为定义检查函数的名称,AltSrc为响应HTML源代码中图片的属性,可为空。如下图以百度为例

    LoadRunner检查点函数介绍

    1.注意事项:

    1)使用web_image_check函数,必须要设置Vuser—>Run Time Setting…—>Preferences,勾选Enable lmage and text check复选框。

    2web_image_check函数,检查原理是在服务器返回的页面上查找内容,所以要放在被检查函数后面。

    三、web_reg_find()函数

    web_reg_find("Search=Body","Fail=NotFound","Text=百度一下","SaveCount=test_yy",LAST);

    语法介绍:

    1Search为检查内容的位置,All代表全部,Body代表响应体、Header代表头内容;

    2Fail为检查结果判断,NotFound值为没有发现则停止执行,Found值为发现了则停止执行;

    3Text为检查内容

    4SaveCount为查找计算定义的变量

    1.注意事项:

    1web_reg_find函数与上面两个函数不同,Web_reg_find是注册类型函数,它本身并不执行,不能通过它的返回值来作为事务的判断条件(因为web_reg_find()的返回值01表示web_reg_find()是否注册成功,并不代表查找的内容是否存在,也就是说无论查找的文本内容是否存在,都返回0。它是从返回的缓冲区扫描而不是在接收的页面中查找。这是比web_find更高效的一个函数;

    2)由于是在缓冲区查找,所以要放在被查找函数的前面。

    3web_reg_find中会统计注册的次数,所以SaveCount这个变量会存着注册次数的统计。

    如下图为示例LoadRunner检查点函数介绍

    四、web_global_verfication()函数用的特别少,

    展开全文
  • 其实解决win10系统提示“梦幻西游已停止工作的问题也不是难事,小编这里提示两:1、在windows10系统中打开360安全卫士,点击顶部的“功能大全”标签,找到“网络修复(Lsp)”; 2、打开“网络修复(Lsp)”后,进入如...
  • Terminal怎么停止VUE项目

    千次阅读 2021-01-30 13:55:02
    输入vue init webpack 项目包名字 项目名输入 项目描述 ESLint 代码检查工具 使用了会对你代码格式进行严格检查 测试工具是否使用 完成项目创建 6.项目创建后 主要文件在src中建立 主页为index.html package.json为...
  • Loadrunner常见的检查点函数

    千次阅读 2016-05-17 13:29:12
    LoadRunner中执行Web性能测试,很重要的一点,是需要对Web网站的响应进行一些检查,以决定请求是否成功,这很重要,如果设置不好,就会出现请求大面积失败,性能却非常高的情况。 一般,在Loadrunner中检查点有两...
  • loadrunner插入检查点详解

    万次阅读 2014-07-17 09:13:12
    LR检查点  设置检查点的目的不只是为了验证我们的脚本没有错误,而更重要的是一个规范问题,如何使得测试结果更具有说服力,因此建议所有的测试脚本中都添加检查点设置。  推荐最好在录制过程中添加Text/Image...
  • 关于这几种文件和命令对mysql服务的启动和停止的使用,本文会分别进行介绍,还有一些关键的事项,比如生产环境对于MySQL服务的启动和停止是非常谨慎的一件事,不是每一种方式都适合生产使用的,需要搞清楚再使用,...
  • 其他 2019/08/03 苹果手机自带的Safari浏览器如何开启网页检查器 苹果手机自带的Safari浏览器如何开启网页检查器 Safari上的网页检查器可以检测访问的网站是否正常.那么如何开启网页检查器呢?今天就跟大家介绍一下...
  • LoadRunner检查点使用小结

    万次阅读 2016-02-13 18:49:15
    在loadrunner中可以添加检查点,以检查从服务器返回的内容是否正确。  添加检查点方法:将脚本切换到Tree View,右键单击要检查内容,选择Insert After或Insert Before,在弹出窗口中选择Web Checks-Image Check...
  • 三星手机恢复出厂设置之后,出现SecSetupWizard已停止的错误,哪吒游戏网给大家带来详细的三星手机恢复出厂设置之后,出现SecSetupWizard已停止的错误介绍,大家可以阅读一下,希望这篇三星手机恢复出厂设置之后,...
  • ArcMap进行数据拓扑检查

    千次阅读 2021-08-20 10:16:53
    创建地理数据库拓扑,检查数据问题,修正数据问题,验证地理数据库拓扑。
  • 今天无意发现我们公司网站只要在...不管是网站的首页,还是产品的页面地址,以及在线支付的地址,都会被微信提示:已停止访问该网页,据用户投诉及腾讯网址安全中心检测,该网页包含违法或违规内容。为维护绿色上...
  • 今天早晨发现我们公司网站...不管是网站的首页,还是产品的页面地址,以及在线支付的地址,都会被微信提示:已停止访问该网页,据用户投诉及腾讯网址安全中心检测,该网页包含违法或违规内容。为维护绿色上网环境...
  • js停止(阻止)浏览器继续加载内容

    万次阅读 2016-09-02 18:19:27
    js停止(阻止)浏览器继续加载内容
  • nginx后端节点的健康检查

    千次阅读 2018-11-18 00:18:44
    本文主要介绍nginx后端节点的健康检查,在此之前我们先来介绍下nignx反向代理主要使用的模块。 模块介绍 我们在使用nginx做反向代理都会使用到以下两个模块: 1.ngx_http_proxy_module 定义允许将请求传递到另一...
  • Altium Designer之DRC检查学习笔记

    千次阅读 2020-05-24 14:38:13
    通过检查来判定是否满足设计的要求,需要检查什么,就打开相关的检查选项,该设置涉及检查PCB板内容,需要每次都重新配置相关内容。具体操作的方法如下: 1:执行菜单命令“工具→设计规则检查(快捷键“TD”),...
  • 停止 OGG

    千次阅读 2015-01-28 10:10:18
    2. 进入 OGG 安装目录/ggs,执行./ggsci 进入命令行模式 3. 验证 OGG 的抽取进程重起所需的日志是否存在,对各个 extl1 进程分别执行命 ...GGSCI>info extl1,showch //查询 extl1 进程回滚检查点 Read
  • Altium显示DRC错误的检查方法

    千次阅读 2020-12-20 01:09:42
    Altium有时候总是显示DRC错误,不知道哪里出了问题,下面小编带大家学习一下常见的DRC检查有哪些?前期为了满足各项设计的要求,我们会设置很多约束规则,当一个PCB单板设计完成之后,通常要进行DRC(Design Rule ...
  • 结果无毒(换了多种杀软,均报无毒) 检查服务依赖关系,发现所需的RPC服务已经正常开启。 怀疑非正常关机,造成“Print Spooler服务”启动文件“spoolsv.exe”损坏。从其他机子上拷了一个spoolsv.exe来。覆盖,重启...
  • 如何在Java中启动/停止/重启线程?

    千次阅读 2021-03-13 03:20:31
    10 个答案:答案 0 :(得分:41)一旦线程停止,您就无法重新启动它。但是,没有什么可以阻止您创建和启动新线程。选项1:创建一个新线程,而不是尝试重新启动。选项2:而不是让线程停止,让它等待,然后当它收到通知时...
  • 学习vue的过程中,看到老师熟练地运用浏览器的检查功能,获得数据标签,我酸了, 于是紧急加补 CSDN Chrome 功能 element 上面是HTML结构面板。下面是操作dom样式、结构、时间的显示面。 可以定位各种元素 ...
  • 本文会包含如下内容: master与worker交互的消息处理器 海豚调度如何停止、暂停运行中的流程实例 任务执行线程的的类设计 可能存在的问题 本篇文章适合人群:架构师、技术专家以及对任务调度非常感兴趣的高级...
  • 如何让java程序执行一段时间后停止

    千次阅读 2020-11-09 14:08:46
    如何让java程序执行一段时间后停止 ...实际上,我们希望只处理某一特定时间之前的内容,在此之后,我们希望停止执行,并显示列表在此时间之前处理的内容。 代码例子如下: long start = System.currentTimeMillis()
  • Linux监控程序运行/停止+邮件通知

    千次阅读 2021-01-12 21:24:03
    判断程序是否运行或停止 发送邮件 判断程序是否运行或停止 首先运行并测试下面代码,将QQ换成要监控的进程名称 sudo vim monitor.sh # 创建文件 #将下面文件复制到monitor.sh中 chmod +x monitor.sh # 添加运行权限...
  • 网关作为流量的入口,承上启下的中枢,对上游节点的健康状态监测是比不可少的;若上游节点异常,网关需要动态摘除此节点,避免流量... 目前本人负责的网关是基于orange二次开发的,health_check健康检查功能是基于插...
  • Oracle启动和停止的方式详解

    千次阅读 2016-09-28 20:00:05
    不允许新的连接、不等待会话结束、不等待事务结束、做一个检查点并关闭数据文件。没有结束的事务是自动ROLLBACK的。启动时不需要实例恢复。 shutdown abort 直接关闭数据库,正在访问数据库的会话会被...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 324,141
精华内容 129,656
热门标签
关键字:

停止点检查内容