ANTEGRAL
ANTEGRAL BLOG
ANTEGRAL
전체 방문자
오늘
어제

인기 글

최근 댓글

hELLO · Designed By 정상우.
ANTEGRAL

ANTEGRAL BLOG

Server Management

sFlow 기반 모니터링 구축

2026. 8. 23. 05:55
반응형
본 글은 2025년 5월에 작성된 글이며, 현재 시점을 반영하지 않을 수 있습니다.

ServerForge/flows 설치

git clone https://github.com/ServerForge/flows

.env 생성

반드시 clone된 repo 폴더 안에서 생성할 것

GRAFANA_USERNAME="<GRAFANA_ADMIN_USERNAME>"
GRAFANA_PASSWORD="<GRAFANA_ADMIN_PASSWORD>"

pretag.map 설정

덮어쓰기 가능하며, set_label=<CHOICE_YOUR_ROUTER_NAME> ip=<SPLOW_ROUTER_IP> jeq=dir_tag 부분만 맨 위에 삽입 하는 것도 가능

set_label=<CHOICE_YOUR_ROUTER_NAME> ip=<SPLOW_ROUTER_IP> jeq=dir_tag

direction=1 set_tag=1 label=dir_tag
direction=0 set_tag=0

direction=1 set_tag=0 label=dir_tag_rev
direction=0 set_tag=1

sfacctd.conf 설정

덮어쓰기 가능하며, kafka_broker_host, kafka_broker_port 부분만 편집하는 것도 가능

plugins: kafka
aggregate: src_host, dst_host, src_port, dst_port, src_as, dst_as, proto, tag, label
kafka_output: json
kafka_broker_host: kafka
kafka_broker_port: 19092

kafka_topic: pmacct.acct
kafka_refresh_time: 5
kafka_history: 5m
kafka_history_roundoff: m
sfacctd_ext_sampling_rate: 1000
sfacctd_renormalize: true
sfacctd_as: bgp

networks_file_no_lpm: true
pre_tag_map: /etc/pmacct/pretag.map
sfacctd_as: longest
sfacctd_net: longest
networks_file: /etc/pmacct/networks.lst

bgp_daemon: true
bgp_daemon_max_peers: 10
bgp_agent_map: /etc/pmacct/peering_agent.map

peering_agent.map 생성 (선택)

BGP daemon 관련 매핑 테이블, 본인이 AS (BGP 서버) 운영하지 않는 이상 굳이 하지 않아도 됨.

bgp_ip=192.168.1.1     ip=0.0.0.0/0

docker-compose.yaml 생성

services:
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_USER=${GRAFANA_USERNAME}
      - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}
    networks:
      - monitoring_net

  sflow-collector:
    image: pmacct/sfacctd:latest
    container_name: sflow-collector
    depends_on:
      - kafka
    restart: always
    ports:
      - "6343:6343/udp"
    volumes:
      - ./sfacctd.conf:/etc/pmacct/sfacctd.conf:ro
      - ./networks.lst:/etc/pmacct/networks.lst:ro
      - ./peering_agent.map:/etc/pmacct/peering_agent.map:ro
      - ./pretag.map:/etc/pmacct/pretag.map:ro
    networks:
      - monitoring_net

  flow-consumer:
    image: serverforge/flow-consumer:v0.0.8-beta
    container_name: flow-consumer
    depends_on:
      - kafka
      - zookeeper
    network_mode: "service:clickhouse"
    restart: always
    environment:
      - brokers=kafka:19092
      - topic=pmacct.acct
      - database=dankflows
      - policy=365 DAYS

  zookeeper:
    image: zookeeper
    container_name: zookeeper
    restart: always
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    healthcheck:
      test: ["CMD-SHELL", "echo ruok | nc -w 2 zookeeper 2181"]
      interval: 5s
      timeout: 10s
      retries: 3
    networks:
      - monitoring_net

  kafka:
    image: wurstmeister/kafka
    container_name: kafka
    hostname: kafka
    restart: always
    depends_on:
      zookeeper:
        condition: service_healthy
    environment:
      - KAFKA_ADVERTISED_LISTENERS=INSIDE://:19092,OUTSIDE://172.17.0.1:9092
      - KAFKA_LISTENERS=INSIDE://kafka:19092,OUTSIDE://:9092
      - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      - KAFKA_INTER_BROKER_LISTENER_NAME=INSIDE
      - KAFKA_CREATE_TOPICS=pmacct.acct:3:1
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_LOG_RETENTION_HOURS=1
    networks:
      - monitoring_net

  clickhouse:
    image: clickhouse/clickhouse-server
    container_name: clickhouse
    restart: always
    volumes:
      - ./clickhouse-data:/var/lib/clickhouse/
      - ./no_logging.xml:/etc/clickhouse-server/users.d/no_logging.xml
      - ./disable_all_the_logs.xml:/etc/clickhouse-server/config.d/disable_all_the_logs.xml
      - ./no_verbose.xml:/etc/clickhouse-server/config.d/no_verbose.xml
    networks:
      - monitoring_net

volumes:
  grafana_data:

networks:
  monitoring_net:
    driver: bridge

Docker Compose 실행

다음 명령어 실행:

docker compose up -d

Clickhouse User 설정

패스워드 생성

enAg2PuT5TH20GuJqPbdjamWPOh8jzq9adZ32g5s 는 임의로 가정한 패스워드며, 실제로는 반드시 다른 패스워드를 사용할 것. (40자리 이상 권장)
echo -n "enAg2PuT5TH20GuJqPbdjamWPOh8jzq9adZ32g5s" | sha256sum

=> 54b70569ce4160d2a3e4b2a2a15b59e070dd8674a5f8eb4d960d282636fc932b

유저 등록

docker compose exec -it clickhouse clickhouse-client

실행 후, 다음 쿼리문 한줄씩 입력하여 쿼리 실행.
단, <CLICKHOUSE_USERNAME>을 Clickhouse에서 사용할 유저이름으로 대치하여 기입 할 것.

아래 쿼리문에 나와있는 54b70569ce4160d2a3e4b2a2a15b59e070dd8674a5f8eb4d960d282636fc932b 은 임의로 가정한 패스워드의 해시값이며, 실제로는 반드시 다른 패스워드의 해시값을 사용 할 것.
CREATE USER <CLICKHOUSE_USERNAME> IDENTIFIED WITH SHA256_HASH BY '54b70569ce4160d2a3e4b2a2a15b59e070dd8674a5f8eb4d960d282636fc932b' DEFAULT DATABASE dankflows;
GRANT ALL ON dankflows.* TO <CLICKHOUSE_USERNAME>;

SQL 쉘 세션 종료는 exit 명령으로 종료 할 수 있다.

sFlow 주입

Sampling Rate는 1000이 권장되며, :6343에 sFlow 메트릭을 꼽아주면 된다.

Grafana 설정

정상적으로 설정되었다면, :3000으로 Grafana가 호스트 되고 있을 것이다.

이후, 로그인하여 대시보드로 들어가서 다음 절차로 Datasource 추가를 마무리한다.

  • Datasource 구성에서 Clickhouse Extension을 설치하고 Prometheus 연결과 동일하게 Datasource를 추가할 수 있다.
  • Server address는 clickhouse, Server port는 9000이며, Protocol은 native로 선택하면 된다.
  • Username과 Password는 이전 단계에서 준비했던 정보를 넣어주고 Save 하면 된다.

권장 Dashboard

메트릭이 정상적으로 수집되면 다음과 같은 맞춤형 Dashboard를 쓸 수 있다.

https://grafana.com/grafana/dashboards/20502-sflow-analytics/
Dashboard ID는 20502다.

반응형
저작자표시 동일조건 (새창열림)
    ANTEGRAL
    ANTEGRAL
    개발 정보를 모아놓은 곳입니다.

    티스토리툴바