Flume之Failover和Load balancing原理及实例

【flume】flume 的 负载均衡 load-balance、容错 failover 文章目录前言load-balance负载均衡介绍配置Failover 容错介绍配置 前言 之前的conf主要是单机的flume部署操作,这篇讲下集群的flume部署操作,可以先看前两篇。 集群 load-balance负载均衡 介绍 负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法。 Load balancing Sink Processor 能够实现 load balanc... 阅读详情

Failover Sink Processor

Failover Sink Processor维护了一个sink的优先级列表,具有故障转移的功能,具体的配置如下(加粗的必须配置):

 

属性名称默认值描述
sinks–多个sink用空格分开。
processor.typedefault组件的名称,必须是:failover
processor.priority.<sinkName>–优先级值。<sinkName> 必须是sinks中有定义的。优先级值高Sink会更早被激活。值越大,优先级越高。
注:多个sinks的话,优先级的值不要相同,如果优先级相同的话,只会有一个生效。且failover时,同优先级的不会Failover,就算是同优先级的还存在也会报All sinks failed to process。
processor.maxpenalty30000失败的Sink最大的退避时间(单位:毫秒)(退避算法(退避算法为我们在解决重试某项任务的时候,提供了一个比较好的等待思想。),参考:http://qiuqiang1985.iteye.com/blog/1513049)

示例:

a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = failover
a1.sinkgroups.g1.processor.priority.k1 = 5
a1.sinkgroups.g1.processor.priority.k2 = 10
a1.sinkgroups.g1.processor.maxpenalty = 10000

Load balancing Sink Processor

Load balancing sink processor 提供了多个sinks负载均衡的能力。它维护了一个active sinks列表,该列表中的负载必须是分布式的。实现了round_robin(轮询调度) 或者 random(随机) 的选择机制,默认是:round_robin(轮询调度)。也可以通过继承AbstractSinkSelector类来实现自定义的选择机制。
当被调用时,选择器根据配置文件的选择机制挑选下一个sink,并且调用该sink。如果所选的Sink传递Event失败,则通过选择机制挑选下一个可用的Sink,以此类推。

 

属性名称默认描述
processor.sinks–多个sink用空格分开。
processor.typedefault组件的名称,必须是:load_balance
processor.backofffalse是否以指数的形式退避失败的Sinks。
processor.selectorround_robin选择机制。必须是round_robin, random 或者自定义的类,该类继承了AbstractSinkSelector
processor.selector.maxTimeOut30000默认是30000毫秒,屏蔽故障sink的时间

 

示例:

a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.backoff = true
a1.sinkgroups.g1.processor.selector = random

 

Failover和Load balancing实例

 

测试环境:

10.0.1.76(Client)

10.0.1.68 (Failover和Load balancing)

10.0.1.70

10.0.1.77

10.0.1.85

10.0.1.86

10.0.1.87

以10.0.1.76作为客户端,通过exec获取nginx的日志信息,然后将数据传到10.0.1.68(配置了Failover和Load balancing)的节点,最后10.0.1.68将数据发送的10.0.1.70,77,85,86,87节点,这些节点最终将数据写到本地硬盘。

10.0.1.76的配置:

 

a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
      
a1.sources.r1.channels = c1
a1.sources.r1.type = exec
a1.sources.r1.command = tail -n 0 -F /home/nginx/logs/access.log 

a1.sinks.k1.type = avro
a1.sinks.k1.channel = c1
a1.sinks.k1.hostname = 10.0.1.68
a1.sinks.k1.port = 41415

a1.channels = c1
a1.sources = r1
a1.sinks = k1

获取nginx产生的日志,然后通过avro发送的10.0.1.68

 

 

10.0.1.68配置(配置A):

 

a1.channels = c1
a1.sources = r1
a1.sinks = k70 k77 k85 k86 k87

a1.sinkgroups = g1 g2 g3
a1.sinkgroups.g1.sinks = k70 k85
a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.selector = round_robin
a1.sinkgroups.g1.processor.backoff = true

a1.sinkgroups.g2.sinks = k70 k86
a1.sinkgroups.g2.processor.type = failover  
a1.sinkgroups.g2.processor.priority.k70 = 20
a1.sinkgroups.g2.processor.priority.k86 = 10
a1.sinkgroups.g2.processor.maxpenalty = 10000 

a1.sinkgroups.g3.sinks = k85 k87 k77
a1.sinkgroups.g3.processor.type = failover
a1.sinkgroups.g3.processor.priority.k85 = 20
a1.sinkgroups.g3.processor.priority.k87 = 10
a1.sinkgroups.g3.processor.priority.k77 = 5
a1.sinkgroups.g3.processor.maxpenalty = 10000

a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

a1.sources.r1.channels = c1
a1.sources.r1.type = avro
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = 41415

a1.sinks.k87.channel = c1
a1.sinks.k87.type = avro
a1.sinks.k87.hostname = 10.0.1.87
a1.sinks.k87.port = 41414

a1.sinks.k86.channel = c1
a1.sinks.k86.type = AVRO
a1.sinks.k86.hostname = 10.0.1.86
a1.sinks.k86.port = 41414

a1.sinks.k85.channel = c1
a1.sinks.k85.type = AVRO
a1.sinks.k85.hostname = 10.0.1.85
a1.sinks.k85.port = 41414

a1.sinks.k77.channel = c1
a1.sinks.k77.type = AVRO
a1.sinks.k77.hostname = 10.0.1.77
a1.sinks.k77.port = 41414

a1.sinks.k70.channel = c1
a1.sinks.k70.type = AVRO
a1.sinks.k70.hostname = 10.0.1.70
a1.sinks.k70.port = 41414

10.0.1.70和10.0.1.85Load balancing,均衡的方式为轮询调用。10.0.1.70和10.0.1.86为Failover,10.0.1.70和10.0.1.87为Failover

 


10.0.1.70,77,85,86,87配置:

 

a1.channels = c1
a1.sources = r1
a1.sinks = k1
      
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

a1.sources.r1.channels = c1
a1.sources.r1.type = AVRO
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = 41414

a1.sinks.k1.channel = c1
a1.sinks.k1.type = file_roll
a1.sinks.k1.sink.directory = /data/load/
a1.sinks.k1.sink.rollInterval = 0

通过Avro获取到Event,存放到文件中。

 

 

每次往nginx发2w个请求,然后查看10.0.1.70,77,85,86,87四台服务器接受数据的情况。我们做几组测试:

注:表格中的 * 表示关闭关闭该服务器Flume进程。

测试一:

发送2w个请求到Nginx中,查看各个节点接受数据的行数:

服务器

10.0.1.70

10.0.1.77

10.0.1.85

10.0.1.86

10.0.1.87

总计

数据行数

3400

0

3459

6778

6363

20000

其实无论测试2w次请求,还是测试100w次请求,10.0.1.77都无法接受到数据。

测试二:

 

服务器

10.0.1.70

10.0.1.77

10.0.1.85

10.0.1.86

10.0.1.87(*)

总计

数据行数

6619

6300

6840

13878

6363

40000

 

问题1: 作为Failover的节点86,87为何可以接受数据,而77没有将接收数据呢?

作为failover,我们会认为只有一个节点生效,其他节点只有在优先级节点down掉才能替补上去,在Flume中关于failover的实现,首先我们要了解Flume加载配置文件是有顺序的。如果配置文件的顺序不同,会导致failover出乎我们的意料,现在我们把上面的(配置A)关于failover和load_balance修改成如下(部分代码):

 

......
a1.sinkgroups = g2 g1 g3
a1.sinkgroups.g3.sinks = k70 k85
a1.sinkgroups.g3.processor.type = load_balance
a1.sinkgroups.g3.processor.selector = round_robin
a1.sinkgroups.g3.processor.backoff = true

a1.sinkgroups.g2.sinks = k70 k86
a1.sinkgroups.g2.processor.type = failover  
a1.sinkgroups.g2.processor.priority.k70 = 20
a1.sinkgroups.g2.processor.priority.k86 = 10
a1.sinkgroups.g2.processor.maxpenalty = 10000 

a1.sinkgroups.g1.sinks = k85 k87 k77
a1.sinkgroups.g1.processor.type = failover
a1.sinkgroups.g1.processor.priority.k85 = 20
a1.sinkgroups.g1.processor.priority.k87 = 10
a1.sinkgroups.g1.processor.priority.k77 = 5
a1.sinkgroups.g1.processor.maxpenalty = 10000
......

如果修改成如下的配置,启动时报如下错误:

 

 

WARN 2015-10-22 14:22:01 [org.apache.flume.conf.FlumeConfiguration] - Could not configure sink group g3 due to: No available sinks for sinkgroup: g3. Sinkgroup will be removed
org.apache.flume.conf.ConfigurationException: No available sinks for sinkgroup: g3. Sinkgroup will be removed
    at org.apache.flume.conf.FlumeConfiguration$AgentConfiguration.validateGroups(FlumeConfiguration.java:754)
    at org.apache.flume.conf.FlumeConfiguration$AgentConfiguration.isValid(FlumeConfiguration.java:348)
    at org.apache.flume.conf.FlumeConfiguration$AgentConfiguration.access$0(FlumeConfiguration.java:313)
    at org.apache.flume.conf.FlumeConfiguration.validateConfiguration(FlumeConfiguration.java:127)
    at org.apache.flume.conf.FlumeConfiguration.<init>(FlumeConfiguration.java:109)
。。。。。。

报异常的原因,我们可以查看源码,找到答案,FlumeConfiguration类的isValid()方法:

 

 

      sourceSet = validateSources(channelSet);
      sinkSet = validateSinks(channelSet);
      sinkgroupSet = validateGroups(sinkSet);

上述是主要的源码片段,可以Debug进去看看,大致的流程:以validateGroups为例,Flume根据sinkgroups顺序的解析配置文件,然后把sink放到变量名为usedSinks的Map当中,每个sink只能使用一次,如果sink在前面某个sinkgroups已经使用,那么就会在该sinkgroups中删除这个sink。按上面的配置,Flume开始解析sinkgroups的g1,则g1包含k85,k87和k77三个有效sink;然后解析sinkgroups的g2,则g2包含k70和k86;解析sinkgroups的g3时,因为k70和k85已经在g1和g2存在了,所以g3包含的sink为空,才导致报如上的错误。也就是说Flume是根据usedSinks来实现failover和load_balance的,因为配置的原因,可能会跟你想象的效果相差甚远。

 

在AbstractConfigurationProvider类的getConfiguration方法,代码片段:

 

  public MaterializedConfiguration getConfiguration() {
    MaterializedConfiguration conf = new SimpleMaterializedConfiguration();
    FlumeConfiguration fconfig = getFlumeConfiguration();//加载和验证配置文件的入口
    AgentConfiguration agentConf = fconfig.getConfigurationFor(getAgentName());
    if (agentConf != null) {
      Map<String, ChannelComponent> channelComponentMap = Maps.newHashMap();
      Map<String, SourceRunner> sourceRunnerMap = Maps.newHashMap();
      Map<String, SinkRunner> sinkRunnerMap = Maps.newHashMap();
      try {
        loadChannels(agentConf, channelComponentMap);//初始化channel
        loadSources(agentConf, channelComponentMap, sourceRunnerMap);//初始化source
        loadSinks(agentConf, channelComponentMap, sinkRunnerMap);//初始化sink
......

验证完之后,加载Channels,Sources,Sinks,根据验证的结果g1,g2,g3的usedSinks分配如下(配置A):

 

g1 的usedSinks是:k70和k85

g2 的usedSinks是:k86

g3 的usedSinks是:k87,k77

以loadSinks为例,加载Sink,先调用AbstractConfigurationProvider类的loadSinks方法,然后调用loadSinkGroups方法来初始化Sink,g1的usedSinks有k70和k85,所以k70和k85这两个节点通过round_robin方式balance来接收数据;g2的usedSinks只有k86(由于k70已经在g1中被占用了),所以只有k86接收数据,自然也不会有failover的功能;g3的usedSinks有k87和k77,由于Failover会选取优先级最高的接收数据,所以k87接收数据,当k87挂掉的时候,k77替补上去接收数据。这也就是为何其他节点都可以接收数据,唯独只有k77没有数据的原因。

再者每个sinkgroups都会启动一个SinkRunner线程去调用FailoverSinkProcessor和LoadBalancingSinkProcessor的process()方法去获取数据,这也就是为啥Failover和balance都能接收数据的原因,具体的实现细节,可以自行阅读源码。

 

2,Failover的情况下,是否优先级越高的就先生效?

是的,同一个Failover下的sink都存放在TreeMap下,然后取最大优先级的Sink作为activeSink。

 

3,Failover的情况下,如果优先级相同是怎么做失败转移的?

优先级相同的sink节点在failover中只会有一个生效,看源码可以很容易的发现,因为Failover中live的Sink存放在TreeMap中,用优先级作为key,同等优先级的Sink只能保存一个。

 

@Override
  public void configure(Context context) {
    liveSinks = new TreeMap<Integer, Sink>();  //存活的Sink放在TreeMap中,且用priority作为Key
    failedSinks = new PriorityQueue<FailedSink>();
    Integer nextPrio = 0;
    String maxPenaltyStr = context.getString(MAX_PENALTY_PREFIX);
    if(maxPenaltyStr == null) {
      maxPenalty = DEFAULT_MAX_PENALTY;
    } else {
      try {
        maxPenalty = Integer.parseInt(maxPenaltyStr);
      } catch (NumberFormatException e) {
        logger.warn("{} is not a valid value for {}",
                new Object[] { maxPenaltyStr, MAX_PENALTY_PREFIX });
        maxPenalty  = DEFAULT_MAX_PENALTY;
      }
    }
    for (Entry<String, Sink> entry : sinks.entrySet()) {
      String priStr = PRIORITY_PREFIX + entry.getKey();
      Integer priority;
      try {
        priority =  Integer.parseInt(context.getString(priStr));
      } catch (Exception e) {
        priority = --nextPrio;
      }
      if(!liveSinks.containsKey(priority)) {
        liveSinks.put(priority, sinks.get(entry.getKey()));//priority作为Key
      } else {
        logger.warn("Sink {} not added to FailverSinkProcessor as priority" +
            "duplicates that of sink {}", entry.getKey(),
            liveSinks.get(priority));
      }
    }
    activeSink = liveSinks.get(liveSinks.lastKey());//获取优先级最高的节点作为active节点
  

 

总结

1,load_balance配置中的Sink都可以接收数据。

2,load_balance根据均衡策略接收数据。

3,没有Sink既能failover又能load_balance。

4,failover中的Sink优先级不要设置为相同的值。

5,failover配置中的Sink只有优先级最高及没有被之前加载的sinkgroups占用的Sink接收数据,如果优先级高的Sink挂掉,则转到优先级次之的Sink。

6,failover可以做失败转移,如果因为加载顺序的问题,导致failover的Sink已经被占用,failover会造成配置在failover中的sink都能接收数据的假象,其实只是在剩余的sink中实施failover策略。

 

Flume Sink组、Sink处理器 前言 Sink运行器(Sink Runner)运行一个Sink组(Sink Group),Sink组可以含有一个或多个Sink。如果组中只存在一个Sink,那么没有组将会更有效率。Sink运行器仅仅是一个询问Sink组(或Sink)来处理下一批事件的线程。每个Sink组有一个Sink处理器(Sink Processor),处理器选择组中的Sink之一去处理... 阅读详情

相关推荐

Flume NG 学习笔记(七)Sink Processors(故障转移与负载均衡)测试

Sink groups允许组织多个sink到一个实体上。 Sink processors能够提供在组内所有Sink之间实现负载均衡的能力,而且在失败的情况下能够进行故障转移从一个Sink到另一个Sink。 简单的说就是一个source 对应一个Sinkgroups,即多个sink,这里实际上与第六节的复用/复制情况差不多,只是这里考虑的是可靠性与性能,即故障转移与负载均衡的设置。 下面是官方配

顾晓艳的专栏 9158

Flume负责均衡和容错(load-balance、failover)

负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法。 Load balancing Sink Processor能够实现load balance功能,如下图Agent1是一个路由节点,负责将Channel暂存的Event均衡到对应的多个Sink组件上,而每个Sink组件分别连接到一个独立的Agent上,示例配置,如下所示: 具体配置内容: a1.sinkgroups = g1...

beishanyingluo的博客 419

Flume 的 load-balance(负载均衡)、failover(容错)

负载均衡 负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法。Load balancing Sink Processor 能够实现 load balance 功能,如下图 Agent1 是一个路由节点,负责将 Channel 暂存的 Event 均衡到对应的多个 Sink组件上,而每个 Sink 组件分别连接到一个独立的 Agent 上,示例配置,如下所示: a1.sinkg...

aiyin9511的博客 485

Oracle RAC Failover 详解

Oracle  RAC 同时具备HA(High Availiablity) 和LB(LoadBalance). 而其高可用性的基础就是Failover(故障转移). 它指集群中任何一个节点的故障都不会影响用户的使用,连接到故障节点的用户会被自动转移到健康节点,从用户感受而言, 是感觉不到这种切换。   Oracle 10g RAC 的Failover 可以分为3种:1. Client-Side C

David Dai -- Focus on Oracle 2万+

【信息科学与工程学】【通信工程】计算机科学与自动化——第二百三十三篇 云NaaS服务 系列二02

字段内容类型​云网络自定义路由表(Custom Route Table):允许用户自定义 VPC 或子网的路由规则,控制流量走向,支持黑白名单、策略路由。端计算节点->边缘计算节点->边缘DC->中心云的网络情况及存储需求及配置情况列表​端计算节点为 VPC 内的云资源。边缘计算节点不适用。边缘 DC 和中心云为路由表管理平台。存储需求:路由条目存储于数据库。网络:路由表在虚拟路由器中执行。QoS:无。网络的端到端配置(从接入到汇聚到核心)​。

weixin_49199313的博客 330

通达信抓波段指标(主图)

VAR3:=IF(INBLOCK('科创板'),VART20,IF(INBLOCK('创业板') AND DATE>1200823,VART20,IF(INBLOCK('ST板块'),VART5,VART10)));VAR5:=IF(INBLOCK('科创板'),CT20,IF(INBLOCK('创业板') AND DATE>1200823,CT20,IF(INBLOCK('ST板块'),CT5,CT10)));曾涨停/紫色细K线:青字"炸",涨停未封住。曾跌停/蓝色细K线:红字"撬",跌停被打开。

q125500612的博客 2137

Flume组件——grouping processor(failover sink processor—实现级联模式下的高可用)

Flume中有多个组件,其中最重要的一个组件就是grouping processor / sink processor sink process

LOGAN'S BLOG 468

FPGA AXI DDR3读写时序调试与FIFO缓存实战解析

本文深入解析FPGA中AXI协议与DDR3的读写时序调试,重点探讨FIFO缓存在数据流控制中的关键作用。通过实战案例详细讲解突发传输中的地址对齐、数据分片等常见问题,并提供状态机设计、仿真波形分析和性能优化技巧,帮助开发者高效解决高速数据存储场景下的时序同步与数据一致性问题。

blockchain9miner的博客 1120

Flume Sink 组与负载均衡:提高数据收集可靠性与效率的实践指南

本文深入解析 Apache Flume 中 Sink 组的 Failover 与 Load Balancing 两种策略的原理,详细说明配置方法,并提供性能调优建议,帮助读者构建高可用的数据收集系统。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 3409

部署与可视化系统:零基础到精通:LabVIEW 调用 YOLO 动态链接库(DLL)的保姆级视觉检测系统融合实战

LabVIEW与YOLO26深度集成:工业视觉检测新范式 本文揭示了LabVIEW与最新YOLO26模型深度集成的创新方案,通过C++封装ONNX Runtime为DLL,在LabVIEW中实现端到端视觉检测。核心突破点包括: 技术选型:对比YOLOv5/YOLOv8/YOLO26性能,YOLO26在CPU推理速度提升43%,支持NMS-Free端到端推理 部署架构:提供ONNX Runtime C++ API和TensorRT两种DLL封装路径,适配不同硬件环境 工程实现:详细展示从PyTorch模型导出

ZXSXJ的博客 282

POCV/SOCV 、LVF的差别

1.POCV与OCV、AOCV 为了模拟片上PVT的差异带来的影响,最早提出了OCV(On Chip Variation)给每个cell都设置一个固定的derate值,来覆盖最悲观的情况,但是随着工艺发展,设计规模增大,OCV过度的悲观开始限制性能,于是又有了AOCV(Advanced On Chip Variation),用基于depth和distance的derate来取代单一的全局的derate值,但时序收敛的过程中逻辑级数depth的变化让时序分析的时间变得非常长,由此POCV诞生了。 POCV

m0_61544122的博客 5364

Flume 多 Sink 负载均衡完全指南:从配置到最佳实践

在数据采集系统中,单点瓶颈往往成为制约整体吞吐量的关键因素。无论是 HDFS 写入能力不足,还是 Kafka 分区消费速度跟不上,都可能导致数据积压甚至丢失。多 Sink 负载均衡正是解决这一问题的利器——它允许你通过多个 Sink 并行处理数据,线性提升系统的输出能力。Flume 通过Sink Group机制,提供了开箱即用的负载均衡和故障转移能力。本文将深入剖析这一机制的工作原理,并通过详细的配置示例帮助读者掌握从基础到高级的实战技巧。场景推荐模式理由同等能力的 Sink线性提升吞吐量。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 2136

C++怎么学?零基础也可以,一份完整学习路线图助你搞定!

提供一条清晰、系统且实践导向的C++学习路径。从基础语法、面向对象、泛型编程、异常处理,逐步深入STL、智能指针、并发编程等现代C++高级特性。无论是新手还是希望提升,通过系统学习与项目实践,助您将理论知识转化为实际解决问题的能力。

Lion_Long的博客 4025

flume 负载均衡 详解

Flume 的负载均衡机制通过多种方式实现,包括在 Sink 层的负载均衡(如 Round Robin、Random 策略)、故障转移模式(Failover)以及多代理之间的数据传输。负载均衡的底层实现依赖于 Sink Processor 和 Selector 的逻辑,通过源代码可以看到 Flume 的负载均衡机制主要集中在 Sink 选择和切换上。

goTsHgo的博客 1543

代谢组数据分析(三十一):空间代谢组学分析从数据加载到通路分析的流程解析

空间代谢组学是一种先进的技术,能够在组织切片上以高分辨率检测代谢物分布,为理解生物代谢过程提供新视角。其分析流程包括数据获取、预处理、代谢物注释、差异表达分析、可视化、通路分析、聚类分析及空间相关代谢物分析等关键步骤。这些步骤帮助研究人员从海量数据中提取有价值信息,揭示代谢物的空间分布规律,发现潜在生物标志物,探索代谢通路调控机制。例如,SpaMTP等工具为全流程分析提供了强大支持,助力研究人员高效处理数据,深入理解代谢过程,为生物学研究和临床应用提供重要依据。

专注生信领域 919

C++和OpenGL实现3D游戏编程【连载7】——文字和汉字的显示(附源码)

上一节我们讨论了纹理在二维平面内不规则图形贴图的相关基础操作,本节我们开始了解游戏里文字以及汉字的显示方法。本节课我们将从基本的ASCII字符显示,拓展到中文字符的显示,最后再讲到纹理字符的显示,并对各种文字显示方法的优缺点和使用场景进行分析,这节课将使用到显示列表、兼容视图、屏幕图形转纹理等操作。

zhooyu的博客 1500

Flume之Failover和Load balancing原理

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33845477的博客 168

基于STM32设计的ECG+PPG人体参数测量系统(华为云IOT)(217)

该系统的核心是基于STM32F103RCT6微控制器,这是一种高性能、低功耗的嵌入式处理器,适用于各种复杂的控制和数据处理任务。系统利用先进的传感器技术,如光电传感器PulseSensor模块来准确测量人体脉搏血氧饱和度及心率(PPG),同时采用AD8232生物电信号采集模块捕捉并处理人体的心电图信号(ECG),从而全面反映用户的心脏活动状态。

1万+

Flume Sink组实战:从故障转移到负载均衡的完整配置指南

在大数据日志采集链路中,数据管道的高可用与流量分发是工程实践的关键。Flume作为常用的日志聚合工具,通过Source、Channel、Sink三层结构实现数据搬运,其中Sink组机制配合SinkProcessor,能够有效解决下游单一节点故障导致的链路中断问题。本文从生产环境真实故障切入,详细解析Failover故障转移与Load Balancing负载均衡两种处理器的原理差异,并给出Taildir Source下完整的配置模板与故障模拟实验。针对Sink组配置中的优先级、退避策略、selector选择、

weixin_32238157的博客 147

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

flume 学习总结

flume 总结 flume 总结 下载配置安装 1 下载 2 配置安装 flume 架构 agent 配置 1 source 配置 11 监听网络端口 12 监控文件 2 channel 配置 3 sink 配置 failover 和 load balancing failover load ba...

weixin_30642305的博客 97

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

logging-flume高可用性设计:故障恢复与负载均衡最佳实践

Apache Flume作为一款分布式、可靠且高可用的日志数据收集服务,其核心价值在于高效处理大规模日志数据的采集、聚合与传输。本文将深入探讨logging-flume的高可用性设计原理,重点解析故障恢复机制与负载均衡策略的最佳实践,帮助用户构建稳定可靠的数据传输管道。 ## 一、高可用架构核心组件解析 ### 1.1 故障转移处理器(Failover Sink Processor) Fai

gitblog_00096的博客 368

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

flume的SinkProcessor

-----------------------hadoop01--agent1------------------ #a1是agent的名称,a1中定义了一个叫r1的source,如果有多个,使用空格间隔 a1.sources = r1 a1.sinks = k1 k2 a1.channels = c1 a1.sinkgroups = g1 a1.sinkgroups.g1.sinks = k1 k2 #a1.sinkgroups.g1.processor.type = failover #a1.sink

qq_43662627的博客 513

Flume架构深度解析:从Source到Sink的事务机制与可靠性设计

在大数据采集领域,Flume作为高可靠的数据管道组件,其核心设计围绕Source、Channel、Sink三大组件展开。通过事务机制实现At Least Once语义,确保数据在采集、暂存、写入各环节的可靠性。理解其架构原理,有助于在日志聚合、事件流转等场景中合理选型与调优。本文深入拆解Flume的组件协作、事务流程与批量参数配置,结合实操案例,帮助工程师掌握数据不丢不重的关键技巧,提升采集链路的稳定性与性能。

weixin_34318272的博客 265
上一篇: Java序列化及serialVersionUID作用
下一篇: keepalived安装部署及Flume+keepalived高可用
qianshanding0708
博客等级 码龄11年 426粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值