fluentd의 require_ack_response 설정이 역시 필수 설정이라고 재인식했을 때의 검증 메모

3961 단어 FluentdAWS

1. 검증 배경



참고 기사



Fluentd v0.12의 At-least-once Semantics 사용
fluentd에서 로그가 누락 될 가능성을 생각하십시오.

등으로 fluentd v0.12를 사용했을 때 "require_ack_response를 반드시 설정해 두도록"이라는 노하우는 오이타 침투하게 되었다고 생각된다.
다만, fluentd를 운용하는 가운데, require_ack_response의 설정 누설을 깨닫지 않고, 수신측의 fluentd를 reload해 버리는 경우도 생각할 수 있다.
그래서 실제 운용하에서 이 설정이 어느 정도의 효과를 발휘하는지를 검증해 보았다.

2. 검증 환경



2-1. 구성도




그림으로 할 정도는 아니지만 fluentd의 송신측과 수신측의 EC2를 준비한다.
OS와 fluentd 버전은 다음과 같습니다.

2-2. 검증 환경




환경
버전


OS
우분투14.04

fluentd(td-agent)
0.12.20


설치가 쉽기 때문에 td-agent를 이용했다.

2-3. 설정 파일



송신측 및 수신측의 설정 파일은 이하와 같다.

송신자의 td-agent.conf


<source>
  type forward
  @label @raw
</source>

<label @raw>
  <match test.**>
    buffer_type file
    buffer_path /tmp/hoge.buffer
    flush_interval 1s

    type forward

    require_ack_response #ここの設定をコメントアウトしたりする
    flush_at_shutdown true

    <server>
       host [受信側のホスト]
       port 24224
    </server>
  </match>
</label>

수신측의 td-agent.conf


<source>
  type forward
  @label @raw
</source>

<label @raw>
  <match test.**>
    buffer_type file
    buffer_path /tmp/hoge.buffer

    type file
    path /tmp/hoge.log
  </match>
</label>

3. 검증 결과



fluent-cat을 사용하여 1,000건의 데이터를 전송하면서 10sec마다 reload하는 패턴과 logroteate하는 패턴의 2개의 케이스를 검증해 본다.

송신측


for i in `seq 1 1000`;do echo "{\"test\":\"$i\"}" | /opt/td-agent/embedded/bin/fluent-cat test.1;done

수신측



3-1.td-agent를 reload했을 때의 경우


for i in `seq 1 10`;do /etc/init.d/td-agent reload;sleep 10;done

실행 후의 로그 수신 결과는 다음과 같습니다.

require_ack_response 없음




시도 횟수
reciever에 도착한 로그 수


첫 번째
946

두 번째
951

세 번째
970

네 번째
960

다섯 번째
947


대략 54~30건 정도의 로그 로스트가 보였다.

require_ack_response 있음




시도 횟수
reciever에 도착한 로그 수


첫 번째
1,000

두 번째
1,000

세 번째
1,000

네 번째
1,000

다섯 번째
1,000


로그 로스트 없음.

3-2.td-agent가 logrotate했을 때의 경우


for i in `seq 1 10`;do pid=/var/run/td-agent/td-agent.pid;test -s $pid && kill -USR1 "$(cat $pid)" ;sleep 10;done

실행 후의 로그 수신 결과는 다음과 같습니다.

require_ack_response 없음




시도 횟수
reciever에 도착한 로그 수


첫 번째
1,000

두 번째
1,000

세 번째
1,000

네 번째
1,000

다섯 번째
1,000


로그 로스트 없음.

require_ack_response 있음




시도 횟수
reciever에 도착한 로그 수


첫 번째
1,000

두 번째
1,000

세 번째
1,000

네 번째
1,000

다섯 번째
1,000


로그 로스트 없음.

4. 정리



매일 logrotate 시에는 로그의 결손은 보이지 않지만, 설정 파일의 변경 등으로 reload하거나 할 때에는 로그의 결손이 보였다. 프로덕션 환경 등 이번 경우보다 로그 유량이 더 많은 환경에서는 상당한 로그를 결손할 수 있다고 생각된다.

AWS라고는 해도, 네트워크의 순단등의 부조한 때는 발생하고, EC2 인스턴스도 재기동하는 경우가 있으므로, 역시 require_ack_response는 확실하게 설정해 두는 것이 필요할까.
그리고, fluentd가 아직 v0.10 환경하의 시스템은, 역시 업데이트 해 둡시다 ^^;

좋은 웹페이지 즐겨찾기