Lean 개발방법론 ( Agile의 하나 )

구체적인 개발 프로세스를 정의하지 않고 철학적인 접근 방식을 정의하고 있다. 즉, 린 개발 방식은 개 발 방법론이라기 보다는 사고방식이란 용어가 더 적합하다 하겠다. – 린 사고 방식(Lean Thinking)

1. 특징
린은 낭비를 발견하고 제거함으로써 어떻게 고객에게 가치를 빠르게 제공할 수 있을 것인가에 대한 생각이자 사고방식이다. 제조분야에서 생산성향상을 위해 사용하는 린워칙을 S/W 개발에 적용하여 낭비요소를 제거하자는 내용. 결론으로 S/W개발의 가장 큰 낭비는 결함이고 결함을 줄이는 좋은 방법은 애자일 방법론 이라는 것이다.

2. Lean에서 대표적 낭비요소
– Transportation
– Inventory
– Motion
– Waiting
– Over Production
– Over Processing
– Defects / Rework

3. Lean S/W의 7가지 개발원칙
– 낭비를 제거하라: 파레토법칙에 의거하여 개발에 정말 중요한 20%에 집중하고 낭비되는 요소 제거
– 품질을 내재화하라: TDD를 통해 코드의 실수를 방지, 빅뱅통합을 버리고 지속적인 통합과 중첩된 동기화 기법사용
– 지식을 창출하라: 과학적 방법 사용, 모든 사람들이 따라하고 잘 알려진 실천법을 표준에 포함하되, 누구든지 표준에 도전하고 변경하도록 장려.
– 확정을 늦춰라: 마지막까지 변화를 수용할 수 있도록 코드 작성, 의존성을 깨뜨리고 옵션을 유지하라.
– 전체를 최적화하라: 고객요구에서 S/W 배포까지 전체 가치흐름에 초점을 맞춰라.
– 사람을 존중하라: 효과적인 리더십 제공하고 팀은 자부심, 책임감, 신뢰, 칭찬을 통해 번성한다.
– 빨리 인도하라: 신속한 인도, 고품질, 저비용은 공존할 수 있다. 일의 양을 할 수 있는 만큼으로 제한하라.

4. Lean S/W 개발과 칸반
– 칸반은 생산시스템에서 일하는 작업자들이 어떤 작업을 해야 하는지 알려주는 작업지시서에 해당
– Lean S/W 개발에서 칸반을 활용하게 되면 다음과 같은 장점을 얻을 수 있다.
– 워크플로우를 가시화한다: 일을 작게 나누고 보일 수 있게 나열한다.
– 작업중인 것을 제한한다: 워크플로우상에 얼마나 많은 항목이 진행되고 있는지 제한을 둔다.
– 작업에 소요되는 시간을 측정한다: 한 항목을 완료하는데 걸리는 평균시간, 예측가능하고 소요시간을 최소화하기 위해 프로세스를 최적화 한다.

5. 애자일 방법론과 린 개발방법의 공통점
– 요구사항의 변화를 적극적으로 수용
– 제품을 고객에게 빠르게 전달하여 고객 가치와 만족도를 높이는데 목적

6. 애자일 방법론과 린 개발방법론의 차이점
– 애자일 촛점: 개인별 또는 팀간에 고객과 협업하고 빠른 개발을 수행하는 것에 초점(고객과 협업)
– 린의 촛점: 고객의 관점에서 전체 프로세스 상에서 낭비를 제거하여 고객 가치를 높이는 것에 우선 순위(전적으로 고객 관점)


'생산성' 카테고리의 다른 글

3M의 혁신적 문화  (0) 2016.05.16

출처 : http://www.zdnet.co.kr/column/column_view.asp?artice_id=20160614172904


칼럼

서버리스(Serverless)가 온다!

  • 윤석찬 AWS 테크 에반젤리스트
  • 입력 : 2016.06.14.17:40
  • 수정 : 2016.06.14.17:40
  • 228

지난 칼럼 '클라우드 기술에 대한 세가지 패러다임 변화'에서 ‘서버 없는 클라우드 함수의 등장’이라는 변화를 소개했다. 이러한 새로운 패러다임은 개발자들에게 큰 수고와 비용 없이도 좀 더 빠르고 민첩하게 다양한 애플리케이션을 만들고, 서비스 운용을 위한 확장성 및 가용성에 대한 수고와 비용을 없애는 방향으로 바뀌고 있다.

이러한 변화를 가장 극적으로 보여준 것이 바로 지난 5월말 뉴욕에서 있었던 서버리스컨퍼런스(Serverless Conference)다. 일반적으로, 회자되는 기술의 유행 방식은 선두 주자가 혁신적인 서비스를 내면, 경쟁적으로 유사한 서비스가 만들어지고, 오픈 소스로 된 관련 도구가 증가하면서 개발자들이 여기에 동조하고, 콘퍼런스에서 다 같이 만나는 패턴인데,이는과거에도 종종 있었다.

2014년 AWS람다(Lambda)가 이러한 개념을 처음 선 보인 이후로, 많은 클라우드 업체들이 이를 벤치마킹한 서비스를 줄줄이 내놓고 있다. 많은 개발자들은 관련된 코드 예제들을 오픈 소스로 공개하고, 급기야는 Serverless FRAMEwork, CloudiaJS 같은 서버리스 오픈 소스 개발 프레임워크가 계속 나오고 있다. AWS에서 Lambda와 API Gateway 서비스 개발을 총괄하고 있는 팀 와그너(Tim Wagner)는 서버리스 콘퍼런스키노트 발표에 앞서 물리 서버를 부숴버리는 상징적인 퍼포먼스를 보여 주기도 했다.

물리적 서버를 부수는 퍼포먼스를 하고 있는 팀 와그너? 출처: @samkroon

물리적 서버를 부수는 퍼포먼스를 하고 있는 팀 와그너? 출처: @samkroon

■ Serverless != No Server

물론 서버리스(Serverless)라는 말 자체가 서버가 필요 없다는 뜻은 아니다. 클라우드에서도 서버는 존재하고 있고, 다만 고객이 스스로 관리해야 하는 서버 혹은 콘테이너가제로(0)에 수렴한다는 의미다. 따라서, 서버리스란 오로지 이벤트에 따라 동작하는 클라우드 기반의 나노 수준 (최근 회자되는 마이크로서비스가 가진 크기를 생각해서) 서비스 단위의프로그램 코드만을 개발하고 배포에 집중한다는 의미이다. 기존의 PaaS(Platform as a Service)는 복잡한 모놀리식(Monolithic) 애플리케이션을 지원했다는 점에서, 무상태(Stateless)는 서버리스의특징과 대비된다.

이유는 간단하다. 더 빠르게 움직이기 위해서다. 이러한 특징은 인프라 설치, 운용, 확장성 고려, 복잡한 배포 및 모니터링 등 많은 관리 업무를 줄이고, 민첩하게 만들고 배포하려는 회사 혹은 팀에게 적합하다.

예를 들어, AWS Lambda는 가장 선두에 있는 서비스로서 Node.js, Java, Python 코드를 올리기만 하면, 코드가 실행될 때 마다 5분 안에 실행하면서 100ms 단위로 과금한다. 다른 AWS 서비스의 이벤트를 처리(예를 들면, Amazon S3에 이미지가 올라오면 썸네일을 만드는 기능을 동작)하거나, Amazon API Gateway로 들어오는 HTTP 요청에 대해서도 실행할 수 있다. 올려진 코드에 대한 버전 기능, 배치 작업을 위한 Cron 기능등을 제공하고, 매월 100만 밀리세컨드에 대해 무료로 제공하기에 테스트 개발에도 적합하다.

모바일 앱을 위한 서버없는백엔드 아키텍처 사례(출처: AWS 한국 공식 블로그)

모바일 앱을 위한 서버없는백엔드 아키텍처 사례(출처: AWS 한국 공식 블로그)

따라서, Amazon API Gateway와 AWS Lambda를 조합하고, 여기에 Amazon 기존 서비스를 연계해서 새로운 아키텍처를 구성할 수 있는데, 이것을 소위 ‘서버리스 아키텍처’라고 부르고 있다. (마치 다양한 요리를 할 때 필요한 재료가 필요한 것처럼, AWS는 최소 단위(primitives)라고 부르는 다양한 서비스로 만들고, 개발자들이 이를 자유롭게 조합하여, 새로운 아키텍처를 설계 구성하도록 하는 서비스 철학을 가지고 있다)

■ 진화하는 서버리스 개발 생태계

서버리스 아키텍처나 프레임워크는아직 초기 단계다. 해결해야 할 사항도 적지 않다. 예를 들어, 기존 서버 기반 SW 플랫폼 개발 프레임워크만큼, 통합 개발 환경(IDE)나 테스팅, 디버깅이 편리하지 않다. 개별 클라우드 함수의 크기나 성능에 따른 메모리 사이징(그에 따른 CPU 및 네트워크 사용량) 및 함수 기능을 어디까지 세분화 할 것인가에 대한 기준도 명확하지 않다.

이런 부분은 서버리스 아키텍처에 대한 다양한 논의가 진행되고, 개발자 생태계가 커지면서 각종 지원 개발 도구가 나온다면 자연스럽게 해결될문제라고 생각한다.

하지만, 가장우선적으로서버리스에 대한 개념과 목적을 명확하게 하는 것이 중요하다. 못을 박기 위한 도구인 망치를 가지고, 음식을 만들려는 우를 범하지 않기 위해서다. 팀 와그너는서버리스 콘퍼런스키노트 중 아래와 같이서버리스선언문(Serverless Manifesto)을 소개하였다.

  • 함수(Function)가 서비스의 기본 배포 및 확장 단위이다.
  • 프로그래밍 모델에서 물리 서버, 가상 서버 및 콘테이너에 대한 의존성을 제거하라
  • 데이터 스토리지는 어딘가 무제한으로 있다고(사용한다고) 가정하라
  • 사용자가 아닌 오로지 요청(Request)에 대해서만 확장하라
  • 요청이 없는데 돈을 낼 필요가 없다(가상 서버나 콘테이너도 여전히 비효율적이다).
  • 함수의 실행은 어디서나 가능하므로, 장애 복원력을 가지도록 만들어라
  • BYOC(Bring your own code) ?나만의 서비스를 책임지고 만들 수 있다!
  • 통계 수집 및 로그 취득은 보편적인 필수 사항이다.

이와 함께 Flourish라는 오프 소스 서버리스 프레임워크를 곧 공개할 것이라고 밝혔다. 이 프레임워크는 마이크로 서비스의 형식을 정의하고, 기존 IDE와 통합하여 빌드 및 ZIP 파일 기반 배포를 할 뿐만 아니라 하나의 대시보드에서 모니터링 및 요금 집계가 가능한 현실적인 서비스 기능을 통합 할 예정이다. 또한 프로그램 코드와 버전 설정을 조합에 의한 일관된 롤백 기능도 제공한다. 벤더 중립적인 API 서비스 참조 역할도 하면서, 코드 작성 및 배포에만 집중되어 있는 기존 프레임워크의 대안이 될 수 있을 것이다.

Flourish가 중립적인 프레임워크로 자리잡더라도 다른 클라우드 업체들도 비슷한 수준의 서버리스 프레임워크를 내놓을 가능성이 높다. 기존의 개발자 커뮤니티에서 만들어지는 프레임워크 역시 생태계 확대에 이바지할 것으로 예상된다.

■ 서버리스의 대중화의 필수 조건은?

서버리스 개발 생태계 확대를 위해서는 기존 벤더 기반 서버리스 컴퓨팅 환경과 스토리지 서비스에서 개발자 생태계 기반 프레임워크와 개발 도구의 제공이 확대되는 단계도 중요하다.하지만 궁극적으로 서버리스 킬러 응용 프로그램(Killer Application)이 나와야 한다.

최근에 Slack을 기반으로 하는 채팅봇애플리케이션이나 Amazon Echo와 Alexa 그리고 AWS Lambda를이용한음성인식서버리스 애플리케이션이 늘어나는 것은 고무적인 현상이다. 테크크런치기사에서 언급한, Amazon Echo의 음성 인식 API인 Alexa Skills과 AWS Lambda를 이용한 앱(Skills)이 연초 135여개에서 1,000여개로 늘어났다는 것이 바로 그러한 예이다.

AWS Lambda의 이용 사례도 극적으로 늘고 있다. 여성 패션 사이트인 Bustie는 수백만의 사용자가 방문하는 웹 사이트를 Amazon S3 기반으로 만들고 필요시 동적 데이터를 Lambda로 처리한다. 광고 리타게팅 플랫폼인 AdRoll 역시 매달 300TB의 압축 데이터를 S3에 저장하는데, 호출 데이터 저장 시 Lambda를 사용한다. 실시간 동영상 인코딩 업체로 유명해진 스타트업인 Periscope는 포르노 같은 유해 영상인지 여부를 3초 단위로 파악해서 차단하는 기능에 Lambda를 이용한다.

AWS Lambda의 실제 활용 사례? 출처: AWS Summit Seoul키노트 중

AWS Lambda의 실제 활용 사례? 출처: AWS Summit Seoul키노트 중

특히, 데이터 분석 영역에서 Lambda 사용도 두드러진다. FireEye는 Lambda를 이용하여 침입 탐지 시스템을 만들었는데, 기존에 맵리듀스(MapReduce) 기능을 Lambda 함수로 바꾸고, S3에 저장하는 새로운 아이디어를 내기도 했다.국내에서도 비트패킹컴퍼니가 음악 재생 시 광고 노출 데이터를 실시간으로 처리하기 위해 Lambda를 통해 Amazon Kinesis로 보내고, 이를 S3에 저장하거나Amazon Elasticsearch Service와 Kibana를 통해 분석 대시 보드를 만드는 서버가전혀없는원스톱분석서비스를 만들어 발표하기도 했다.

향후서버리스 아키텍처를 위한 생태계에서 필요한 것은 매우 많다. 클라우드 함수에 대한 지속적인 통합 및 배포(CI/CD) 지원, IDE 플러그인, 테스트 프레임워크는 가장 필수적이다. React 같은 현대적 웹 앱 프레임워크와의 연동 및 원활한 동영상 및 파일 처리, 사물 인터넷과의 연동, 이를 엔터프라이즈급 업무에서도 활용할 수 있는 다양한 사례를 발굴하는 것 역시 중요한 과제다.

마지막으로 무엇 보다 중요한 것은 개발자들의호기심이다. 항상 성공하는 기술은 낮은 진입 장벽에서, 호기심을 가진 기술 관심자들의참여로 이루어진다. 과거 모바일앱생태계 초기를 돌아보면, 개발자가 부업으로 만든 앱들이 대박을 친 경우가 많았다. 서버리스 아키텍처도 과거 수많은 고민을 해야했던 많은 장벽을 없애 줌으로써새로운아이디어를 시작해 볼 수 있고, 성공도 예측해 볼 수 있다. 누가 아는가? 내가 만든 작은 API가 유료로도 서비스할 수 있는 대박 서비스가 될지…

기업에서도 복잡한 문제 해결에 대한 가장 단순한 해법을 찾고, 기존 레거시를 혁신하기 위해 이를 직접 만들어 보는 개발자와 기업에게 미래가 있다. 만약 이를적용 하면 회사의 기존 사업이 망할 것 같고, 나의 일이 없어지는 내부적인 파괴(Disruption)를 일으킬 것 같은 기술처럼 보이는가? 서버리스 아키텍처를 바라보는 IT개발자의 우려와 벤더의 시각도 이와 다르지 않다.그렇다면 지금 당장 시도해야 한다.“미래는 이미 가까이에 와 있다. 다만 널리 퍼지지 않았을 뿐(The future is already here ? it's just not very evenly distributed. ?윌리암 깁슨)”이라는 말을 다시 새겨볼 때다.

*본 칼럼 내용은 본지 편집방향과 다를 수 있습니다.

칼럼니스트 : 윤석찬

약력

윤석찬 아마존웹서비스테크에반젤리스트| 1996년 웹 개발자로 인터넷 업계에 투신해 나인포유 CTO, 모질라(Mozilla) 오픈소스 커뮤니티 리더, IT 분야 블로거 등 다양한 역할을 수행해 왔다. 최근까지 다음카카오에서 연구개발 부서 리더 및 오픈 API 플랫폼 에반젤리스트로서 내부 API 플랫폼 구축과 외부 개발자 지원을 담당한 바 있다. 


http://bcho.tistory.com/1115

분산 로그 수집기 Fluentd 소개


조대협 (http://bcho.tistory.com)



요즘 들어 빅데이타 분석 관련 기술들을 보다보니, 역시나 여러 데이타 소스에서 데이타를 수집해 오는 부분이 여러 데이타 소스를 커버해야 하고, 분산된 여러 서버에서 데이타를 수집해야 하는 만큼 수집 컴포넌트의 중요성이 점점 더 올라가는 것 같다.

그래서 요즘 빅데이타를 위한 데이타(및 로그) 수집 플랫폼을 보고 있는데, 예전 Flume 등 여러 로그 수집 솔루션이 있었는 것에 비해서 조금 정리된 느낌이라고나 할까?  Scribed, Fluentd 그리고 ELK (Elastic Search + Logstash + Kibana 조합)에서 사용되는 Logstash등이 있는데, 대부분 Fluentd와 Logstash로 수렴 되는 것 같다. 양쪽 모두 오픈소스이고 별도의 엔터프라이즈 라이센스 정책을 가지고 있다.

Logstash는 아키텍쳐 적응에 대한 유연성과 연동 솔루션에 대한 호환성을 강조하고 있기 때문에 타 솔루션과 연동이 강하고 반면, Fluentd는 아키텍쳐의 단순성과 이를 기반으로 한 안정성을 초점을 두고 있다. 그래서 아키텍쳐 구성이나 설정이 간단하다.


이 글에서는 Fluentd에 대한 간략한 개념과 사용 방법에 대해서 알아보도록 하겠다.

Fluentd를 이용한 로그 수집 아키텍쳐

Fluentd를 이용한 로그 수집 아키텍쳐를 살펴보면 다음과 같다.

아래 그림과 같이 각 서버에, Fluentd를 설치하면, 서버에서 기동되고 있는 서버(또는 애플리케이션)에서 로그를 수집해서 중앙 로그 저장소 (Log Store)로 전송 하는 방식이다.




위의 그림은 가장 기본적인 구조로 Fluentd가 로그 수집 에이전트 역할만을 하는 구조인데, 이에 더해서 다음과 같이 각 서버에서 Fluentd에서 수집한 로그를 다른 Fluentd로 보내서 이 Fluentd가 최종적으로 로그 저장소에 저장하도록 할 수 도 있다.


중간에 fluentd를 넣는 이유는, 이 fluentd가 앞에서 들어오는 로그들을 수집해서 로그 저장소에 넣기 전에 로그 트래픽을 Throttling (속도 조절)을 해서 로그 저장소의 용량에 맞게 트래픽을 조정을 할 수 있다.

또는 다음 그림과 같이 로그를 여러개의 저장소에 복제해서 저장하거나 로그의 종류에 따라서 각각 다른 로그 저장소로 라우팅이 가능하다.


Fluentd 내부 구조

Fluentd를 이용해서 로그 수집 아키텍쳐를 구성하는 방법을 대략적으로 알아보았는데, 그렇다면 Fluentd 자체의 구조는 어떻게 되어 있을까?

Fluentd는 크게 다음 그림과 같이 Input,Parser,Engine,Filter,Buffer,Ouput,Formatter 7개의 컴포넌트로 구성이 된다.  7개의 컴포넌트중 Engine을 제외한 나머지 6개는 플러그인 형태로 제공이 되서 사용자가 설정이 가능하다.

일반적인 데이타 흐름은 Input → Engine → Output 의 흐름으로 이루어 지고,  Parser, Buffer, Filter, Formatter 등은 설정에 따라서 선택적으로 추가 또는 삭제할 수 있다.



Input

Input은 로그를 수집하는 플러그인으로, 다양한 로그 소스를 지원한다. HTTP, tail, TCP 등 기본 플러그인 이외에도, 확장 플러그인을 통해서 다양한 서버나 애플리케이션으로 부터 다양한 포맷의 데이타를 수집할 수 있도록 해준다.

Parser (Optional)

Input 플러그인을 통해서 데이타를 읽어도 데이타 포맷이 Fluentd에서 지원하지 않는 데이타 포맷인 경우가 있기 때문에, 이 데이타를 파싱 하기 위해서, Parser 플러그인을 선택적으로 사용할 수 있다. Regular expression  기반으로 스트링을 Parsing 하는 플러그인 뿐 아니라, apache, nginx, syslog등 다양한 포맷의 데이타를 파싱할 수 있는 플러그인을 제공한다.

Filter (Optional)

Filter 플러그인을 읽어드린 데이타를 output으로 보내기 전에, 다음과 같은 3가지 기능을 한다.

  • 필터링

  • 데이타 필드 추가

  • 데이타 필드 삭제 또는 특정 필드 마스킹

필터링은 특정 데이타만 output 필드로 보내고, 나머지는 버리도록 한다. 예를 들어 로그 데이타에 “seoul”이라는 문자열이 있을 경우만 로그 서버로 보내거나 “error”, “warning”과 같은 특정 패턴이 있을 경우에만 로그 저장소로 보내도록할 수 있다.


데이타 필드 추가는 기존 들어온 로그 데이타에 데이타를 전송한 서버명 (Host명)등을 추가해서 로그 저장소로 보낼 수 있다.

마지막으로 데이타 필드 삭제는 불필요한 필드를 삭제하거나 개인 정보등 민감 정보를 삭제하거나 해쉬화하여 데이타 저장소로 보낼 수 있는 기능을 한다.

Output

Output은 Input 플러그인과 반대로, 앞에서 필터링된 데이타를  데이타 저장소 솔루션에 데이타를 저장하도록 한다. (mongodb나 AWS S3 , Google의 Big query등)

Formatter (Optional)

Output 플러그인을 통해서 데이타를 저장소에 쓸 때, Formatter 를 이용하면 쓰는 데이타의 포맷을 정의할 수 있다.(cf. Input의 parser가 포맷에 맞게 읽는 플러그인이라면, Formatter는 Output을 위한 포맷을 지정하는 플러그인이라고 보면 된다.)

Buffer (Optional)

Input에서 들어온 데이타를 바로 Output으로 보내서 쓰는것이 아니라 중간에 선택적으로 Buffer를 둬서 Throttling을 할 수 있다. 버퍼는 File과  Memory 두가지를 사용할 수 있다.

간단하게 구조와 작동 원리를 보면 다음과 같다.



<그림. fluentd의 로그 writing 흐름>

원본  http://docs.fluentd.org/articles/buffer-plugin-overview


버퍼에는 로그데이타를 분리하는 tag 단위로 chunk가 생성이 된다.

chunk는 태그별 큐라고 보면 된다. 예를 들어 error, info, warning, user 와 같이 태그를 분리하면 error 로그는 error chunk에 저장이 되고, info 로그는 info chunk에 저장된다.

Chunk에 데이타가 쌓여서 buffer_chunk_limit 만큼 chunk가 쌓여서 full이 되거나, 또는 설정값에 정의된 flush_interval 주기가 되면 로그 저장소로 로그를 쓰기 위해서 Queue에 전달이 된다.


<그림. Memory buffer 설정 예제>

참고 : http://docs.fluentd.org/articles/buffer-plugin-overview


다음 Queue에서는 데이타를 읽어서 로그 저장소에 데이타를 쓰는데, 로그 저장소에 문제가 없다면 바로 로그가 써지겠지만, 네트워크 에러나 로그 저장소 에러로 로그를 쓰지 못할때는 retry_wait 시간 만큼 대기를 한 후에, 다시 쓰기를 시도한다. 다시 쓰기를 실패하면 전에 기다린 시간의 2배 만큼, 또 실패하면 또 2배만큼을 기다린다. (1초, 2초, 4초,8초…) 다시 쓰기 시도는 설정값에 지정된 retry_limit 횟수까지 계속 진행한다.

만약에 Queue 가 차버렸을때 처리에 대한 정책을 설정할 수 있는데, “exception”과, “block” 모드 두가지고 있고, exception 모드일 경우에는 BufferQueueLimitError 를 내도록 하고, block 모드의 경우에는 BufferQueueLimitError가 해결될때 까지, input plugin을 중지 시킨다 (더이상 로그를 수집하지 않는다는 이야기).

Queue가 차버렸을때 다른 처리 방법으로는 큐가 다 찾을때, Sencondary output을 지정해서, 다른 로그 저장소에 로그를 저장하는 방법이 있다. 예를 들어 로그를 mongodb에 저장하도록 했는데, mongodb 나 네트워크 장애로 로그를 쓸 수 없는 경우에는 secondary output을 AWS S3로 지정해놓고, S3로 로그를 일단 저장하게 하고 나중에 mongodb가 복구된 후에, S3에서 다시 mongodb로 로그를 수집하는 방식을 취할 수 있다.



<그림. Secondary output 설정 예제>

출처 : http://docs.fluentd.org/articles/buffer-plugin-overview


Buffer 플러그인과, 에러 처리에 대한 자세한 내용은 http://docs.fluentd.org/articles/buffer-plugin-overview 를 참고하기 바란다.


데이타 구조

다음으로 Fluentd가 내부적으로 어떻게 로그 데이타를 핸들링 하는지 데이타 구조를 살펴보면 다음과 같다.



출처 :http://pt.slideshare.net/frsyuki/fluentd-set-up-once-collect-more


데이타는 크게 3가지 파트로 구성된다. Time, tag, record

  • Time : 로그데이타의 생성 시간

  • Record : 로그 데이타의 내용으로 JSON형태로 정의된다.

  • Tag : 이게 가장 중요한데, 데이타의 분류이다. 각 로그 레코드는 tag를 통해서 로그의 종류가 정해지는데, 이 tag에 따라서 로그에 대한 필터링,라우팅과 같은 플러그인이 적용 된다.

간단한 테스트

테스트 환경은 맥북을 기준으로 하였다.

http://docs.fluentd.org/articles/install-by-dmg 를 따라서 테스트를 하면 되는데, 먼저 fluentd를 받아서 인스톨을 한다.

인스톨이 끝나면, fluentd 프로세스인 td-agent는 /opt/td-agent/usr/sbin/에 인스톨이 된다.

그리고 디폴트 설정 파일은 /etc/td-agent/td-agent.conf에 저장된다.

td-agent.conf의 내용을 보면 다음과 같다.



<ROOT>

 <match td.*.*>

   type tdlog

   apikey xxxxxx

   auto_create_table

   buffer_type file

   buffer_path /var/log/td-agent/buffer/td

   <secondary>

     type file

     path /var/log/td-agent/failed_records

     buffer_path /var/log/td-agent/failed_records.*

   </secondary>

 </match>

 <match debug.**>

   type stdout

 </match>

 <source>

   type forward

 </source>

 <source>

   type http

   port 8888

 </source>

 <source>

   type debug_agent

   bind 127.0.0.1

   port 24230

 </source>

</ROOT>



<source> 부분을 보면 type이 http, port가 8888인 정의가 있다. 이 정의는 http://localhost:8888 로 부터 로그를 수집하겠다는 정의이다.

다음 <match>부분을 보면 <match debug.**> 라는 정의로 태그가 debug.**  로 정의된 로그에 대해서 type stdout으로, stdout (화면)으로 바로 출력하겠다는 정의이다.

http://localhost:8888/{debug.**} 로 들어오는 요청에 대해서 stdout으로 로그를 출력하겠다는 설정이다.


설정 파일을 확인했으면, 이제 기동을 해보자

/opt/td-agent/usr/sbin 디렉토리에서 -c 옵션으로 설정 파일을 지정하고 td-agent를 다음과 같이 실행해보자

% ./td-agent -c /etc/td-agent/td-agent.conf


에이전트가 실행되었으면 curl 명령을 이용하여 http://localhost:8888/debug.test 로 {"json":"message"} 로그 문자열을 전송해보자

% curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test


다음은 실행 결과 이다.





다음과 같이 td-agent가 기동된 후에,  맨 아랫줄에 debug.test 라는 태그 이름으로 {“json”:”message”}라는 로그가 수집되어 출력된것을 볼 수 있다.

데몬으로 실행하기

앞에서는 CLI상에서 foreground로 실행을 하였는데, 맥에서 서비스로 백그라운드 작업으로 실행을 할 수 있다. 실행 방법은

%sudo launchctl load /Library/LaunchDaemons/td-agent.plist

를 실행하면 백그라운드로 실행된다. 백그라운드로 실행을 위한 스크립트인 td-agent.plist는 fluentd설치시  /Library/LaunchDaemons/td-agent.plist에 자동 생성된다.

백그라운드 작업이기 때문에, stdout이 없고 stdout으로 출력되는 로그는 /var/log/td-agent/td-agent.log로 확인할 수 있다.





실행중인 프로세스를 종료 하는 방법은

%sudo launchctl unload /Library/LaunchDaemons/td-agent.plist

를 사용하면 된다.


다음 글에는 실제로 fluentd 를 설정해서 Google의 Bigquery또는 큐로 로그를 전달하는 설정 방법에 대해서 알아보겠다.


+ Recent posts