Flume 란?#
- 여러대(여러서비스..)에 기록되는 로그파일들을 실시간으로 한곳으로 모아주는 서비스
1
| export JAVA_HOME = /usr (자바 경로.)
|
설치 및 테스트는 mac에서 했지만. centos에서도 잘되리라 믿는다.
기본 flume.conf 파일#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| # The configuration file needs to define the sources,
# the channels and the sinks.
# Sources, channels and sinks are defined per agent,
# in this case called 'agent'
agent.sources = seqGenSrc
agent.channels = memoryChannel
agent.sinks = loggerSink
# For each one of the sources, the type is defined
agent.sources.seqGenSrc.type = seq
# The channel can be defined as follows.
agent.sources.seqGenSrc.channels = memoryChannel
# Each sink's type must be defined
agent.sinks.loggerSink.type = logger
#Specify the channel the sink should use
agent.sinks.loggerSink.channel = memoryChannel
# Each channel's type is defined.
agent.channels.memoryChannel.type = memory
# Other config values specific to each type of channel(sink or source)
# can be defined as well
# In this case, it specifies the capacity of the memory channel
agent.channels.memoryChannel.capacity = 100
|
참고) https://flume.apache.org/FlumeUserGuide.html
설정파일은 sources, channels, sinks 로 나눠져 있다.
- sources: 읽어오는 대상 (원격 서버에서 전달받기도 한다.)
- channels: 아마… sinks로 저장하기 위한 버퍼? 같은 역할인것 같음
솔찍히 모름 - sinks: 저장할 대상 또는 전달할 대상?
아래 그림을 보면 살짝 이해가 된다. (아래 그림에는 저장 대상이 하둡인데.. 나는 하둡을 이용하진 않을 것이다.)
그림출처) https://flume.apache.org/FlumeUserGuide.html
다양한 sources 형식이 있으나 나는 로그 파일로부터 tail명령을 이용하여 수집한다.
- agent1은 agent2에서 수집된 로그를 전달 받는다
- agent2는 수집된 로그를 agent1으로 전송 한다.
저장하는 서버 agent1 (flume/conf/flume-agent1.conf)#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| agent1.sources = r1
agent1.channels = c1
agent1.sinks = k1
# 원격의 서버들로부터 데이타를 수신한다 (port는 4545)
agent1.sources.r1.type = avro
agent1.sources.r1.bind = 0.0.0.0
agent1.sources.r1.port = 4545
agent1.sources.r1.channels = c1
agent1.channels.c1.type = memory
agent1.channels.c1.capacity = 10000
agent1.channels.c1.transactionCapacity = 1000
# /logs/flume에 저장한다
agent1.sinks.k1.type = file_roll
agent1.sinks.k1.sink.directory = /logs/flume
# 하루(24 hour) 단위로 파일.. rolling.
agent1.sinks.k1.sink.rollInterval = 86400
agent1.sinks.k1.channel = c1
|
저장서버로 로그를 전송 하는 서버 (여러대로 늘어난다) agent2 (flume/conf/flume-agent2.conf)#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| agent2.sources = r1 r2
agent2.channels = c1
agent2.sinks = k1
# 파일로 부터 로그를 읽어 온다.
agent2.sources.r1.type = exec
agent2.sources.r1.command = tail -F /logs/debug.log
agent2.sources.r1.channels = c1
agent2.sources.r2.type = exec
agent2.sources.r2.command = tail -F /logs/info.log
agent2.sources.r2.channels = c1
agent2.channels.c1.type = memory
agent2.channels.c1.capacity = 10000
agent2.channels.c1.transactionCapacity = 1000
# 원격의 서버로 전달 한다. (난 로컬에서 테스트 하니까 127.0.0.1:4545)
agent2.sinks.k1.type = avro
agent2.sinks.k1.channel = c1
agent2.sinks.k1.hostname = 127.0.0.1
agent2.sinks.k1.port = 4545
|
위에 sources를 두개 지정할 수 있다 (파일이 다른 경우)
서비스 실행#
두가지 설정을 한 서비스를 각각 실행 하자.
1
2
| ./bin/flume-ng agent -c ./conf -f ./conf/flume-agent1.conf -n agent1
./bin/flume-ng agent -c ./conf -f ./conf/flume-agent2.conf -n agent2
|
-c
, --conf
설정폴더-f
, --conf-file
설정파일-n
, --name
에이전트 이름
agent1에서 sinks를 file_roll로 하니 아래와 같이 file list들이 쌓인다.
sink.rollInterval
속성을 이용해서 interval은 조정 가능 하다. (아래는 30초 기준이다.)
1
2
3
4
5
6
7
8
9
10
| gimjonghuiui-MacBook-Pro:flume paper$ ls -l
total 24
-rw-r--r-- 1 paper wheel 0 10 29 15:40 1446100807777-1
-rw-r--r-- 1 paper wheel 95 10 29 15:40 1446100818312-1
-rw-r--r-- 1 paper wheel 519 10 29 15:41 1446100818312-2
-rw-r--r-- 1 paper wheel 0 10 29 15:41 1446100818312-3
-rw-r--r-- 1 paper wheel 378 10 29 15:42 1446100818312-4
-rw-r--r-- 1 paper wheel 0 10 29 15:42 1446100818312-5
-rw-r--r-- 1 paper wheel 0 10 29 15:42 1446100818312-6
-rw-r--r-- 1 paper wheel 0 10 29 15:43 1446100818312-7
|