Flume之使用Failover Sink Processor實現sink故障轉移


前言

  • Failover Sink Processor 維護着Sink組中Sinks的優先級表,根據優先級嘗試將Event傳輸給不同的Sink直到Event成功發送。當優先級高的Sink不可用時,會將Event傳輸給下一優先級Sink,以此來確保每個Event都能被投遞。當Sink不可用時,Failover Sink Processor和Load balancing Sink Processor一樣,也會進行指數回退backoff,並可以設置最大回退時間(即在黑名單中的保存時間),在倒計時結束後會再次嘗試訪問之前掛掉的Sink

使用示例

1)flume1.properties

# flume1:此配置用於監控某個窗口將其追加內容輸出到flume2和flume3中
# 並將兩個Sink組成一個sink group,並將Sink Processor設置成Failover類型
# a1:Netcat Source->Memory Channel->Avro Sink

# Agent
a1.sources = r1
a1.channels = c1
a1.sinks = k1 k2

# Sink groups
a1.sinkgroups = g1
# 設置sink group中的sinks
a1.sinkgroups.g1.sinks = k1 k2
# 設置Failover sink processor(只有sink group纔可以使用sink processor)
a1.sinkgroups.g1.processor.type = failover
# 設置Failover sink processor優先級表
a1.sinkgroups.g1.processor.priority.k1 = 5
a1.sinkgroups.g1.processor.priority.k2 = 10
# 設置最大避讓時間(ms)
a1.sinkgroups.g1.processor.maxpenalty = 10000


# Sources
# 配置a1.sources.r1的各項屬性參數,類型/綁定主機ip/端口號
a1.sources.r1.type = netcat
a1.sources.r1.bind = hadoop101
a1.sources.r1.port = 44444

# Channels
# 配置a1.channerls.c1的各項屬性參數,緩存方式/最多緩存的Event個數/單次傳輸的Event個數
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# Sinks
# sinks.k1
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = hadoop102
a1.sinks.k1.port = 4141
# sinks.k2
a1.sinks.k2.type = avro
a1.sinks.k2.hostname = hadoop103
a1.sinks.k2.port = 4141

# Bind
# 注意:source可以綁定多個channel,但是sink/sink group只能綁定單個channel
# r1->c1->g1
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c1

2)flume2.properties

# flume2:此配置用於將來自指定Avro端口的數據輸出到控制檯
# a2:Avro Source->Memory Channel->Logger Sink

# Agent
a2.sources = r1
a2.channels = c1
a2.sinks = k1

# Sources
# a2.sources.r1
a2.sources.r1.type = avro
# 設置監聽本地IP
a2.sources.r1.bind = 0.0.0.0
# 設置監聽端口號
a2.sources.r1.port = 4141

# Channels
# a2.channels.c1
# 使用內存作爲緩存/最多緩存的Event個數/單次傳輸的Event個數
a2.channels.c1.type = memory
a2.channels.c1.capacity = 1000
a2.channels.c1.transactionCapacity = 100

# Sinks
# 運行時設置參數 -Dflume.root.logger=INFO,console 即輸出到控制檯實時顯示
a2.sinks.k1.type = logger
# 設置Event的Body中寫入log的最大字節數(默認值爲16)
a2.sinks.k1.maxBytesToLog = 256

# Bind
a2.sources.r1.channels = c1
a2.sinks.k1.channel = c1

3)flume3.properties

# flume3:此配置用於將來自指定Avro端口的數據輸出到控制檯
# a3:Avro Source->Memory Channel->Logger Sink

# Agent
a3.sources = r1
a3.channels = c1
a3.sinks = k1

# Sources
# a3.sources.r1
a3.sources.r1.type = avro
# 設置監聽本地IP
a3.sources.r1.bind = 0.0.0.0
# 設置監聽端口號
a3.sources.r1.port = 4141

# Channels
# a3.channels.c1
# 使用內存作爲緩存/最多緩存的Event個數/單次傳輸的Event個數
a3.channels.c1.type = memory
a3.channels.c1.capacity = 1000
a3.channels.c1.transactionCapacity = 100

# Sinks
# 運行時設置參數 -Dflume.root.logger=INFO,console 即輸出到控制檯實時顯示
a3.sinks.k1.type = logger
# 設置Event的Body中寫入log的最大字節數(默認值爲16)
a3.sinks.k1.maxBytesToLog = 256

# Bind
a3.sources.r1.channels = c1
a3.sinks.k1.channel = c1

4)啓動命令

Flume Agent a1至a3分別運行在主機hadoop101、hadoop102、hadoop103上

./bin/flume-ng agent -n a1 -c conf -f flume1.properties
./bin/flume-ng agent -n a2 -c conf -f flume2.properties -Dflume.root.logger=INFO,console
./bin/flume-ng agent -n a3 -c conf -f flume3.properties -Dflume.root.logger=INFO,console

5)實現功能

  • Aent a1將指定端口的監聽數據輸出到a2或者a3的控制檯

  • 當Event從Channel中傳輸給Sink Group之前,首先會根據配置Failover sink processor優先級表嘗試將此Event發送給優先級最高的可用Sink,如果成功則繼續處理下一個Event。如果在發送過程中,當前Sink宕機,則將其加入黑名單,一定時間內不再嘗試將Event發往此Sink,並且退避時間呈指數增長,直到最大退避時間maxpenalty,以此來實現Sink的故障轉移


End~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章