Flume NG 配置参数说明

目录

一、Flume 的可恢复性

二、Flume 架构

1、Client

2、Event

3、Agent

4、Source

4.1 avro source

4.2 exec source

5、Channel

5.1 memory channel

5.2 file channel

6、Sink

6.1 hdfs sink

6.2 avro sink

6.3 hive sink

6.4 sink 转义符的支持

6.5 kafka sink

7、sink group

7.1 默认的 Sink Processor

7.2 故障转移 Sink Processor

7.3 负载均衡 Sink Processor


一、Flume 的可恢复性

靠 Channel。推荐使用 FileChannel,事件持久化在本地文件系统里(性能较差)。

特别注意:Flume 默认 30s 重新加载配置文件。

二、Flume 架构

官方文档:http://flume.apache.org/FlumeUserGuide.html

Flume 1.8 用户手册中文版:https://flume.liyifeng.net

1、Client

生产数据,运行在一个独立线程。

2、Event

Flume 将数据表示成 Event,数据结构很简单,具有一个主题和一个报头的集合。事件的主题是一个字节数组,通常通过 Flume 传送的负载。报头被称为一个 map,其中有字符串 key 和字符串 value,报头不是用来传输数据的,而是为了路由和跟踪发送事件的优先级和严重性。报头也可以用给事件增加事件 ID 或者 UUID。每个事件本质上必须是一个独立的记录,而不是记录的一部分。这也要求每个事件要适应 Flume Agent JVM 的内存,如果使用 File Channel 应该有足够的硬盘空间来支持。如果数据不能表示多个独立记录,Flume 可能不适用这样的案例。

3、Agent

Flume 运行的核心是 Agent,Agent 本身是一个 Java 进程,也是最小独立运行的单位,运行在日志收集节点 Agent 是一个完整的数据收集工具,含有三个核心组件,分别是 Source、Channel、Sink,Flume 基于数据流进行设计,数据流由事件(Event)贯穿始终。事件作为 Flume 的基本数据单位,携带日志数据(以字节数组形式)并且携带头信息,由 Agent 外部的数据源生成。

4、Source

Source 是从一些生产数据的应用中接收数据的活跃组件。也有自己生产数据的 Source,不过通常用于测试目的。Source 可以监听一个或多个网络端口,用于接收数据或者可以从本地文件系统读取数据,每一个 Source 必须至少连接一个 Channel。基于一些标准,一个 Source 可以写入多个 Channel,复制事件到所有或者部分的 Channel。Flume 提供了很多内置的 Source,支持 avro,log5j,syslog 和 http port(body 为 json 格式)。

Source 类型 说明
Avro 支持 Avro 协议,即 Avro RPC,内置支持
Thrift 支持 Thrift 协议,内置支持
Exec 基于 Unix 的命令在标准输出上产生数据
JMS 从 JMS 系统中读取数据
Spooling Directory 监控指定目录内数据变化
Netcat 监控某个端口,将流经端口的文本行数据作为 Event 输入
Sequence Gennerator 序列生产器的数据源,生产序列数据
Syslog 读取 syslog 数据,产生 Event,支持 UDP 和 TCP 协议
HTTP 基于 HTTP POST 或者 GT 方式的数据源,支持 JSON 等格式
Legacy 兼容 Flume OG 中的 Source(0.9.x 版本)

4.1 avro source

属性名 默认值 说明
channels -  
type - 类型名称 avro
bind - 需要监听的主机名或者 IP
port - 需要监听端口
threads - 工作线程最大线程数
selector.type   复制还是多路复制
selector.*   依赖于 selector.type 的值
interceptors - 空格分隔拦截器地址
interceptors.*    
compression-type none 压缩类型必须和 AvroSource 值相同
ssl false 是否启用 ssl 加密同时还要配置 keystore 和 keystore-password
keystore - 为 SSL 提供 Java 秘钥文件所在路径
keystore-password - 为 SSL 提供的 Java 秘钥文件密码
keystore-type JKS 秘钥库类型可以是“JKS”或者“PKCS12”
exclude-protocols SSLv3 空格指定分开的列表,用来指定在 SSL/TLS 协议中排除。SSLv3 将总是被排除除了所指定的协议
ipFilter false 如果需要为 netty 开启 ip 过滤,将此选项设置为 true
ipFilterRules - 配 netty 的 ip 过滤设置表达式规则

下面是官网提供的例子:

a1.sources = r1
a1.channels = c1
a1.sources.r1.type = avro
a1.sources.r1.bind = 10.10.10.10
a1.sources.r1.port = 4545
a1.sources.r1.channels = c1

4.2 exec source

属性名 默认值 说明
channels -  
type - 类型名称 exec
command - 要执行的命令
shell - 用于执行命令的 shell
restartThrottle 1000 毫秒为单位,用于声明等待多久后尝试重试命令
restart false 如果 cmd 挂了是否重启 cmd
logStdErr false 无论是否是标准错误都应该被记录
batchSize 20 同时发送到通道中的最大行数
batchTimeout 3000 如果缓冲区没有满,经过多长时间发送数据
selector.type   复制还是多路复制
selector.*   依赖于 selector.type 的值
interceptors - 空格分隔的拦截器列表
interceptors.*    

下面是官网提供的例子:

a1.sources = r1
a1.channels = c1
a1.sources.r1.type = exec
a1.sources.r1.command = for i in /path/*.txt; do cat $i; done
a1.sources.r1.shell = /bin/bash -c
a1.sources.r1.channels = c1

5、Channel

Channel 一般地被认为是被动的组件,负责缓存 Agent 已经接收但尚未写出到另外一个 Agent 或者存储系统的数据,虽然他们可以为了清理或者垃圾回收运行自己的线程。Channel 的行为很像队列,Source 把数据写入到他们,Sink 从他们中读取数据,多个 Source 可以安全地写入到相同的 Channel,并且多个 Sink 可以从相同的 Channel 进行读取,一个 Sink 只能从一个 Channel 进行读取,它可以保证只有一个 Sink 会从 Channel 读取一个指定的事件。

Channel 类型 说明
Memory Event 数据存储在内存中
JDBC Event 数据存储在持久化存储中
File Event 数据存储在磁盘文件中
Spilable Memory Event 数据存储在内存和硬盘上,当内存队列已满,将持久化到磁盘文件(不建议生产环境使用)
Pseudo Transaction 测试用途
Customm 自定义

5.1 memory channel

属性名称 默认值 说明
type - 类型名称 memory
capacity 100 存储在 channel 中的最大容量
transactionCapacity 100 从一个 source 中去或者给一个 sink,每个失误中的最大事件数
keep-alive 3 对于添加或者删除一个事件超时的秒钟
byteCapacityBufferPercentage 20 定义Channle中Event所占的百分比,需要考虑在Header中的数据。
byteCapacity see description 最大内存所有事件允许的总字节数

下面是官网提供的例子:

a1.channels = c1
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 10000
a1.channels.c1.byteCapacityBufferPercentage = 20
a1.channels.c1.byteCapacity = 800000

5.2 file channel

注意默认情况下,File Channel 使用检查点(checkpointDir)和在用户目录(dataDirs)上指定的数据目录。所以在一个 agent 下面启动多个 File Channel 实例,只会有一个 File channel 能锁住文件目录,其他的都将初始化失败。因此,有必要提供明确的路径的所有已配置的通道,同时考虑最大吞吐率,检查点与数据目录最好是在不同的磁盘上。

属性名称 默认值 说明
type - 类型名称 file
checkpointDir ~/.flume/file-channel/checkpoint checkp 所在目录
dataDirs ~/.flume/file-channel/data 以逗号分隔的用于存储日志文件的目录列表。在不同的磁盘上使用多个目录可以提高文件通道性能

下面是官网提供的例子:

a1.channels = c1
a1.channels.c1.type = file
a1.channels.c1.checkpointDir = /mnt/flume/checkpoint
a1.channels.c1.dataDirs = /mnt/flume/dat

6、Sink

连续轮询各自的 Channel 来读取和删除事件,Sink 将事件提送到下一阶段,并且(RPC Sink 的情况下)活到最终目的地。一旦下一阶段或者目的地中的数据是安全的,Sink 通过事务提交通知 Channel,可以从 Channel 中删除这些事件。

Sink 类型 说明
HDFS 数据写入到 HDFS
Hbase 数据写入到 Hbase
Logger 数据直接控制台输出
Avro 数据被转换成 Avro Event,然后发送到配置的 RPC 端口上
IRC 数据在 IRC 上进行回收
File Roll 数据存储到本地文件系统
Null 丢弃所有数据
Morphine Solor 数据发送到 Solr 搜索服务器(集群)
ElasticSearch 数据发送到 ElasticSearch 搜索服务器(集群)
Custome sink 自定义

6.1 hdfs sink

属性名称 默认值 说明
type - 类型名称 hdfs
hdfs.path - 写入 hdfs 的路径,需要包含文件系统表示,如:hdfs://namenode/flume/webdata/ 可以使用 flume 提供日期及 %{host} 表达式
hdfs.filePrefix FlumeData 写入 hdfs 的文件名前缀,可以使用 flume 提供的日期及 %{host} 表达式
hdfs.fileSuffix - 写入 hdfs 文件名后缀,如:.lzo、.log
hdfs.inUsePrefix - 临时文件名前缀,hdfs sink 会先往目标目录中写临时文件再根据相关规则重命名成最终文件
hdfs.inUseSuffix .tmp 临时文件的后缀名
hdfs.rollInterval 30 hdfs sink间隔多长将临时文件滚动成最终目标文件,单位:秒;如果设置成0,则表示不根据时间来滚动文件;注:滚动(roll)指的是,hdfs sink将临时文件重命名成最终目标文件,并新打开一个临时文件来写入数据
hdfs.rollSize 1024 当临时文件达到该大小(单位:bytes)时,滚动成目标文件;如果设置成 0,则表示不根据临时文件大小来滚动文件
hdfs.rollCount 10 当 events 数据达到该数量时候,将临时文件滚动成目标文件;如果设置成 0,则表示不根据 events 数据来滚动文件
hdfs.idleTimeout 0 当目前被打开的临时文件在该参数指定的时间(秒)内,没有任何数据写入,则将该临时文件关闭并重命名成目标文件
hdfs.batchSize 100 每个批次刷新到 HDFS 上的 events 数量
hdfs.codeC - 文件压缩格式,包括:gzip, bzip2, lzo, lzop, snappy
hdfs.fileType SequenceFile 文件格式 包括:SequenceFile, DataStream ,CompressedStream,当使用 DataStream 的时候,文本不会被压缩,不需要设置 hdfs.codeC,当使用 CompressedStream 的时候必须设置一个正确的 hdfs.codeC 的值
hdfs.maxOpenFile 5000 最大允许打开的 HDFS 文件数,当打开的文件数达到该值,最早打开的文件将会被关闭
hdfs.minBlockReplicas - 写入 HDFS 文件块的最小副本数,该参数会影响文件的滚动配置,一般将该参数设置成 1,才可以按照配置正确滚动文件
hdfs.writeFormat Writable 写入 sequence 文件的格式。包括:Text、Writable(默认)
hdfs.callTimeout 10000 执行 HDFS 操作的超时时间(单位:毫秒)
hdfs.threadsPoolSize 10 hhdfs sink 启动的操作 HDFS的线程数
hdfs.rollTimerPoolSize 1 hdfs sink 启动的根据时间滚动文件的线程数
hdfs.kerberosPrincipal - HDFS 安全认证 kerberos配置
hdfs.kerberosKeytab - HDFS 安全认证 kerberos配置
hdfs.proxyUser   代理用户
hdfs.round false 是否启用时间上的“舍弃”,这里的“舍弃”类似于“四舍五入”后面在介绍。如果启用,则会很影响除了除了 %t 的其他所有时间的表达式
hdfs.roundValue 1 时间上进行舍弃的值
hdfs.roundUnit second 时间上进行”舍弃”的单位,包含:second,minute,hour
hdfs.timeZone Local Time 时区

hdfs.useLocalTimeStamp

false 是否使用当地时间
hdfs.colseTries 0 hdfs sink 关闭文件的尝试次数;如果设置为 1,当一次关闭文件失败后,hdfs sink 将不会在尝试关闭文件,这个为未关闭的文件,将会一直留在那,并且时打开状态,设置为 0,当一次关闭失败后,hdfs sink 会继续尝试下一次关闭,直到成功
hdfs.retryInterval 180 hdfs sink 尝试关闭文件的时间间隔,如果设置为 0,表示不尝试,相当于将 hdfs.closeTries 设置为 1
serializer TEXT 列化类型。其他的还有:avro_event 或者是实现了 EventSerializer.Builder 的类名
serializer.*    

下面是官网提供的例子:

a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = hdfs
a1.sinks.k1.channel = c1
a1.sinks.k1.hdfs.path = hdfs://namenode/flume/%y-%m-%d/%H%M/%S
a1.sinks.k1.hdfs.filePrefix = events-
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute

6.2 avro sink

avro sink 主要用于 flume 分层结构。flume event 发送给这个 sink 的事件都会转换成 avro 事件,发送到配置好的 avro 主机和端口上。这些事件可以批量传输给通道。

属性名称 默认值 说明
type - 类型名称 avro
hostname - 要绑定到的主机名或 IP 地址
port - 监听端口

下面是官网提供的例子:

a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = avro
a1.sinks.k1.channel = c1
a1.sinks.k1.hostname = 10.10.10.10
a1.sinks.k1.port = 4545

6.3 hive sink

属性名称

默认值

说明

type - 类型名称 hive
hive.metastore - Hive metastore URI (eg thrift://a.b.com:9083 )
hive.database - Hive database name
hive.table - Hive table name
hive.partition - 逗号分隔的要写入的分区信息。 比如 hive 表的分区是(continent: string, country :string, time : string),那么“Asia,India,2014-02-26-01-21”就表示数据会写入到 continent=Asia,country=India,time=2014-02-26-01-21 这个分区。
hive.txnsPerBatchAsk 100 Hive 从 Flume 等客户端接收数据流会使用多次事务来操作,而不是只开启一个事务。这个参数指定处理每次请求所开启的事务数量。来自同一个批次中所有事务中的数据最终都在一个文件中。Flume会向每个事务中写入 batchSize 个event,这个参数和 batchSize  一起控制着每个文件的大小,请注意,Hive 最终会将这些文件压缩成更大的文件。
heartBeatInterval 240 发送到Hive的连续心跳检测间隔(单位:秒),以防止未使用的事务过期。设置为 0 表示禁用心跳。
autoCreatePartitions true Flume 将自动创建必要的 Hive 分区以流式传输
batchSize 15000 写入一个 Hive 事务中最大的event数量
maxOpenConnections 500 允许打开的最大连接数。如果超过此数量,则关闭最近最少使用的连接。
callTimeout 10000 Hive、HDFS I/O 操作的超时时间(毫秒),比如:开启事务、写数据、提交事务、取消事务。
timeZone Local Time 应用于解析分区中转义序列的时区名称,比如:America/Los_Angeles、Asia/Shanghai、Asia/Tokyo 等
useLocalTimeStamp false 替换转义序列时是否使用本地时间戳(否则使用 event header 中的 timestamp )
round false 滚动策略,是否启用时间上的“舍弃”,这里的“舍弃”类似于“四舍五入”后面在介绍。如果启用,则会很影响除了除了 %t 的其他所有时间的表达式。
roundValue 1 时间上进行舍弃的值
roundUnit minute 时间上进行”舍弃”的单位,包含:second,minute,hour
serializer   序列化器负责解析 event 中的字段并把它们映射到 hive 表中的列,选择哪种序列化器取决于 event 中的数据格式,支持的序列化器有:DELIMITED 和 JSON
serializer.delimiter , (类型:字符串)传入数据中的字段分隔符。 要使用特殊字符,请用双引号括起来,例如“\t”
serializer.fieldnames - 从输入字段到 Hive 表中的列的映射。 指定为 Hive 表列名称的逗号分隔列表(无空格),按顺序标识输入字段。 要跳过字段,请保留未指定的列名称。 例如, 'time,,ip,message'表示输入映射到 hive 表中的 time,ip 和 message 列的第1,第 3 和第 4 个字段。
serializer.serdeSeparator Ctrl-A 类型:字符)自定义底层序列化器的分隔符。如果 serializer.fieldnames 中的字段与 Hive 表列的顺序相同,则 serializer.delimiter 与 serializer.serdeSeparator 相同,并且 serializer.fieldnames 中的字段数小于或等于表的字段数量,可以提高效率,因为传入 event 正文中的字段不需要重新排序以匹配 Hive 表列的顺序。 对于 '\ t' 这样的特殊字符使用单引号,要确保输入字段不包含此字符。 注意:如果 serializer.delimiter 是单个字符,最好将本参数也设置为相同的字符。

下面是官网提供的例子:

## Example Hive table :
create table weblogs ( id int , msg string )
    partitioned by (continent string, country string, time string)
    clustered by (id) into 5 buckets
    stored as orc;
 
## Example for agent named a1:
a1.channels = c1
a1.channels.c1.type = memory
a1.sinks = k1
a1.sinks.k1.type = hive
a1.sinks.k1.channel = c1
a1.sinks.k1.hive.metastore = thrift://127.0.0.1:9083
a1.sinks.k1.hive.database = logsdb
a1.sinks.k1.hive.table = weblogs
a1.sinks.k1.hive.partition = asia,%{country},%y-%m-%d-%H-%M
a1.sinks.k1.useLocalTimeStamp = false
a1.sinks.k1.round = true
a1.sinks.k1.roundValue = 10
a1.sinks.k1.roundUnit = minute
a1.sinks.k1.serializer = DELIMITED
a1.sinks.k1.serializer.delimiter = "\t"
a1.sinks.k1.serializer.serdeSeparator = '\t'
a1.sinks.k1.serializer.fieldnames =id,,msg

6.4 sink 转义符的支持

注意:对于所有与时间相关的转义序列,事件的头中必须存在一个键为 “timestamp” 的头(除非 useLocalTimeStamp 设置为 true)。一种自动添加的方法是使用 TimestampInterceptor。

转义符

说明

%t 毫秒值的时间戳(同 System.currentTimeMillis() 方法)
%a 星期的缩写(Mon、Tue 等)
%A 星期的全拼(Monday、 Tuesday 等)
%b 月份的缩写(Jan、 Feb 等)
%B 月份的全拼(January、February 等)
%c 日期和时间(Thu Feb 14 23:05:25 2019)
%d 月份中的天(00 到 31)
%D 日期,与 %m/%d/%y 相同 ,例如:02/09/19
%H 小时(00 到 23)
%I 小时(01 到 12)
%j 年中的天数(001 到 366)
%k 小时(0 到 23),注意跟 %H 的区别
%m 月份(01 到 12)
%M 分钟(00 到 59)
%p am 或者 pm
%s unix 时间戳,是秒值。比如:2019/4/1 15:12:47 的 unix 时间戳是:1554102767
%S 秒(00 到 59)
%y 一年中的最后两位数(00 到 99),比如 1998 年的 %y 就是 98
%Y 年(2010 这种格式)
%z 数字时区(比如:-0400)
 %[localhost] agent 实例所在主机的 hostname
%[IP] agent 实例所在主机的 IP
%[FQDN] agent 实例所在主机的规范 hostname

注意:HDFS Sink 中的 %[localhost], %[IP] and %[FQDN] 这三个转义符实际上都是用 java 的 API 来获取的,在一些网络环境下可能会获取失败。

6.5 kafka sink

属性名称

默认值

说明

type - 必须设置为:org.apache.flume.sink.kafka.KafkaSink
kafka.bootstrap.servers - Kafka Sink 使用的 Kafka 集群的实例列表,可以是实例的部分列表。但是更建议至少两个用于高可用(HA)支持。格式为 hostname:port,多个用逗号分隔
kafka.topic default-flume-topic 用于发布消息的 Kafka topic 名称 。 如果这个参数配置了值,消息就会被发布到这个 topic 上。如果 event header 中包含叫做“topic”的属性,event 就会被发布到 header 中指定的 topic 上,而不会发布到 kafka.topic 指定的 topic 上。支持任意的 header 属性动态替换,比如 %{lyf} 就会被 event header 中叫做“lyf”的属性值替换(如果使用了这种动态替换,建议将 Kafka 的 auto.create.topics.enable 属性设置为 true )
flumeBatchSize 100 一批中要处理的消息数。设置较大的值可以提高吞吐量,但是会增加延迟。
kafka.producer.acks 1

在考虑成功写入之前,要有多少个副本必须确认消息。

可选值,0:(从不等待确认);1:只等待leader确认;-1:等待所有副本确认。设置为 -1 可以避免某些情况 leader 实例失败的情况下丢失数据

useFlumeEventFormat false 默认情况下,会直接将 event body 的字节数组作为消息内容直接发送到 Kafka topic 。如果设置为 true,会以 Flume Avro 二进制格式进行读取。与 Kafka Source 上的同名参数或者 Kafka channel 的parseAsFlumeEvent 参数相关联,这样以对象的形式处理能使生成端发送过来的 event header 信息得以保留
defaultPartitionId -

指定所有 event 将要发送到的 Kafka 分区 ID,除非被 partitionIdHeader 参数的配置覆盖。

默认情况下,如果没有设置此参数,event 会被 Kafka 生产者的分发程序分发,包括 key(如果指定了的话),或者被 kafka.partitioner.class 指定的分发程序来分发

partitionIdHeader -

设置后,接收器将使用事件标头中使用此属性的值命名的字段的值,并将消息发送到 topic 的指定分区。 如果该值表示无效分区,则将抛出 EventDeliveryException。 如果存在标头值,则此设置将覆盖 defaultPartitionId。

假如这个参数设置为“lyf”,这个 Sink 就会读取 event header 中的 lyf 属性的值,用该值作为分区 ID

allowTopicOverride true 如果设置为 true,会读取 event header 中的名为 topicHeader 的的属性值,用它作为目标 topic
topicHeader topic 与上面的 allowTopicOverride 一起使用,allowTopicOverride 会用当前参数配置的名字从 event header 获取该属性的值,来作为目标 topic 名称
kafka.producer.security.protocol PLAINTEXT

设置使用哪种安全协议写入Kafka。可选值:SASL_PLAINTEXT、SASL_SSL 和 SSL

有关安全设置的其他信息,请参见下文

more producer security props   如果使用了SASL_PLAINTEXT、SASL_SSL 或 SSL 等安全协议,参考 Kafka security 来为生产者增加安全相关的参数配置
other kafka producer properties - 其他一些 Kafka 生产者配置参数。任何 Kafka 支持的生产者参数都可以使用。唯一的要求是使用“kafka.producer.”这个前缀来配置参数,比如:kafka.producer.linger.ms
brokerList - 现在使用 kafka.bootstrap.servers 代替
topic default-flume-topic 现在使用 kafka.topic 代替
batchSize 100 现在使用 kafka.flumeBatchSize 代替
requiredAcks 1 现在使用 kafka.producer.acks 代替

下面是官网提供的例子:

a1.sinks.k1.channel = c1
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.kafka.topic = mytopic
a1.sinks.k1.kafka.bootstrap.servers = localhost:9092
a1.sinks.k1.kafka.flumeBatchSize = 20
a1.sinks.k1.kafka.producer.acks = 1
a1.sinks.k1.kafka.producer.linger.ms = 1
a1.sinks.k1.kafka.producer.compression.type = snappy

7、sink group

可以把多个sink分成一个组, 这时候Sink processor可以对这同一个组里的几个sink进行负载均衡或者其中一个sink发生故障后将输出event的任务转移到其他的sink上。

说的直白一些,这 N 个 sink 本来是要将 event 输出到对应的 N 个目的地的,通过 Sink processor 就可以把这 N 个 sink 配置成负载均衡或者故障转移的工作方式(暂时还不支持自定义的)。负载均衡就方式是把 channel 里面的 event 按照配置的负载机制(比如轮询)分别发送到 sink 各自对应的目的地;故障转移就是这 N 个 sink 同一时间只有一个在工作,其余的作为备用,工作的 sink 挂掉之后备用的 sink 顶上。

属性名称 默认值 说明
sinks - 这一组的所有sink名,多个用空格分开
processor.type default 这个sink组的逻辑处理器类型,可选值default(默认一对一的)、failover(故障转移)、load_balance(负载均衡)

下面是官网提供的例子:

a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = load_balance

7.1 默认的 Sink Processor

默认的 sink processor 就是只有一个 sink 的情况(准确说这根本不算一个组),所以这种情况就没必要配置 sink 组了。本文档前面的例子都是 source - channel - sink 这种一对一,单个 sink 的。

7.2 故障转移 Sink Processor

故障转移 Sink Processor 维护了一个发送 event 失败的 sink 的列表,保证有一个 sink 是可用的来发送 event。

故障转移机制的工作原理是将故障 sink 降级到一个池中,在池中为它们分配冷却期(超时时间),在重试之前随顺序故障而增加。 接收器成功发送事件后,它将恢复到实时池。sink 具有与之相关的优先级,数值越大,优先级越高。 如果在发送 event 时接收器发生故障,会继续尝试下一个具有最高优先级的sink。 例如,在优先级为 80 的 sink 之前激活优先级为 100 的 sink。如果未指定优先级,则根据配置中的顺序来选取。

要使用故障转移选择器,不仅要设置 sink 组的选择器为 failover,还有为每一个 sink 设置一个唯一的优先级数值。 可以使用 maxpenalty 属性设置故障转移时间的上限(以毫秒为单位)。

属性名称 默认值 说明
sinks - 这一组的所有sink名,多个用空格分开
processor.type default failover
processor.priority.<sinkName> - 组内 sink 的权重值,<sinkName> 必须是当前组关联的 sink 之一。数值(绝对值)越高越早被激活
processor.maxpenalty 30000 发生异常的 sink 最大故障转移时间,单位:毫秒

下面是官网提供的例子:

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

7.3 负载均衡 Sink Processor

负载均衡Sink 选择器提供了在多个 sink 上进行负载均衡流量的功能。 它维护一个活动 sink 列表的索引来实现负载的分配。 默认支持了轮询(round_robin)和随机(random)两种选择机制分配负载。默认是轮询,可以通过配置来更改。也可以从 AbstractSinkSelector 继承写一个自定义的选择器。

工作时,此选择器使用其配置的选择机制选择下一个 sink 并调用它。 如果所选 sink 无法正常工作,则处理器通过其配置的选择机制选择下一个可用 sink。 此实现不会将失败的接收器列入黑名单,而是继续乐观地尝试每个可用的接收器。 如果所有 sink 调用都失败了,选择器会将故障抛给 sink 的运行器。

如果 backoff 设置为 true 则启用了规避机制,失败的 sink 会被放入黑名单,达到一定的超时时间后会自动从黑名单移除。 如从黑名单出来后sink仍然失败,则再次进入黑名单而且超时时间会翻倍,以避免在无响应的sink上浪费过长时间。 如果没有启用规避机制,在禁用此功能的情况下,发生sink传输失败后,会将本次负载传给下一个 sink 继续尝试,因此这种情况下是不均衡的。

属性名称 默认值 说明
sinks - 这一组的所有sink名,多个用空格分开
processor.type default load_balance
processor.backoff false 失败的 sink 是否成倍地增加规避它的时间 如果设置为 false,负载均衡在某一个sink发生异常后,下一次选择sink的时候仍然会将失败的这个 sink 加入候选队列;如果设置为 true,某个 sink 连续发生异常时会成倍地增加它的规避时间,在规避的时间内是无法参与负载均衡竞争的。规避机制只统计 1 个小时发生的异常,超过 1 个小时没有发生异常就会重新计算
processor.selector round_robin

负载均衡机制,可选值:

round_robin:轮询

random:随机选择

「自定义选择器的全限定类名」:自定义的负载器要继承 AbstractSinkSelector

processor.selector.maxTimeOut 30000

发生异常的 sink 最长规避时间(单位:毫秒)

如果设置了processor.backoff=true,某一个 sink 发生异常的时候就会触发自动规避它一段时间,这个 maxTimeOut 就是规避一个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

猜你喜欢

转载自blog.csdn.net/weixin_42018518/article/details/105785741