๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Kafka ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ๋กœ๊น…: ์‹ค์‹œ๊ฐ„ ์šด์˜ ํšจ์œจ์„ฑ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ

okrestart 2024. 10. 23.

 

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 ์„ค์ •

  1. Grafana ๋Œ€์‹œ๋ณด๋“œ ๊ตฌ์„ฑ
    - Grafana์—์„œ Prometheus ๋ฅผ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    - Kafka ๊ด€๋ จ ๋ฉ”ํŠธ๋ฆญ ์„ ํฌํ•จํ•œ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. 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 ๋„ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉฐ, ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ์ฐจ์ด๊ฐ€ ํฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€