개념 사전 · 개념

ALPACA 관제 프로젝트 구조

ALPACA 관제 프로젝트

이 자료의 ALPACA는 센서의 패킷·경보를 중앙 분석으로 전달하는 수업 프로젝트의 이름이다. 범용 제품 사양이 아니라 ·배치· 프레이밍·복구 경계를 설명하는 설계 사례로 읽는다.

밑줄 용어에 마우스를 올리거나, 키보드로 선택하거나, 터치하면 설명을 볼 수 있습니다.

01무엇이고, 어떤 일을 하나

  • 센서의 캡처와 전송 작업을 큐로 분리한다.
  • 길이와 타입을 가진 프레임으로 여러 기록을 전달한다.
  • 중앙 이벤트에서 원본 패킷·경보로 되돌아갈 참조를 유지한다.

02어떤 순서로 동작하나

  1. 패킷 수집

    libpcap에서 번호·timestamp·raw bytes를 얻어 Packet 에 넣는다. 항목 수 한도는 바이트 한도와 다르다.

  2. 배치 구성

    송신기가 개수·바이트·최대 대기시간 조건으로 배치를 모은다.

  3. 프레임 직렬화

    !4sBBI 공통 헤더에 magic·version·type·payload 바이트 길이를 쓰고 type2의 count와 레코드들을 연결한다.

  4. 에서 재구성

    수신기는 10바이트 헤더를 모아 검사한 뒤 지정된 payload를 정확히 읽는다. 한 recv가 한 프레임이라는 전제는 사용하지 않는다.

  5. 내부 경계 검증

    Count·각 raw_length·남은 바이트·전체 상한을 검사한 뒤 저장 큐에 전달한다.

  6. 확인·재전송 관리

    Send 성공과 DB commit을 구분하고 센서·세션·레코드 키로 중복을 다룬다. 재전송만으로 exactly-once가 보장되지는 않는다.

03먼저 알아둘 용어와 구성요소

이 프로젝트에서 메시지 경계를 표현하는 자체 프레임 형식.
생성 속도와 전송 속도를 분리하는 대기 구조.
바이트 스트림에서 한 메시지를 완성하는 길이 정보.
로그 파일의 읽기 위치 또는 버퍼에서 파싱한 위치를 나타내는 값.
송신 바이트 순서를 제공하지만 응용 메시지 경계를 보존하지 않는 전달 방식.
메시지 앞에 길이를 기록해 수신자가 경계를 재구성하는 표현.
배치 또는 메시지의 순서를 식별하는 값.
LEARN THROUGH PRACTICE

날짜별 파일과 압축 결과에서 회전 중 수집 위치 추적하기

로그 파일명이 바뀌거나 내용이 잘리는 순간에 경로··읽기 이 어떻게 달라지는지 설명하고 누락·중복을 구분한다.

실습 구성과 전제

  • 시험용 로그 디렉터리와 고유 번호가 붙은 가상 이벤트를 사용한다. 서비스 운영 로그를 임의로 자르지 않는다.
  • 날짜별 웹 로그 화면과 alert_fast 수집 설계는 서로 다른 자료다. 파일 회전의 공통 원리를 비교하며 동일 실행의 전후 사진이라고 가정하지 않는다.
  1. 현재 파일명과 수집 상태를 따로 기록하기

    • 날짜가 파일명에 들어가면 하루가 바뀔 때 다른 경로가 생길 수 있다. 수집기가 한 경로만 계속 열고 있으면 새 파일을 발견하지 못할 수 있으므로 파일 발견 정책부터 확인한다.
    • 파일명을 기억하는 것만으로는 부족하다. 와 읽기 을 함께 기록해야 같은 이름으로 새 파일이 생긴 경우와 기존 파일이 자라난 경우를 구별할 수 있다.
    bash
    stat -c '%i %s %n' ./lab.log
    logrotate -d ./lab-logrotate.conf

    lab.log와 시험 설정을 준비한 뒤 메타데이터와 회전 계획만 확인하는 예. -d는 실제 회전을 수행하지 않는다.

    log server 설정 · 실습·개념 참고 화면 1원본 크기로 보기 ↗
    • web/access 아래에 20260617.log와 20260618.log가 별도 파일로 나열되어 있다. 날짜가 바뀐 파일을 하나의 고정 경로로 볼 수 없다.
    • web/error가 access와 분리된 디렉터리로 보인다. 정상 접근 로그와 오류 로그의 수집 대상·규칙도 각각 지정할 필요가 있다.
    확인 기준

    고유 이벤트 번호, , 크기, 의 기준값을 저장한 뒤 회전 시험을 시작한다.

  2. 회전 후 압축 파일과 새 파일의 경계를 찾기

    • rename 회전에서는 기존 파일을 열고 있던 수집기가 그 파일의 끝까지 읽고, 새 의 활성 파일로 넘어가야 한다. 작성 도 새 파일을 다시 열 수 있어야 한다.
    • copytruncate는 복사 후 같은 파일을 비우므로 가 유지될 수 있다. 복사와 비우기 사이에 추가된 데이터의 손실 가능성이 있고, 파일이 빠르게 다시 자라면 단순 크기 감소 검사만으로 회전을 놓칠 수도 있다.
    log server 설정 · 실습·개념 참고 화면 2원본 크기로 보기 ↗
    • 20260617.log-20260618.gz처럼 원래 날짜와 회전 접미 날짜가 함께 들어간 압축 파일명이 보인다.
    • 압축 파일이 존재한다는 것은 보관 결과가 있다는 뜻이다. 그 안에 모든 이벤트가 들어 있는지, 수집기가 읽었는지는 파일명만으로 알 수 없다.
    확인 기준

    회전 직전·직후 이벤트 번호가 활성 파일과 압축 파일 중 어디에 있는지 읽어서 확인한다. copytruncate와 create를 함께 썼다고 새 가 생성되는 것은 아니다.

  3. 읽은 번호와 전송 완료 번호를 대조하기

    • 파일에서 읽은 이벤트 번호와 중앙 저장소가 확인한 번호를 분리한다. 수집기가 읽은 직후 종료되면 메모리 버퍼에만 있던 이벤트는 아직 저장 성공이 아니다.
    • 가상 이벤트 101·102·103을 기준으로 회전 전후와 수집기 재시작을 나누어 시험한다. 원본 파일의 세 번호, 송신 기록의 세 번호, 최종 저장소의 세 번호를 비교해야 손실과 중복을 셀 수 있다.
    bash
    gzip -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상세 노트 · 실습 자료

헤더 구조, 설정 예시, 수치 계산과 수업 캡처는 아래 노트에서 이어집니다.

공식 문서 · 표준

기초 개념과 동작 설명을 대조한 자료입니다. 제품 버전과 실제 설정에 따른 차이는 본문 및 원문에서 확인하세요.