Flink应用高可用方案探索

一、为什么要做高可用

由于依赖Flink应用A下游服务非常重要,对应用A所提供数据的实时性、可靠性要求比较高。所以对应用A进行了高可用改造,运行在两个独立的flink上,保障不会由于某个flink集群故障而影响下游服务。在探索过程中落地经历了从双活到热备的转变,下面将对这一历程进行回顾。

二、单集群运行

图1

Kafka Source Connector消费数据,经过计算后将计算后的数据写入kafka另外一个topic。写入topic有两个地方。其中Sink直接将数据流写入kafka。ProcessFunction注册了定时器,当一条数据过来后会注册一个定时器,当一个设备的数据一段时间没有流入将会生成一条离线数据写入到kafka。高可用要保证的就是Sink和ProcessFunction数据能够可靠得写入到kafka。

三、高可用阶段一:双活

图2

程序分别跑在两个集群。集群1和集群2在写入kafka前,先通过REDIS的SETNX来设置值,当设置成功时才发送数据到kafka。这种方式经过测试发现存在乱序的情况。由于无法保证先抢到发送权的,一定先发送kafka

如果在前一条记录发送kafka成功之后,记录一个发送成功状态。读取到这个状态后才允许进行下一条数据的发送可以强行保证有序。但这样做会导致数据时效性低下、程序复杂度升高、落地难,总之此路不通。

四、高可用阶段二:热备

两个集群同时发送kafka数据不行,那么就只让一个集群发送数据。当单个集群出现故障无法恢复,快速用另一个集群替代进行业务数据处理。

图3

我们将当前负责发送数据到下游的集群称为主集群,将不发送数据处于待命状态的集群称为备集群。上图中集群1为主集群,集群2为备集群。为了保证主集群出现故障,切换到备集群的时候不丢数据,备集群的消费进度一定要晚于主集群。

有几个需要回答的问题摆在面前:

  • 如何实现备集群跟随主集群处理进度?
  • 备集群与主集群消费差距应该是多少?
  • 切换后的的重复数据发不发?

1.如何实现备集群跟随主集群处理进度

主集群负责记录处理进度,按照topic-partition粒度记录处理的offset。备集群负责读取前者记录的进度进行降速。为保证代码的简洁和小的复杂度,将记录进度和根据进度降速放在同一个环节处理。

在消费环节还是在其他环节降速面临不同的问题。消费环节控制会导致备集群切换为主集群时,前文中ProcessFunction少量注册的离线定时器误报。在其他环节控制会导致背压,checkpoint失败,且不容易对数据进度进行控制。经过权衡,选择在消费环节控制。

2.备集群与主集群消费差距应该是多少

差距当然是在切换后不漏数据的前提下越接近越好。

下面讨论最近可以多近?

给个反例,集群2是备集群,集群1是主集群,集群2紧随集群1的进度之后。集群1从kafka读取到数据时记录offset,目前记录为9。集群1在处理完数据6时完成了一次checkpoint,目前消费到了数据9(图4),此时7、8虽然消费了,但是没有到达Sink(图5)。集群2此时读取到数据8。

假如集群1这个时候出现故障宕机,切换到集群2,数据7将会丢失。

所以要保证备集群消费的进度在已发送下游数据之后。主集群在一次完整的checkpoint做完后写入offset可以保证备集群不漏数据。

图4
图5

3.切换后的的重复数据发不发

在当前实现中依赖下游系统幂等处理来做到整体的EXACTLY ONCE。

4.整个主备集群协同步骤的描述

1.主集群消费kafka数据,checkpoint成功后,在提交kafka offset的同时,将kafka offset记录到redis中;
2.备集群读取redis中得到当前主集群offset消费进度。消费kafka数据,当数据中对应topic的partition的offset大于或者等于redis中的offset-1则丢弃这条数据(由于Flink中做checkpoint时提交的kafka消费offset是由source emit到下游的kafka数据驱动的),并且调用consumer的pause停止消费指定partition;
3.指定时间(目前是10秒)后会调用consumer的resume方法唤醒备集群的指定partition,当消费的数据仍然满足暂停条件则继续步骤2;
4.主备集群根据配置在apollo中的当前主集群id来知道自己是否是主集群。当主集群切换为备集群时则根据redis中的值呈现跟随状态,备集群切换为主集群则呈现记录redis状态。主集群推送数据到下游,备集群不推数据。

5.一些细节

最终落地基于

org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer09,
org.apache.flink.streaming.connectors.kafka.internal.Kafka09Fetcher,
org.apache.flink.streaming.connectors.kafka.internal.KafkaConsumerThread

进行二次开发,加入热备模块。其中进度offset提交操作在:
org.apache.flink.streaming.connectors.kafka.internal.KafkaConsumerThread 的 setOffsetsToCommit方法,此方法由上层实现了以下接口的类调用

/**
 * This interface must be implemented by functions/operations that want to receive
 * a commit notification once a checkpoint has been completely acknowledged by all
 * participants.
 */
@PublicEvolving
public interface CheckpointListener {

   /**
    * This method is called as a notification once a distributed checkpoint has been completed.
    * 
    * Note that any exception during this method will not cause the checkpoint to
    * fail any more.
    * 
    * @param checkpointId The ID of the checkpoint that has been completed.
    * @throws Exception
    */
   void notifyCheckpointComplete(long checkpointId) throws Exception;
}

为提高可靠性对redis的访问增加熔断降级机制。当一段时间redis出现访问异常,会暂时不访问,降级窗口结束后会继续访问。

五、结语

最终应用A高可用方案以热备落地,主要是解决单个集群长时间无法恢复的问题。目前不同集群使用同一份checkpoint技术层面已经落地,后面可以有冷备方案,当主机群宕机后,备集群读取主机群的checkpoint文件数据启动继续服务。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354