13장. Kafka 파일 디스크립터 설정
Kafka는 데이터를 디스크에 저장하고, 수많은 클라이언트와 연결을 유지하면서 동작합니다. 이 과정에서 운영체제가 관리할 수 있는 파일 디스크립터(File Descriptor) 수가 충분하지 않으면 성능 저하나 오류가 발생할 수 있습니다. 이 장에서는 디스크립터의 개념과 Kafka에 적절한 디스크립터 수를 계산하고 설정하는 방법을 설명합니다.
13.1 파일 디스크립터란?
파일 디스크립터는 리눅스에서 파일, 네트워크 연결(소켓), 파이프 등을 구분하기 위해 사용하는 숫자 ID입니다. Kafka는 로그 파일을 많이 열고, 클라이언트와 복제 연결도 유지하기 때문에 많은 디스크립터를 사용합니다.
13.2 Kafka에서 디스크립터가 중요한 이유
Kafka 브로커는 다음과 같은 작업에 디스크립터를 사용합니다:
| 항목 | 설명 |
|---|---|
| 로그 세그먼트 파일 | 파티션 데이터를 저장하는 .log, .index, .timeindex 파일 |
| 클라이언트 연결 | 프로듀서와 컨슈머의 TCP 연결 |
| 복제 연결 | 브로커 간 파티션 복제를 위한 연결 |
| 컨트롤러 연결 | KRaft 모드에서는 컨트롤러와 브로커 간 메타데이터 동기화 |
13.3 디스크립터가 부족할 때 발생하는 문제
Too many open files오류- 로그 파일을 열지 못해 데이터 유실 가능성
- 클라이언트 접속 실패 → 서비스 중단
OutOfMemoryError (Map failed)발생 가능
13.4 디스크립터 수 계산 방법
Kafka 운영 전에 필요한 디스크립터 수를 계산해보는 것이 중요합니다.
총 디스크립터 수 =
예상 연결 수
+ (파티션 수 × (파티션 크기 ÷ 세그먼트 크기))
- 예상 연결 수: 프로듀서 수 + 컨슈머 수 + 복제 연결 + 컨트롤러 연결
(파티션 크기 ÷ 세그먼트 크기)= 파티션당 세그먼트 수- 세그먼트당 실제 파일은 3개이지만, 보수적으로 1개로 간주
예시
- 연결 수: 6,000
- 파티션 수: 1,000
- 파티션 크기: 10GB
- 세그먼트 크기: 1GB
총 디스크립터 수 = 6,000 + (1,000 × 10) = 6,000 + 10,000 = 16,000개 이상 필요
Kafka는 버퍼 포함해서 100,000개 이상을 권장합니다.
13.5 관련 설정 확인 방법
세그먼트 크기 설정 (server.properties)
log.segment.bytes=1073741824 # 1GB
파티션 크기 추정 기준
- 하루 1GB 데이터 × 30일 보관 = 파티션당 30GB
- 이 기준으로 전체 파티션 크기 계산
13.6 디스크립터 수 설정 방법 (Linux)
임시 적용 (쉘 세션 한정)
ulimit -n 100000
영구 적용 방법
limits.conf
# /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000
systemd 설정 (kafka.service)
[Service]
LimitNOFILE=100000
설정 반영:
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart kafka