문제 해결
연결 문제
웹 콘솔에서 수집/전달 노드 상태가 회색으로 표시됨
먼저 분석 노드에서 수집/전달 노드의 웹 서버에 접속 가능한지 확인합니다. 분석 노드의 로그프레소 셸에 로그인한 후에 아래와 같이 수집/전달 노드 IP 주소와 웹 서버 포트를 입력하여 접속 가능 여부를 확인해보세요.
# tcpscan <수집/전달 노드 IP> 8443
tcpscan 203.0.113.161 8443
방화벽 정책 문제 진단
명령 실행 결과에 따라 아래와 같이 방화벽 정책 문제 또는 페더레이션 통신 포트 문제가 있을 수 있습니다.
- timeout
-
tcpscan 명령 시 일정 시간 후에 다음과 같이
timeout이 표시된다면 분석 노드에서 수집/전달 노드에 이르는 통신 경로에 위치한 모든 방화벽 정책과firewall-cmd --list-all명령으로 노드의 로컬 방화벽 정책을 확인하세요.trying to connect /203.0.113.161:8443 timeout - not opened: Connection refused
-
not opened: Connection refused메시지가 표시되는 경우에는 페더레이션 통신 포트가 열리지 않은 것이므로, 수집/전달 노드의 로그프레소 셸에서httpd.bindings명령을 실행해 포트 설정을 재확인하세요. 정상적인 경우, 다음과 같이 출력됩니다.# httpd.bindings 명령 실행 결과 /0.0.0.0:8443 (ssl: key logpresso-web, trust null), opened, default context: webconsole, idle timeout: 0seconds, log file prefix: null, access log: false, error log: false -
다음과 같이
httpd.openSsl명령을 실행하여 페더레이션 통신 포트를 개방하세요.# httpd.openSsl <포트> <컨텍스트> <키 별칭> httpd.openSsl 8443 webconsole logpresso-web
웹 서버 인증서 문제 진단
tcpscan <수집/전달 노드 IP> 8443 명령 실행 시 opened로 표시되는데도 웹 콘솔에서 수집/전달 노드 접속 상태가 회색으로 표시된다면, SSL 인증서 또는 정책 동기화 암호가 잘못 지정된 경우입니다. 원인을 구분하려면 운영 단말의 웹 브라우저에서 해당 노드의 8443 포트에 접속해 보세요. 아래와 같이 ERR_SSL_PROTOCOL_ERROR가 표시되면 인증서 문제입니다.
수집/전달 노드의 웹 서버 인증서 문제인 경우 sonar.setMaster 명령으로 마스터 노드 연결 설정을 재실행하세요(마스터 노드와 통신 중 인증서를 다운로드받아 설치하는 과정을 거칩니다). 다음은 sonar.setMaster 명령 실행 시 입력할 값에 대한 설명입니다.
host? 203.0.113.193 # 분석 노드 페어의 대표 IP 주소
port? 8443 # 8443 입력
account? root # 분석 노드 페더레이션 계정 root 입력
password? # 분석 노드 페더레이션 계정 암호 입력
connect timeout? 10000 # Enter 키를 누르면 기본값 사용
read timeout? 10000 # Enter 키를 누르면 기본값 사용
secure? true # true 입력 (기본값은 false)
skip cert check? true # true 입력 (기본값은 false)
정책 동기화 암호 문제 진단
웹 브라우저로 수집/전달 노드의 8443 포트에 접속했을 때 ENT 웹 콘솔 화면이 정상적으로 표시된다면, 페더레이션 계정 이름과 암호를 이 화면에서 입력하여 정상적으로 로그인 가능한지 확인하세요. 만약 로그인이 불가능하다면 수집/전달 노드의 로그프레소 셸에서 dom.resetPassword localhost root 명령을 수행하여 암호를 초기화하고, 웹 콘솔 시스템 > 클러스터 > 노드 화면에서 노드 A 설정, 노드 B 설정에 있는 암호에 초기화한 암호를 재입력하세요.
수집/전달 노드의 분석 노드 RPC 접속 실패
RPC 연결 상태 진단
수집/전달 노드의 로그프레소 셸에서 다음 명령을 실행하여 분석 노드 RPC 포트에 정상적으로 접속되는지 확인할 수 있습니다.
forwarder.connections # 전달 노드일 때
sentry.connections # 수집 노드일 때. 전달 노드에서도 실행 가능
명령 실행 결과 다음과 같은 내용을 조회할 수 있어야 합니다.
Connections
--------------------
[c1a] id=1317075310, peer=(39c2dd55-5bb5-4497-a327-ee6f8cae9ad9, /203.0.113.194:7140), trusted level=Low, ssl=true, props={phase=post_hello, ping_failure=0, type=command}
위와 같이 분석 노드 IP 주소와 관련된 RPC 연결이 표시되지 않는 경우, 방화벽 정책 문제이거나 TLS 상호 인증에 사용되는 인증서의 문제일 수 있습니다.
방화벽 정책 문제 진단
먼저 수집/전달 노드 로그프레소 셸에서 아래와 같이 분석 노드 IP 주소와 RPC 포트를 입력하여 접속 가능 여부를 확인해보세요.
# tcpscan <분석 노드 IP> 7140
tcpscan 203.0.113.193 7140
다음과 같이 일정 시간 후에 timeout이 출력된다면 수집/전달 노드에서 분석 노드에 이르는 통신 경로에 위치한 모든 방화벽 정책을 확인하세요.
trying to connect /203.0.113.193:7140
timeout
SSL 인증서 문제 진단
수집/전달 노드의 로그프레소 셸에서 logger.tail 명령어를 실행하거나, /opt/logpresso/log/araqne.log 파일을 조회하여 데몬 로그를 확인할 수 있습니다.
인증서 암호 오류
아래와 같이 keystore password was incorrect 오류가 발생하는 경우에는 인증서 암호가 잘못된 것입니다.
[2025-01-30 09:24:10.812] WARN (KeyStoreManagerImpl) - getKeyStore() error:
java.io.IOException: keystore password was incorrect
at java.base/sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:2116)
at java.base/sun.security.util.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:222)
at java.base/java.security.KeyStore.load(KeyStore.java:1479)
at org.araqne.keystore.KeyStoreManagerImpl.getKeyStore(KeyStoreManagerImpl.java:298)
at org.araqne.keystore.KeyStoreManagerImpl.getKeyManagerFactory(KeyStoreManagerImpl.java:414)
at org.araqne.rpc.RpcKeyStoreManagerImpl.__M_getKeyManagerFactory(RpcKeyStoreManagerImpl.java:62)
at org.araqne.rpc.RpcKeyStoreManagerImpl.getKeyManagerFactory(RpcKeyStoreManagerImpl.java)
at org.logpresso.sentry.impl.ConnectionWatchdogImpl.__M_connect(ConnectionWatchdogImpl.java:216)
at org.logpresso.sentry.impl.ConnectionWatchdogImpl.connect(ConnectionWatchdogImpl.java)
at org.logpresso.sentry.impl.ConnectionWatchdogImpl.__M_checkConnections(ConnectionWatchdogImpl.java:171)
at org.logpresso.sentry.impl.ConnectionWatchdogImpl.checkConnections(ConnectionWatchdogImpl.java)
at org.logpresso.sentry.impl.ConnectionWatchdogImpl.__M_checkNow(ConnectionWatchdogImpl.java:149)
at org.logpresso.sentry.impl.ConnectionWatchdogImpl.checkNow(ConnectionWatchdogImpl.java)
at org.logpresso.sentry.impl.ConnectionWatchdogImpl.__M_run(ConnectionWatchdogImpl.java:123)
at org.logpresso.sentry.impl.ConnectionWatchdogImpl.run(ConnectionWatchdogImpl.java)
at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.security.UnrecoverableKeyException: failed to decrypt safe contents entry: javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
... 16 more
신뢰할 수 없는 인증서 오류
아래와 같이 No trusted certificate found 오류가 발생하는 경우에는 분석 노드에서 발급한 인증서가 아닌 최초 데몬 시작 시 자동 생성된 인증서가 사용된 것입니다.
[2025-01-30 09:28:14.623] ERROR (ConnectionWatchdogImpl) - logpresso-sentry: failed to connect, closing connection (No trusted certificate found)
[2025-01-30 09:28:14.624] ERROR (RpcHandler) - araqne rpc: ssl handshake exception from x.x.x.x:7140, channel 2ca2e90a (No trusted certificate found)
두 가지 오류 모두 sonar.setMaster 명령으로 마스터 노드 연결 설정을 재실행하세요(마스터 노드와 통신 중 인증서를 다운로드받아 설치하는 과정을 거칩니다). 다음은 sonar.setMaster 명령 실행 시 입력할 값에 대한 설명입니다.
host? 203.0.113.193 # 분석 노드 페어의 대표 IP 주소
port? 8443 # 8443 입력
account? root # 분석 노드 페더레이션 계정 root 입력
password? # 분석 노드 페더레이션 계정 암호 입력
connect timeout? 10000 # Enter 키를 누르면 기본값 사용
read timeout? 10000 # Enter 키를 누르면 기본값 사용
secure? true # true 입력 (기본값은 false)
skip cert check? true # true 입력 (기본값은 false)
Syslog 수신 진단
웹 콘솔에서 수집기를 설정해도 전달 노드를 경유하여 Syslog가 정상적으로 수집되지 않는 경우에는 아래와 같이 진단합니다. 아래 예시에서는 IP 주소 172.20.100.100에서 패킷을 전송한다고 가정합니다.
전달 노드 트레이스
-
전달 노드에 SSH로 접속한 후 아래 명령을 실행해 로그프레소 셸에 진입하세요.
ssh -p7022 root@localhost -
syslog.servers명령을 실행해 Syslog 서버 설정 목록을 조회하세요.Syslog Servers ---------------- [logpresso] 0.0.0.0:514 (udp), charset=UTF-8 (override: 0), capacity=20000, rx_buf_size=0, receiver_cpu_id=-1, queue_count=1, buffer_file_path=./, buffer_file_size=10737418240, start from=2024-12-11 13:22:13, received=7 -
syslog.stats logpresso명령으로 Syslog 클라이언트 IP 주소별 수신 통계를 조회할 수 있습니다.Syslog Statistics ------------------- x.x.x.x => 1 (first seen 2025-01-20 10:58:44, last seen 2025-01-20 10:58:44) -
syslog.trace logpresso명령으로 실시간으로 수신되는 Syslog 패킷 내용을 추적할 수 있습니다. 추적 중에Ctrl+C키를 누르면 중단합니다.
Syslog 패킷 확인
다음과 같이 터미널에서 tcpdump 명령어를 이용하여 패킷이 로그프레소 전달 노드에 도달하는지 검증할 수 있습니다.
# tcpdump -i <인터페이스> host <전달 노드 IP 주소> port <전달 노드의 syslog 포트> -A
tcpdump -i any host 172.20.100.100 port 514 -A
포트 개방 확인
-
전달 노드에 Syslog 패킷이 도달하고 있는 것이 확인되었다면
netstat -na | grep :514명령을 실행해 포트가 열려있는지 확인합니다.# netstat -na | grep :514 udp 0 0 0.0.0.0:514 0.0.0.0:* -
위와 같이 포트가 열려있지 않다면 설치 단계에서 JVM 권한 부여 단계를 누락하여 포트 개방에 실패했거나, 포트 설정이 변경되었을 수 있습니다. 아래 명령어를 실행하여
cap_net_bind_service가 출력되는지 확인합니다.# getcap <java 실행 파일 경로> getcap /opt/logpresso/jdk/bin/java -
권한이 부여되어 있지 않다면
setcap명령어로java실행 파일에 필요한 권한을 부여하세요.# setcap cap_net_bind_service,cap_sys_time,cap_net_raw=+ep <java 실행 파일 경로> setcap cap_net_bind_service,cap_sys_time,cap_net_raw=+ep /opt/logpresso/jdk/bin/java
호스트 방화벽 정책 확인
Syslog 클라이언트부터 전달 노드까지 연결 경로 막히는 구간이 없지만 Syslog 패킷이 전달 노드에 전혀 들어오지 않는 경우, firewall-cmd --list-ports 명령을 실행해 호스트 방화벽 정책을 다시 확인하세요.
# firewall-cmd --list-ports
rp_filter 설정 확인
방화벽 정책, 포트 개방 상태가 모두 정상이지만 로그프레소 셸에서 syslog.trace 명령으로 수신을 확인할 수 없는 경우, 리눅스 커널의 Reverse Path Filtering 설정 문제일 수 있습니다.
리눅스 커널의 Reverse Path Filtering 기능은 패킷의 출처를 확인하여 스푸핑된 패킷을 차단하는 기능입니다. 기본값은 1로 설정되어 있으며 유효하지 않은 경로에서 들어오는 패킷을 버립니다.
전달 노드에 여러 개의 네트워크 인터페이스 카드가 있고, 출처로부터 여러 네트워크 인터페이스 카드를 통해 패킷을 수신할 수 있는 환경이라면, rp_filter 설정을 변경하세요.
기존 설정 확인
-
cat /proc/sys/net/ipv4/conf/<인터페이스>/rp_filter명령을 실행해rp_filter설정 값을 확인하세요.# cat /proc/sys/net/ipv4/conf/eth2/rp_filter # 실행 결과 10(비활성화): Reverse Path Filtering을 수행하지 않음1(기본값, 엄격): 패킷의 출발지 IP 주소를 기준으로 해당 인터페이스의 경로를 확인하고, 일치하지 않으면 패킷을 버림2(느슨함): 동일한 출발지 IP 주소를 가진 패킷이 어느 인터페이스를 통해서든 유효한 경로를 가지면 허용
-
값이 1인 경우,
/etc/sysctl.conf파일 끝에 아래 설정을 추가합니다.
net.ipv4.conf.eth2.rp_filter = 2
-
관리자 권한으로 아래 명령어를 실행하여 커널 설정을 변경합니다.
sysctl -p
MariaDB
Galera Cluster 재시작 불가
Galera Cluster 서버를 모두 중지시킨 후 재시작할 때 클러스터가 실행되지 않고, systemctl start mariadb 명령으로도 데이터베이스가 실행되지 않는 경우, 다음 순서에 따라 MariaDB를 재시작하세요.
-
(분석 노드 A) 관리자 권한으로
/var/lib/mysql/grastate.dat파일을 편집하세요.# GALERA saved state Version: 2.1 Uuid: 5022f7e5-281a-11e8-98c9-9baa762d13e6 Seqno: -1 Safe_to_bootstrap: 1Safe_to_bootstrap값을1에서0으로 변경하세요.
-
(분석 노드 A) Galera Cluster 서버를 재시작하세요.
sudo galera_new_cluster -
(분석 노드 B) 다음 명령을 실행해 MariaDB를 시작하고,
wsrep_start_position이 분석 노드 A와 동일한 값을 갖는지 확인하세요.sudo systemctl start mariadb && \ ps -ef | grep mysql이 명령을 실행하면 다음과 비슷한 결과를 확인할 수 있습니다.
mysql 1141195 1 1 Apr15 ? 22:50:53 /usr/sbin/mariadbd --wsrep_start_position=c6609d0e-091a-11f0-86bb-3e7cc9ee21e7:40512Caution노드 B는 이미 시작된 Galera Cluster에 조인하는 것이므로 galera_new_cluster 명령을 실행하면 안 됩니다. galera_new_cluster 명령은 클러스터에서 가장 처음 구동되는 노드에서만 실행해야 합니다.
Notewsrep_start_position 값이 "00000000-0000-0000-0000-000000000000"이라면, systemctl restart mariadb 명령을 실행하세요.
OOM 및 메모리 누수 진단
힙 덤프 생성
노드에서 OutOfMemoryError(OOM)가 발생해 logpresso 프로세스가 중지되거나 메모리 누수가 의심되는 경우, 힙 덤프를 생성해 원인을 진단할 수 있습니다.
-
/opt/logpresso/etc/logpresso.conf파일 끝에 다음 행을 추가하세요.JAVA_OPTS="$JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError" JAVA_OPTS="$JAVA_OPTS -XX:HeapDumpPath=/data/heapdump.hprof" -
logpresso프로세스를 재시작하세요.sudo systemctl restart logpresso -
이후 OOM이 발생하면 지정한 경로에 힙 덤프 파일이 자동으로 생성됩니다. 다음 명령으로 파일을 확인하세요.
ls -lh /data/heapdump.hprof
장애 분석용 데이터 수집
-
jcmd명령을 실행해araqne-core가 동작하고 있는java프로세스의 PID를 확인하세요. 다음은 명령 실행한 결과 예시입니다.3370022 /logpresso/araqne-core-4.0.5-package.jar 2428126 jdk.jcmd/sun.tools.jcmd.JCmd -
확인한 PID를 기반으로 증적을 생성하세요.
# 앞서 확인한 PID를 기반으로 jcmd를 실행./jfd합니다. # 저장되는 파일의 경로는 변경이 가능합니다. # 모든 증적 파일은 생성할 디렉토리의 여유가 있는 공간에 적재되도록 실행합니다. # jmap 생성 jcmd 3370022 GC.class_histogram > /data/histogram_yyMMdd.txt # JFR 생성 -> (60초 이 후 파일이 생성됩니다.) jcmd 3370022 JFR.start duration=60s settings=profile filename=/data/jfr_yyMMdd.jfr # jstack 생성 jcmd 3370022 Thread.print > /data/jstack_yyMMdd.txt # HeapDump 생성 # 파일의 크기는 Java 힙 메모리 크기만큼 생성될 수 있습니다. 가급적 여유로운 디렉토리에서 수행하세요. jcmd 3370022 GC.heap_dump -all=true /data/heapdump_yyyyMMdd.hprof -
생성된 증적을 반출하세요.
PATH에 등록된 경로가 아니라면, java 파일이 있는 디렉터리로 이동해서 각 명령어 앞에 './'을 붙여서 감사 증적 생성 명령을 실행하세요.
