ALPACA 관제 프로젝트 구조
ALPACA 관제 프로젝트
이 자료의 ALPACA는 센서의 패킷·경보를 중앙 분석으로 전달하는 수업 프로젝트의 이름이다. 범용 제품 사양이 아니라 ·배치· 프레이밍·복구 경계를 설명하는 설계 사례로 읽는다.
밑줄 용어에 마우스를 올리거나, 키보드로 선택하거나, 터치하면 설명을 볼 수 있습니다.
01무엇이고, 어떤 일을 하나
- 센서의 캡처와 전송 작업을 큐로 분리한다.
- 길이와 타입을 가진 프레임으로 여러 기록을 전달한다.
- 중앙 이벤트에서 원본 패킷·경보로 되돌아갈 참조를 유지한다.
02어떤 순서로 동작하나
- 패킷 수집
libpcap에서 번호·timestamp·raw bytes를 얻어 Packet 에 넣는다. 항목 수 한도는 바이트 한도와 다르다.
- 배치 구성
송신기가 개수·바이트·최대 대기시간 조건으로 배치를 모은다.
- 프레임 직렬화
!4sBBI 공통 헤더에 magic·version·type·payload 바이트 길이를 쓰고 type2의 count와 레코드들을 연결한다.
- 에서 재구성
수신기는 10바이트 헤더를 모아 검사한 뒤 지정된 payload를 정확히 읽는다. 한 recv가 한 프레임이라는 전제는 사용하지 않는다.
- 내부 경계 검증
Count·각 raw_length·남은 바이트·전체 상한을 검사한 뒤 저장 큐에 전달한다.
- 확인·재전송 관리
Send 성공과 DB commit을 구분하고 센서·세션·레코드 키로 중복을 다룬다. 재전송만으로 exactly-once가 보장되지는 않는다.
03먼저 알아둘 용어와 구성요소
- 이 프로젝트에서 메시지 경계를 표현하는 자체 프레임 형식.
- 생성 속도와 전송 속도를 분리하는 대기 구조.
- 바이트 스트림에서 한 메시지를 완성하는 길이 정보.
- 로그 파일의 읽기 위치 또는 버퍼에서 파싱한 위치를 나타내는 값.
- 송신 바이트 순서를 제공하지만 응용 메시지 경계를 보존하지 않는 전달 방식.
- 메시지 앞에 길이를 기록해 수신자가 경계를 재구성하는 표현.
- 배치 또는 메시지의 순서를 식별하는 값.
날짜별 파일과 압축 결과에서 회전 중 수집 위치 추적하기
로그 파일명이 바뀌거나 내용이 잘리는 순간에 경로··읽기 이 어떻게 달라지는지 설명하고 누락·중복을 구분한다.
실습 구성과 전제
- 시험용 로그 디렉터리와 고유 번호가 붙은 가상 이벤트를 사용한다. 서비스 운영 로그를 임의로 자르지 않는다.
- 날짜별 웹 로그 화면과 alert_fast 수집 설계는 서로 다른 자료다. 파일 회전의 공통 원리를 비교하며 동일 실행의 전후 사진이라고 가정하지 않는다.
현재 파일명과 수집 상태를 따로 기록하기
- 날짜가 파일명에 들어가면 하루가 바뀔 때 다른 경로가 생길 수 있다. 수집기가 한 경로만 계속 열고 있으면 새 파일을 발견하지 못할 수 있으므로 파일 발견 정책부터 확인한다.
- 파일명을 기억하는 것만으로는 부족하다. 와 읽기 을 함께 기록해야 같은 이름으로 새 파일이 생긴 경우와 기존 파일이 자라난 경우를 구별할 수 있다.
bashstat -c '%i %s %n' ./lab.log logrotate -d ./lab-logrotate.conflab.log와 시험 설정을 준비한 뒤 메타데이터와 회전 계획만 확인하는 예. -d는 실제 회전을 수행하지 않는다.
원본 크기로 보기 ↗- web/access 아래에 20260617.log와 20260618.log가 별도 파일로 나열되어 있다. 날짜가 바뀐 파일을 하나의 고정 경로로 볼 수 없다.
- web/error가 access와 분리된 디렉터리로 보인다. 정상 접근 로그와 오류 로그의 수집 대상·규칙도 각각 지정할 필요가 있다.
확인 기준고유 이벤트 번호, , 크기, 의 기준값을 저장한 뒤 회전 시험을 시작한다.
회전 후 압축 파일과 새 파일의 경계를 찾기
- rename 회전에서는 기존 파일을 열고 있던 수집기가 그 파일의 끝까지 읽고, 새 의 활성 파일로 넘어가야 한다. 작성 도 새 파일을 다시 열 수 있어야 한다.
- copytruncate는 복사 후 같은 파일을 비우므로 가 유지될 수 있다. 복사와 비우기 사이에 추가된 데이터의 손실 가능성이 있고, 파일이 빠르게 다시 자라면 단순 크기 감소 검사만으로 회전을 놓칠 수도 있다.
원본 크기로 보기 ↗- 20260617.log-20260618.gz처럼 원래 날짜와 회전 접미 날짜가 함께 들어간 압축 파일명이 보인다.
- 압축 파일이 존재한다는 것은 보관 결과가 있다는 뜻이다. 그 안에 모든 이벤트가 들어 있는지, 수집기가 읽었는지는 파일명만으로 알 수 없다.
확인 기준회전 직전·직후 이벤트 번호가 활성 파일과 압축 파일 중 어디에 있는지 읽어서 확인한다. copytruncate와 create를 함께 썼다고 새 가 생성되는 것은 아니다.
읽은 번호와 전송 완료 번호를 대조하기
- 파일에서 읽은 이벤트 번호와 중앙 저장소가 확인한 번호를 분리한다. 수집기가 읽은 직후 종료되면 메모리 버퍼에만 있던 이벤트는 아직 저장 성공이 아니다.
- 가상 이벤트 101·102·103을 기준으로 회전 전후와 수집기 재시작을 나누어 시험한다. 원본 파일의 세 번호, 송신 기록의 세 번호, 최종 저장소의 세 번호를 비교해야 손실과 중복을 셀 수 있다.
bashgzip -cd -- ./20260617.log-20260618.gz실습 디렉터리의 압축 보관 내용을 표준 출력으로 읽는 예. 실제 파일명에 맞춰 사용하며 원본을 덮어쓰지 않는다.
확인 기준번호가 빠지면 작성·회전·읽기·전송 중 최초로 사라진 구간을 찾는다. 같은 번호가 둘이면 재전송과 체크포인트 저장 순서를 검사한다.
실습에서 확인한 동작 원리
- 압축 파일 생성은 보관의 증거이며, 수집 완전성의 증거는 이벤트 번호 대조다.
- 파일 회전과 중앙 전송 확인을 별도로 설계해야 재시작 때 누락과 중복을 설명할 수 있다.
동작·명령 참고 문서
04예제로 따라가기
- 레코드 조건: 타입 2 배치에 raw 길이가 60바이트와 100바이트인 패킷 두 개가 있다고 가정한다. 실제 통신을 생성하지 않는 포맷 계산이다.
- 레코드 길이: 첫 레코드는 20+60=80바이트, 두 번째는 20+100=120바이트다. 고정부가 각 패킷마다 반복된다.
- Payload 길이: 개수 필드 4바이트를 더하면 payload는 4+80+120=204바이트다. 헤더의 payload 길이 필드는 이 값을 나타낸다.
- 전체 프레임: 10바이트 공통 헤더를 더하면 총 214바이트다. 분할 때문에 실제 recv 횟수나 세그먼트 수는 달라질 수 있다.
- 불일치 입력: count=3인데 payload가 두 레코드에서 끝나면 정상 완료로 넘기지 않는다. 미완성·잘못된 선언을 구분하여 연결·레코드 처리 정책을 적용한다.
05혼동하기 쉬운 점과 확인 기준
- 단계별 개수: 센서 생성·큐 입력·프레임 송신·중앙 파싱·적재 개수를 같은 ID 범위로 비교한다. 서로 다른 시점의 총계는 직접 같지 않을 수 있다.
- 문자열 길이: 타입 1·3의 길이가 바이트 기준인지 확인한다. 한글 한 글자가 1바이트라는 가정은 이후 필드 경계를 깨뜨린다.
- 미완성 꼬리: 연결 종료 때 헤더·payload 중 어디까지 받았는지 기록한다. 정상 연결 수와 정상 프레임 수를 동일시하지 않는다.
06상세 노트 · 실습 자료
헤더 구조, 설정 예시, 수치 계산과 수업 캡처는 아래 노트에서 이어집니다.
공식 문서 · 표준
기초 개념과 동작 설명을 대조한 자료입니다. 제품 버전과 실제 설정에 따른 차이는 본문 및 원문에서 확인하세요.