시스템 요구사항
PlantPulse 플랫폼을 안정적으로 운영하기 위한 하드웨어 / OS / 네트워크 요건을 안내합니다. 검증된 표준 환경을 기준으로 작성되었습니다.
한눈에 보는 요건
| 구분 | 최소 (개발 / 테스트) | 표준 (운영) | 대규모 |
|---|---|---|---|
| CPU | 16 vCPU | 32 vCPU | 48+ vCPU |
| 메모리 | 128 GB | 128 GB | 256 GB+ |
| OS 디스크 | 200 GB | 256 GB | 512 GB |
| 데이터 디스크 | 1 TB (SSD) | 1 TB (NVMe SSD) | 4 TB+ (NVMe SSD) |
| 네트워크 | 1 Gbps | 1 Gbps | 10 Gbps |
| OS | RHEL · Rocky · Oracle Linux 8.x 이상 | 9.x 또는 10.x | 동일 |
| JDK | OpenJDK 21 LTS | OpenJDK 21 LTS | OpenJDK 21 LTS |
데이터레이크 마스터 컨테이너(plantpulse-datalake)에는 96 GB 이상의 메모리 상한이 필요합니다. 96 GB 는 여유분이 아니라 최소치이고, 64 GB 상자는 지원 사양이 아닙니다.
- 왜 96 GB 인가 — 멈출 수 없는 상주 서비스(Aster TSDB 힙 16 GB + direct 6 GB, CEP, HiveMQ, Valkey, PostgreSQL, TSE, Kafka 등)의 선언 상한만 합쳐도 약 67 GB 입니다. 검증 환경에서 2026-10-29 에 이 컨테이너가 96 GB 상한에 닿았고, Kafka 가 메모리 할당 실패(ENOMEM)로 내려갔습니다.
- 호스트는 그보다 커야 합니다 — 설치 스크립트는 데이터레이크 상한을 호스트 RAM 의 90% 로 자릅니다. 그래서 호스트 RAM 이 107 GB 미만이면 96 GB 를 줄 수 없고, 그 호스트는 사양 미달입니다. 64 GB 상자는 상한이 57.6 GB 로 잘려 데이터레이크가 들어가지 않습니다.
- 앱 컨테이너 몫을 더합니다 — 같은 호스트에서 기본으로 도는 앱 컨테이너의 상한 합은 32 GB 입니다(server-web 14 · batch 4 · warehouse 4 · OPC UA 3 · AASX 3 · HA 2 · 프론트라인 1 · proxy 1). 마스터 96 GB + 앱 기본 상한 합 32 GB = 128 GB 라 최소 128 GB 와 맞습니다. mirror-maker 를 켜거나(+2 GB) 앱 상한을 올리면 그만큼 더 필요합니다. 상한은 천장이지 사용량이 아닙니다. 운영은 256 GB 를 권장합니다.
설치 뒤 실제 상한이 충분한지는 데이터레이크 CLI 의 pd doctor 가 판정합니다([9] memory budget 절, --memory-limit 에 docker inspect 의 HostConfig.Memory 값을 넘깁니다).
검증 환경: 운영 검증 환경(reference dev server)은 48 vCPU / 188 GB RAM / 4.8 TB NVMe SSD / RHEL 9 / Temurin OpenJDK 21.0.11 LTS 로 운영 중입니다.
하드웨어
CPU
- 권장: 32 vCPU 이상 (Intel Xeon, AMD EPYC, ARM Graviton 등)
- IIoT 엔진은 36 스레드 파이프라인을 사용 (
engine.pipeline.threads) - Spark 분산 분석은
PP_CLUSTER_CORES만큼 추가 사용 - 코어가 많을수록 동시 메시지 처리량 ↑
메모리
- 기본 128 GB 이상 · 운영 권장 256 GB
- 데이터레이크 마스터 컨테이너 96 GB 이상 — 호스트 RAM 이 107 GB 미만이면 사양 미달, 64 GB 는 지원 사양 아님(위 경고 참고)
- 메모리는 페이지 캐시로 Aster TSDB / Kafka 성능에 직접 영향
- Aster TSDB 힙: 16 GB 고정 + direct 메모리 6 GB
- 데이터레이크 컨테이너 메모리 한계:
DOCKER_DATALAKE_MEMORY— 기본96G, 호스트 RAM 의 90% 를 넘지 않게 잘립니다
디스크
OS / 데이터 디스크 분리 권장: OS 디스크 (
/) 와 데이터 디스크 (/data1) 를 분리해야 백업 / 확장 / 장애 격리가 쉬워집니다.
/ # OS 디스크 (256 GB)
└── opt/kopens/ # PlantPulse 설치 트리
/data1/ # 데이터 디스크 (1 TB+ NVMe SSD)
├── pp-data/ # Aster TSDB · PostgreSQL · RustFS · Valkey
├── pp-temp/ # Spark / 처리 임시
└── pp-backup/ # 백업 산출물
| 마운트 | 용량 | 디스크 종류 | 용도 |
|---|---|---|---|
/ | 256 GB | SSD | OS, 설치 트리 |
/data1 | 1 TB+ | NVMe SSD 필수 | 메인 데이터 |
/data2 ~ /dataN | 1 TB+ | NVMe SSD | (옵션) Aster TSDB 데이터 / commitlog 분리 |
Aster TSDB 디스크 최적화 (고급)
대규모 환경에서 commitlog 와 data 를 별도 디스크에 두면 쓰기 처리량이 크게 향상됩니다.
/data1/pp-data/cassandra/data/ # SSTable (대용량 NVMe)
/data2/pp-data/cassandra/commitlog/ # commitlog (별도 NVMe, sync I/O)
운영체제
지원 OS
RHEL · Rocky Linux · Oracle Linux 8.x · 9.x · 10.x — 세 배포판을 같은 것으로 다룹니다(RPM 계열 · 같은 패키지 이름 · 같은 방화벽 도구).
| OS | 버전 |
|---|---|
| RHEL · Rocky Linux · Oracle Linux | 8.x · 9.x · 10.x |
| AlmaLinux | 8.x · 9.x |
| Ubuntu | 20.04 이상 |
| Amazon Linux | 2 · 2023 |
이후 모든 안내는 RHEL · Rocky Linux · Oracle Linux 8.x · 9.x · 10.x 기준입니다. Ubuntu / Amazon Linux 를 쓰실 때는 패키지 명령(
apt/dnf)만 환경에 맞게 바꿔 주세요.
Java (JDK)
PlantPulse 는 Java 21 LTS 기반입니다. setup.sh / tools/java/ 가 자동 설치합니다.
$ java -version
openjdk version "21.0.11" 2026-04-21 LTS
OpenJDK Runtime Environment Temurin-21.0.11+10 (build 21.0.11+10-LTS)
수동 설치가 필요한 경우:
# RHEL/Rocky/Oracle
dnf install -y java-21-openjdk java-21-openjdk-devel
# Ubuntu
apt-get install -y openjdk-21-jdk
JAVA_HOME 환경 변수가 자동 등록되며, 모든 모듈은 JAVA_TOOL_OPTIONS="-Duser.language=${PP_LANG} -Duser.timezone=${PP_TZ}" 로 통합 적용됩니다.
네트워크 / 호스트명
호스트명
hostnamectl set-hostname plantpulse-prod-01
# /etc/hosts
vi /etc/hosts
# 첫 행 직후에 추가:
# 192.168.0.41 plantpulse-prod-01 plantpulse-prod-01.local
고정 IP
서버 IP 가 변경되면 클러스터 / 클라이언트 연결이 끊어지므로 반드시 고정 IP 를 사용합니다.
# NetworkManager (RHEL 9+)
nmcli con mod ens33 ipv4.method manual \
ipv4.addresses 192.168.0.41/24 \
ipv4.gateway 192.168.0.1 \
ipv4.dns "168.126.0.1 8.8.8.8"
nmcli con up ens33
시간 동기화 (필수)
분산 컴포넌트 (Aster TSDB, Kafka 등) 는 노드 간 시간 정확도에 매우 민감합니다.
dnf install -y chrony
systemctl enable --now chronyd
chronyc tracking # 동기화 상태 확인
chronyc -a makestep # 즉시 동기화
OS 튜닝 (필수)
아래 값은 install.sh(원라인 / Docker 설치) 가 자동으로 적용하는 값입니다. 수동 환경에서만 동일하게 직접 설정해 주세요.
파일 디스크립터 / 프로세스 한계
# /etc/security/limits.conf
* - memlock unlimited
* - nofile 1048576
* - nproc 32768
* - as unlimited
커널 파라미터
# /etc/sysctl.conf (install.sh 자동 적용)
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 10
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.somaxconn = 1024
vm.max_map_count = 1048576
vm.overcommit_memory = 0
fs.file-max = 1048576
sysctl -p /etc/sysctl.conf
Swap 비활성화
데이터베이스 / Java 프로세스는 swap 을 피해야 합니다.
swapoff --all
# /etc/fstab 의 swap 라인 주석 처리
sed -i '/swap/s/^/#/' /etc/fstab
SELinux
setup.sh 가 자동으로 permissive 로 전환합니다. 수동 변경:
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
Native 라이브러리
Aster TSDB 성능 향상을 위한 라이브러리.
dnf install -y jna jemalloc jemalloc-devel zstd libpq
디스크 I/O 튜닝
NVMe SSD
# /etc/udev/rules.d/60-ioscheduler.rules
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none"
ACTION=="add|change", KERNEL=="sd*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"
# 즉시 적용
udevadm trigger
HDD (운영 비권장)
echo mq-deadline > /sys/block/sdb/queue/scheduler
blockdev --setra 128 /dev/sdb
방화벽
install.sh 는 firewalld 를 활성화(systemctl enable --now firewalld)하고 플랫폼에 필요한 포트를 자동으로 개방합니다. 방화벽을 외부(회사 방화벽 / 클라우드 보안 그룹)에서 관리하는 경우에만 SKIP_FW=1 로 이 단계를 건너뛰세요.
수동 환경에서 직접 개방하는 예시:
systemctl enable --now firewalld
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=4950/tcp
firewall-cmd --permanent --add-port=1883/tcp
firewall-cmd --permanent --add-port=1884/tcp
firewall-cmd --permanent --add-port=9092/tcp
firewall-cmd --permanent --add-port=9094/tcp
firewall-cmd --reload
전체 포트 목록은 포트 구성 정보 참고.
상위 방화벽 / 클라우드 보안 그룹: 회사 / 클라우드 방화벽은 별도이므로 함께 허용해 주세요. 사설망 대역 (RFC 1918, Tailscale CGN) 은 신뢰 가능한 IP 로 source 제한을 추천합니다.
외부 접속 / 노출 권장
| 외부 노출 | 포트 | 권장 |
|---|---|---|
| 웹 콘솔 | 80, 443 | nginx/HAProxy 경유 권장 |
| 헬스체크 | 4950 | 모니터링 시스템 only (HTTPS) |
| MQTT (외부 디바이스) | 1884 (TLS), 18884 | TLS 권장 |
| Kafka 외부 클라이언트 | 9094 (TLS) | TLS 필수 |
| 데이터 게이트웨이 | 5500 | API Key + TLS |
DB / 메시징 PLAINTEXT 포트 / JMX 는 사설망 only 로 제한해 주세요.
지원 브라우저
웹 콘솔은 최신 표준 브라우저를 지원합니다.
| 브라우저 | 최소 버전 | 권장 |
|---|---|---|
| Google Chrome | 100+ | 권장 |
| Microsoft Edge | 100+ | ✓ |
| Firefox | 100+ | ✓ |
| Safari | 15+ | ✓ |
사전 점검 체크리스트
설치 전 다음을 확인해 주세요.
- CPU 16+ vCPU, 메모리 128+ GB(데이터레이크 마스터에 96 GB 를 줄 수 있어야 함 — 64 GB 는 지원 사양 아님), 데이터 디스크 200+ GB
- 데이터 디스크가 별도
/data1에 마운트 - OS RHEL/Rocky/Oracle 8+ 또는 Ubuntu 20.04+
- 고정 IP 설정
-
chronyd활성화 (시간 동기화) - 호스트명 +
/etc/hosts등록 - swap 비활성화
-
nofile 1048576등 limits 적용 -
vm.max_map_count등 sysctl 적용 - 방화벽 정책 (외부 노출 포트 명확)
- DNS 정상 작동 (
getent hosts <hostname>) - 인터넷 접근 또는 폐쇄망 번들 준비
다음 단계
- 빠르게 설치 → 원라인 설치 (권장)
- 컨테이너 기반 설치 → Docker 설치
- 포트 충돌 확인 → 포트 구성 정보