Kafka ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ํฐ๋ง๊ณผ ๋ก๊น : ์ค์๊ฐ ์ด์ ํจ์จ์ฑ ๊ทน๋ํํ๊ธฐ
Apache Kafka ๋ ๋๊ท๋ชจ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์คํ ์ ํต์ฌ์ผ๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ์ ์ผ๋ก ์ด์๋๋ ค๋ฉด ๋ชจ๋ํฐ๋ง ๊ณผ ๋ก๊น ์ด ์ค์ํฉ๋๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ Logback ์ด๋ Log4j ๊ฐ์ ๋ก๊น ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ Kafka ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก๊น ์ ๊ด๋ฆฌํ๊ณ , JMX ๋ Prometheus ๋ฅผ ํตํด Kafka ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ํฐ๋งํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค. ๋ํ, Grafana ๋ฅผ ํตํด ์ค์๊ฐ์ผ๋ก ๋ฉํธ๋ฆญ ์๊ฐํ ํ๋ ๋ฐฉ๋ฒ๋ ์๊ฐํฉ๋๋ค.
1. Logback์ด๋ Log4j ๊ฐ์ ๋ก๊น ํ๋ ์์ํฌ ์ฌ์ฉ
Kafka ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ก๊น ์ ๋ฌธ์ ๋ฅผ ์ถ์ ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ํ์ ํ๋ ๋ฐ ์ค์ํ ๋๊ตฌ์ ๋๋ค. Logback ๊ณผ Log4j ๋ Java ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ก๊น ํ๋ ์์ํฌ ์ ๋๋ค.
Logback ์ค์ ์์ (
logback.xml
)
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="org.apache.kafka" level="INFO"/>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
Log4j ์ค์ ์์ (
log4j2.xml
)
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="org.apache.kafka" level="INFO" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Root level="INFO">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
์ค๋ช :
- Logback ๊ณผ Log4j ์ค์ ์ ํตํด Kafka ์ ํ๋ฆฌ์ผ์ด์ ์์ INFO ๋ ๋ฒจ์ ๋ก๊ทธ๋ฅผ ์ฝ์์ ์ถ๋ ฅํ๋๋ก ๊ตฌ์ฑํ์ต๋๋ค.
- Kafka ๋ก๊ฑฐ ๋ org.apache.kafka ๋ค์์คํ์ด์ค๋ก ์ค์ ๋์ด ์์ผ๋ฉฐ, Kafka ๊ด๋ จ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
2. Kafka ๋ก๊น ๋ ๋ฒจ ์ค์
Kafka๋ ์์ฒด์ ์ผ๋ก ๋ค์ํ ๋ก๊น ๋ ๋ฒจ์ ์ง์ํ๋ฉฐ, INFO , DEBUG , WARN , ERROR ์ ๊ฐ์ ๋ก๊น ๋ ๋ฒจ์ ์ค์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํ์ํ ์ ๋ณด๋ง ๋ก๊น ํ์ฌ ๋ก๊ทธ ์ฑ๋ฅ ์ ์ต์ ํํ ์ ์์ต๋๋ค.
Kafka ๋ก๊น
๋ ๋ฒจ ์ค์ ์์ (
logback.xml
)
<logger name="org.apache.kafka.clients.consumer" level="DEBUG"/>
<logger name="org.apache.kafka.clients.producer" level="ERROR"/>
์ค๋ช :
- DEBUG ๋ ๋ฒจ ๋ก Kafka ์ปจ์๋จธ ์ ์์ธ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ๊ณ , ํ๋ก๋์ ๋ ERROR ๋ ๋ฒจ ๋ก ์ค์ ํ์ฌ ์๋ฌ ๋ก๊ทธ๋ง ๊ธฐ๋กํ๊ฒ ์ค์ ํ์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฑ๋ฅ ์ต์ ํ๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
3. JMX๋ Prometheus๋ฅผ ํตํ ๋ชจ๋ํฐ๋ง ํตํฉ
Kafka๋ JMX(Java Management Extensions) ๋ฅผ ํตํด ๋ธ๋ก์ปค , ํ๋ก๋์ , ์ปจ์๋จธ ์ ์ํ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค. ๋ํ, Prometheus ์ ๊ฐ์ ๋๊ตฌ๋ฅผ ํตํด ๋ฉํธ๋ฆญ ์ ์์งํ๊ณ ์๊ฐํํ ์ ์์ต๋๋ค.
JMX ์ค์
Kafka ๋ธ๋ก์ปค์์ JMX ํฌํธ ๋ฅผ ์ด์ด ๋ชจ๋ํฐ๋ง ๋๊ตฌ ๊ฐ ์ ๊ทผํ ์ ์๊ฒ ํฉ๋๋ค.
# Kafka ์๋ฒ ์ค์
KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
export KAFKA_JMX_OPTS
Prometheus ์ค์
Prometheus JMX Exporter ๋ฅผ ์ฌ์ฉํ์ฌ Kafka ๋ฉํธ๋ฆญ์ Prometheus ๋ก ์ ์กํ ์ ์์ต๋๋ค. Kafka ๋ธ๋ก์ปค์ JMX Exporter ๋ฅผ ์ค์ ํ๋ฉด, ๋ธ๋ก์ปค์ ์ฑ๋ฅ ๋ฐ์ดํฐ๋ฅผ Prometheus์์ ์์งํ ์ ์์ต๋๋ค.
scrape_configs:
- job_name: 'kafka'
static_configs:
- targets: ['localhost:9090'] # JMX Exporter ํฌํธ
์ค๋ช :
- JMX ํฌํธ ๋ฅผ ์ด์ด Kafka ๋ธ๋ก์ปค์์ JVM ๊ด๋ จ ๋ฉํธ๋ฆญ์ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค.
- Prometheus JMX Exporter ๋ฅผ ํตํด Kafka ๋ธ๋ก์ปค, ํ๋ก๋์, ์ปจ์๋จธ์ ์ฑ๋ฅ ๋ฉํธ๋ฆญ ์ Prometheus์ ํตํฉํ์ฌ ์ค์๊ฐ ๋ชจ๋ํฐ๋ง์ ํ ์ ์์ต๋๋ค.
4. Grafana๋ฅผ ํ์ฉํ ๋ฉํธ๋ฆญ ์๊ฐํ
Kafka์ Prometheus ๋ฅผ ์ฐ๋ํ ํ, Grafana ๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฐํ ๋์๋ณด๋ ๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. Grafana๋ ๋ค์ํ ๋ฉํธ๋ฆญ ์ ์๊ฐํํ์ฌ ๋ธ๋ก์ปค์ ์ฑ๋ฅ, ๋ฉ์์ง ์ฒ๋ฆฌ๋, ์ง์ฐ ์๊ฐ์ ์ง๊ด์ ์ผ๋ก ๋ณด์ฌ์ค๋๋ค.
Grafana ์ค์
- Grafana ๋์๋ณด๋ ๊ตฌ์ฑ
- Grafana์์ Prometheus ๋ฅผ ๋ฐ์ดํฐ ์์ค๋ก ์ถ๊ฐํฉ๋๋ค.
- Kafka ๊ด๋ จ ๋ฉํธ๋ฆญ ์ ํฌํจํ ๋์๋ณด๋๋ฅผ ์ ํํ๊ฑฐ๋ ์ง์ ์์ฑํฉ๋๋ค. - Kafka ๋ฉํธ๋ฆญ ์๊ฐํ
- Kafka ๋ธ๋ก์ปค์ ์ฒ๋ฆฌ๋ , ์ง์ฐ ์๊ฐ , ์คํ์ ์ ๋ณด ๋ฑ์ ์๊ฐํํ์ฌ ์ด์ ์ํ ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค.
์์ ๋์๋ณด๋
๋ฉํธ๋ฆญ | ์ค๋ช |
---|---|
Messages/sec | ์ด๋น ์ฒ๋ฆฌ๋๋ ๋ฉ์์ง ์ |
Broker Latency | ๋ธ๋ก์ปค์ ๋ฉ์์ง ์ฒ๋ฆฌ ์ง์ฐ ์๊ฐ |
Producer Errors | ํ๋ก๋์์์ ๋ฐ์ํ ์๋ฌ ์ |
Consumer Lag | ์ปจ์๋จธ ๊ทธ๋ฃน์ ์คํ์ ์ง์ฐ |
Kafka ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น ํธ๋ ๋ ๋ฐ ํต๊ณ
์ต๊ทผ ์กฐ์ฌ์ ๋ฐ๋ฅด๋ฉด, Kafka ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น ์์คํ ์ ๋์ ํ ๊ธฐ์ ๋ค์ ์์คํ ์ฅ์ ๋ณต๊ตฌ ์๊ฐ ์ ํ๊ท 30% ์ด์ ๋จ์ถ ํ๋ค๊ณ ๋ณด๊ณ ํฉ๋๋ค. ํนํ Prometheus ์ Grafana ๋ฅผ ํตํ ์ค์๊ฐ ๋์๋ณด๋ ์ค์ ์ ์ด์ ํจ์จ์ฑ ์ ํฌ๊ฒ ํฅ์์ํค๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ (FAQ)
Q1. Kafka ๋ก๊น
์ ์ต์ ํํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์?
A1. ๋ก๊น
๋ ๋ฒจ ์ ์ ์ ํ ์ค์ ํ์ฌ ํ์ํ ์ ๋ณด๋ง ๋ก๊น
ํ๊ณ , ์ฑ๋ฅ์ ์ํฅ์ ์ฃผ์ง ์๋๋ก DEBUG ๋ ๋ฒจ์ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ์ธ์. ์๋ฅผ ๋ค์ด, Kafka ํ๋ก๋์ ๋ ERROR ๋ ๋ฒจ๋ก ์ค์ ํ๊ณ , ์ปจ์๋จธ ๋ INFO ๋๋ DEBUG ๋ก ์ค์ ํ ์ ์์ต๋๋ค.
Q2. Prometheus๋ฅผ ์ฌ์ฉํ Kafka ๋ชจ๋ํฐ๋ง์ด ํ์ํ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
A2. Prometheus ๋ Kafka ๋ธ๋ก์ปค, ํ๋ก๋์, ์ปจ์๋จธ์ ์ค์๊ฐ ์ฑ๋ฅ ๋ฉํธ๋ฆญ ์ ์์งํ๊ณ , ๋ฌธ์ ๋ฐ์ ์ ๊ฒฝ๊ณ ๋ฅผ ์ค์ ํ์ฌ ๋น ๋ฅด๊ฒ ๋์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด Kafka ์์คํ
์ ์ด์ ์ํ ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
Q3. Grafana๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ค ์ด์ ์ด ์๋์?
A3. Grafana ๋ ์ค์๊ฐ์ผ๋ก Kafka ๋ฉํธ๋ฆญ ์ ์๊ฐํํ์ฌ ๋ธ๋ก์ปค์ ์ํ, ๋ฉ์์ง ์ฒ๋ฆฌ๋, ์ง์ฐ ์๊ฐ ๋ฑ์ ํ๋์ ํ์
ํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ฅผ ํตํด ์ด์ ํจ์จ์ฑ ์ ๊ทน๋ํํ ์ ์์ต๋๋ค.
Q4. JMX๋ฅผ ํตํด ์ด๋ค Kafka ๋ฉํธ๋ฆญ์ ๋ชจ๋ํฐ๋งํ ์ ์๋์?
A4. JMX๋ฅผ ํตํด JVM ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ , ์ค๋ ๋ ์ , GC ํ๋ , Kafka ๋ธ๋ก์ปค์ ๋ฉ์์ง ์ฒ๋ฆฌ๋ , ์คํ์
์ง์ฐ ๋ฑ ๋ค์ํ Kafka ์ฑ๋ฅ ๋ฉํธ๋ฆญ์ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ธ๋ก์ปค์ ์์ ์ฌ์ฉ ์ํ์ ์ฑ๋ฅ ์ด์๋ฅผ ์ค์๊ฐ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
Q5. Kafka ๋ก๊น
ํ๋ ์์ํฌ๋ก Logback๊ณผ Log4j ์ค ์ด๋ ๊ฒ์ด ๋ ์ ํฉํ๊ฐ์?
A5. Logback ๊ณผ Log4j ๋ ๋ชจ๋ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ๋ก๊น
ํ๋ ์์ํฌ์ด์ง๋ง, Spring Boot ํ๋ก์ ํธ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก Logback ์ด ์ฌ์ฉ๋ฉ๋๋ค. Logback ์ ์ค์ ์ด ์ง๊ด์ ์ด๊ณ ๋น ๋ฅธ ์ฑ๋ฅ์ ์ ๊ณตํ๋ฏ๋ก, Spring ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์์๋ Logback์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ ๋ฆฌํ ์ ์์ต๋๋ค. ํ์ง๋ง Log4j ๋ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ง์ด ์ฌ์ฉ๋๋ฉฐ, ์ฑ๋ฅ ์ธก๋ฉด์์ ์ฐจ์ด๊ฐ ํฌ์ง ์์ต๋๋ค.
๋๊ธ