03.Installation,ClusterConfiguration

Apache Kafka Cluster ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ

  1. Confluent Platform(CP) ์‚ฌ์šฉ

  2. Ubuntu 18.04 ํ™˜๊ฒฝ์—์„œ ์ง„ํ–‰

  3. Production ํ™˜๊ฒฝ์„ ๊ฐ€์ •(Zookeeper 3 ๋Œ€, Broker 3 ๋Œ€, Control Center1) 1 ๋Œ€ ๊ตฌ์„ฑ)

    1. Kafka Broker 1 ๊ฐœ๋งŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ(๊ฐœ๋ฐœ ํ™˜๊ฒฝ), ๋ฌด๋ฃŒ๋กœ ๋ชจ๋“  ๊ธฐ๋Šฅ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    2. Broker 2๊ฐœ ์ด์ƒ์˜ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๊ตฌ์„ฑํ•  ๊ฒฝ์šฐ, 30์ผ ๊ธฐํ•œ์˜ ๋ผ์ด์„ ์Šค๊ฐ€ ์ž๋™ ์ƒ์„ฑ

    3. ๊ณ„์† ์‚ฌ์šฉ์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ ๋ผ์ด์„ ์Šค๋ฅผ ๊ตฌ๋งคํ•ด์•ผ ํ•จ

  4. Confluent Platform์˜ ์‹œ์Šคํ…œ ์š”๊ตฌ์‚ฌํ•ญ์„ ํ™•์ธํ•  ๊ฒƒhttps://docs.confluent.io/platform/current/installation/system-requirements.html

  5. OpenJDK ํ˜น์€ OracleJDK 1.8 / 1.11 ์‚ฌ์šฉ ๊ฐ€๋Šฅ(๋ณธ ๊ฐ•์˜์—์„œ๋Š” 1.8 ๋ฒ„์ „ ์‚ฌ์šฉ)

  6. ๋จธ์‹  ๊ฐ„ NTP ์‹œ๊ฐ„ ๋™๊ธฐํ™”

[Download URL]

https://www.confluent.io/get-started

Kafka ์„ค์น˜๋ฅผ ์œ„ํ•œ OS ๊ด€๋ จ ๊ตฌ์„ฑ

  1. Linux ๊ณ„์ • ์ƒ์„ฑ

    Confluent Platform(Apache Kafka)์€ Linux ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ : ๊ด€๋ฆฌ ํŽธ์˜์„ฑ์„ ์œ„ํ•ด ๋ณ„๋„์˜ ๊ณ„์ • ์ƒ์„ฑ์„ ๊ถŒ์žฅ

    ๊ทธ๋ฃน ์ƒ์„ฑ : ์˜ˆ) groupadd confluent
    ์‚ฌ์šฉ์ž ์ƒ์„ฑ : ์˜ˆ) useradd -g confluent confluent
    
    RHEL, CentOS, Debian, Ubuntu ์ง€์›
    XFS File System ์‚ฌ์šฉ
  2. JDK ๊ตฌ์„ฑ

    OpenJDK ํ˜น์€ Oracle JDK 1.8.0_202(64bit)๋ฅผ ๋‹ค์šด๋กœ๋“œ๋ฐ›์€ ํ›„, ๋กœ๊ทธ์ธํ•œ ๊ณ„์ •์˜ Home ๋””๋ ‰ํ† ๋ฆฌ์— ์••์ถ•ํŒŒ์ผ์„ ์˜ฎ๊ธฐ๊ณ  ํ•ด๋‹นํŒŒ์ผ์˜ ์••์ถ•์„ ํ•ด์ œ Linux ๊ณ„์ •์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜์— Java Home ์ง€์ •ํ•˜๊ณ  bin ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ PATH์— ์ถ”๊ฐ€

    $ vi ~/.bashrc
    export JAVA_HOME=/home/confluent/jdk1.8.0_202 #์••์ถ•ํŒŒ์ผ์„ ํ‘ผ ๊ฒฝ๋กœ
    export PATH=${JAVA_HOME}/bin:${PATH}
    $ vi ~/.bash_profile
    source ~/.bashrc
    $ source ~/.bashrc #ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ ์šฉ

Confluent Platform ์„ค์น˜

  1. Confluent Platform ์••์ถ• ํŒŒ์ผ์˜ ์••์ถ• ํ•ด์ œ

Confluent Platform ZIP ํŒŒ์ผ์„ ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณต์‚ฌํ•œ ๋‹ค์Œ, ์••์ถ•์„ ํ•ด์ œ

๊ณ„์ •์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— Confluent Platform Home์„ ์ง€์ •ํ•˜๊ณ  bin ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ PATH์— ์ถ”๊ฐ€

$ cp confluent-6.2.1.zip /home/confluent/
$ cd /home/confluent
$ unzip confluent-6.2.1.zip
$ vi ~/.bashrc
export CONFLUENT_HOME=/home/confluent/confluent-6.2.1 #confluent platformํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ
export PATH=${CONFLUENT_HOME}/bin:${PATH}
$ source ~/.bashrc # ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ ์šฉ

Zookeeper Node ๊ตฌ์„ฑ

${CONFLUENT_HOME}/etc/kafka/zookeeper.properties ํŒŒ์ผ ๋‚ด์˜ ์ค‘์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ

  • Zookeeper Node๋“ค์€ ๊ตฌ์„ฑ ํŒŒ์ผ์ด ๋™์ผํ•ด์•ผ ํ•จ

tickTime=2000
dataDir=/data/zookeeper/
clientPort=2181
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purgeInterval=24
# server.<myid>=<hostname>:<leaderport>:<electionport>
server.1=zookeeper1:2888:3888
server.2=zookeeper2:2888:3888
server.3=zookeeper3:2888:3888
  • clientPort = broker๊ฐ€ zookeeper์— ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•œ port

  • dataDir ํŒŒ๋ผ๋ฏธํ„ฐ์— ์„ค์ •ํ•œ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, Linux ๊ณ„์ •(confluent)์„ ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•œ ์†Œ์œ ์ž๋กœ ์„ค์ •

  • server.<myid>=<hostname>:<leaderport>:<electionport>

    • myid : ์„œ๋ฒ„์‹๋ณ„๋ฒˆํ˜ธ โ†’ dataDir์— โ€œmyidโ€๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  myid ๊ฐ’(์˜ˆ, 1 ๋˜๋Š” 2 ๋˜๋Š” 3)์„ ์ž…๋ ฅ ํ›„ ์ €์žฅ

    • hostname : DNS ๋˜๋Š” /etc/hosts ์— ๋“ฑ๋ก๋œ zookeeper node์˜ hostname

    • leaderport : Follower๊ฐ€ Leader์— ์—ฐ๊ฒฐ๋˜๋Š”๋ฐ ์‚ฌ์šฉ (๋ชจ๋“  zookeeper node ๊ฐ„ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•จ)

    • electionport : Zookeeper Leader ์„ ์ถœ์— ์‚ฌ์šฉ (๋ชจ๋“  zookeeper node ๊ฐ„์— ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•จ)

Broker Node ๊ตฌ์„ฑ

${CONFLUENT_HOME}/etc/kafka/server.properties ํŒŒ์ผ ๋‚ด์˜ ์ค‘์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ

zookeeper.connect=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
broker.id=1
log.dirs=/data/broker
listeners=PLAINTEXT://broker1:9092
default.replicaiton.factor=3
min.insync.replicas=2
unclean.leader.election.enable=false
metric.reporters=io.confluent.metrics.reporter.ConfluentMetricsReporter
confluent.metrics.reporter.bootstrap.servers=broker1:9092,broker2:9092,broker3:9092
  • zookeeper.connect : Broker์—์„œ Zookeeper ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ zookeeper1:2181์—์„œ zookeeper1์€ DNS ๋˜๋Š” /etc/hosts ์— ๋“ฑ๋ก๋œ zookeeper node์˜ hostname

  • broker.id : ์ •์ˆ˜๋กœ ํ‘œํ˜„๋˜๋Š” ์ˆซ์ž : ๊ฐ™์€ Kafka cluster ๋‚ด์˜ Broker๋“ค์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ณ ์œ ํ•œ broker.id๋ฅผ ๊ฐ€์ ธ์•ผ ํ•จ

  • log.dirs ํŒŒ๋ผ๋ฏธํ„ฐ์— ์„ค์ •ํ•œ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, Linux ๊ณ„์ •(confluent)์„ ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•œ ์†Œ์œ ์ž๋กœ ์„ค์ •

  • listeners : Broker๊ฐ€ ์ˆ˜์‹ ํ•  URI์˜ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ชฉ๋ก broker1์€ DNS ๋˜๋Š” /etc/hosts ์— ๋“ฑ๋ก๋œ broker1 node์˜ hostname kafka client๊ฐ€ Broker node์™€ ์—ฐ๊ฒฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ •๋ณด

Control Center Node ๊ตฌ์„ฑ

${CONFLUENT_HOME}/etc/confluent-control-center/control-center-production.properties ํŒŒ์ผ ๋‚ด์˜ ์ค‘์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ

bootstrap.servers=broker1:9092,broker2:9092,broker3:9092
zookeeper.connect=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
confluent.controlcenter.data.dir=/data/controlcenter
confluent.controlcenter.schema.registry.url=http://schema1:8081
confluent.controlcenter.usage.data.collection.enable=true
# confluent.controlcenter.ksql.ksqldb.url=http://ksqldb1:8088,[<http://ksqldb2:8088>](<http://ksqldb2:8088/>)
# confluent.controlcenter.ksql.ksqldb.advertised.url=http://ksqldb1:8088,[<http://ksqldb2:8088>](<http://ksqldb2:8088/>)
  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ: 1๋Œ€๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ

  • ์šด์˜ ํ™˜๊ฒฝ: 2๋Œ€ ์ด์ƒ Machine์ƒ์— ์„ค์น˜,๊ตฌ์„ฑ ๊ถŒ์žฅ(HA ๋ชฉ์ )

  • Control Center๋Š” Zookeeper ๋ฐ Broker์™€ ๋ณ„๊ฐœ์˜ ๋จธ์‹ ์— ์„ค์น˜, ๊ตฌ์„ฑํ•ด์•ผ ํ•จ

Confluent Platform ์‹คํ–‰

  1. Zookeeper ์‹คํ–‰ (3 ๋Œ€์˜ Zookeeper Node์—์„œ ์‹คํ–‰)

$ ${CONFLUENT_HOME}/bin/zookeeper-server-start\
${CONFLUENT_HOME}/etc/kafka/zookeeper.properties

2. Kafka Broker ์‹คํ–‰ (3 ๋Œ€์˜ Broker Node์—์„œ ์‹คํ–‰)

$ ${CONFLUENT_HOME}/bin/kafka-server-start\
${CONFLUENT_HOME}/etc/kafka/server.properties

3. Control Center ์‹คํ–‰ (1 ๋Œ€์˜ Control Center Node์—์„œ ์‹คํ–‰)

$ ${CONFLUENT_HOME}/bin/control-center-start\
${CONFLUENT_HOME}/etc/confluent-control-center/control-center.properties

nohup ์Šคํฌ๋ฆฝํŠธ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰

nohup Scripts

no hangups ๋ผ๋Š” ์˜๋ฏธ๋กœ, Linux/UNIX ์—์„œ Shell Script ๋ฅผ ๋ฐ๋ชฌ ํ˜•ํƒœ๋กœ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ช…๋ น์–ด.

๋ณ„๋„์˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑ ํ›„ nohup ๋ช…๋ น์–ด script๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ

ex)

  • start_[์‹คํ–‰ํ•  component ๋ช…].sh

  • stop_[์‹คํ–‰ํ•  component ๋ช…].sh

  • log_[์‹คํ–‰ํ•  component ๋ช…].sh

๊ฐ script๋Š” ๊ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฐ ๋จธ์‹ ์—์„œ๋งŒ ์ž‘์„ฑ(์˜ˆ, Broker ๋จธ์‹ ์—๋Š” Broker์šฉ ์Šคํฌ๋ฆฝํŠธ๋งŒ ์ž‘์„ฑ)

  • confluent ๊ณ„์ •์˜ Home ๋””๋ ‰ํ† ๋ฆฌ์—์„œ bin ํด๋” ์ƒ์„ฑ ํ›„ bin ํด๋”๋กœ ์ด๋™, ์ž‘์„ฑ ํ›„ ์‹คํ–‰๊ถŒํ•œ ๋ถ€์—ฌ

$ mkdir ~/bin
$ cd ~/bin
  • ์‹คํ–‰ ๊ถŒํ•œ ๋ถ€์—ฌ (start ์Šคํฌ๋ฆฝํŠธ์˜ ์˜ˆ)

$ chmod u+x start_[์‹คํ–‰ํ•  component ๋ช…].sh

Zookeeper์šฉ Start nohup ์Šคํฌ๋ฆฝํŠธ

Zookeeper์šฉ Start nohup ์Šคํฌ๋ฆฝํŠธ

#!/usr/bin/sh

# process running
PID=`ps -efx | grep java | grep ZOOKEEPER1 | awk '{print $1}'`
if [ "$PID" != "" ]; then
echo ZOOKEEPER1 ${PID} is running !!!
exit
fi

mkdir -p /logs/zookeeper1
mv /logs/zookeeper1/zookeeper1.log /logs/zookeeper1/zookeeper1.log_`date +'%Y%m%d_%H%M%S'`

mkdir -p /logs/zookeeper1/gc

export KAFKA_GC_LOG_OPTS="-DZOOKEEPER1 -verbose:gc \\
-Xloggc:/logs/zookeeper1/gc/verbosegc_zookeeper1.log_`date +'%Y%m%d_%H%M%Sโ€™` \\
-XX:+PrintTenuringDistribution -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps \\
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=100 -XX:GCLogFileSize=50M"

export KAFKA_HEAP_OPTS="-Xms2g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=20 \\
-XX:InitiatingHeapOccupancyPercent=35 -XX:MinMetaspaceFreeRatio=50"

nohup ${CONFLUENT_HOME}/bin/zookeeper-server-start \\
${CONFLUENT_HOME}/etc/kafka/zookeeper.properties > /logs/zookeeper1/zookeeper1.log 2>&1 &

Zookeeper์šฉ Stop nohup ์Šคํฌ๋ฆฝํŠธ

$ vi stop_zookeeper1.sh

#!/usr/bin/sh

# process running
PID=`ps -efx | grep java | grep DZOOKEEPER1 | grep -v grep | awk '{print $1}'`
if [ "$PID" == "โ€ ]; then
echo ZOOKEEPER1 is NOT running !!!
exit
fi

echo Process ${PID} will be stopped !!!

${CONFLUENT_HOME}/bin/zookeeper-server-stop

Broker์šฉ Start nohup ์Šคํฌ๋ฆฝํŠธ

$ vi start_broker1.sh

#!/usr/bin/sh

# process running
PID=`ps -efx | grep java | grep BROKER1 | awk '{print $1}'`
if [ "$PID" != "" ]; then
echo BROKER1 ${PID} is running !!!
exit
fi

mkdir -p /logs/broker1
mv /logs/broker1/broker1.log /logs/broker1/broker1.log_`date +'%Y%m%d_%H%M%S'`

mkdir -p /logs/broker1/gc

export KAFKA_GC_LOG_OPTS="-DBROKER1 -verbose:gc \\
-Xloggc:/logs/broker1/gc/verbosegc_broker1.log_`date +'%Y%m%d_%H%M%Sโ€™` \\
-XX:+PrintTenuringDistribution -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps \\
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=100 -XX:GCLogFileSize=50M"

export KAFKA_HEAP_OPTS="-Xms6g -Xmx6g -XX:MetaspaceSize=96m -XX:+UseG1GC -XX:MaxGCPauseMillis=20 \\
-XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50 \\
-XX:MaxMetaspaceFreeRatio=80"

nohup ${CONFLUENT_HOME}/bin/kafka-server-start ${CONFLUENT_HOME}/etc/kafka/server.properties >
/logs/broker1/broker1.log 2>&1 &

Broker์šฉ Stop nohup ์Šคํฌ๋ฆฝํŠธ

$ vi stop_broker1.sh

#!/usr/bin/sh

# process running
PID=`ps -efx | grep java | grep BROKER1 |awk '{print $1}'`
if [ "$PID" == "" ]; then
echo BROKER1 is NOT running !!!
exit
fi

echo Process ${PID} will be stopped !!!

${CONFLUENT_HOME}/bin/kafka-server-stop

Control Center์šฉ Start nohup ์Šคํฌ๋ฆฝํŠธ

$ vi start_c3.sh

#!/usr/bin/sh

# process running
PID=`ps -efx | grep java | grep CONTROL_CENTER1 | awk '{print $1}'`
if [ "$PID" != "" ]; then
echo CONTROL_CENTER1 is running !!!
exit
fi

mkdir -p /logs/controlcenter1
mv /logs/controlcenter1/controlcenter1.log /logs/controlcenter1/controlcenter1.log_`date +'%Y%m%d_%H%M%S'`

mkdir -p /logs/controlcetner1/gc

export CONTROL_CENTER_HEAP_OPTS="-Xms8g -Xmx8g -DCONTROL_CENTER1 \\
-Xloggc:/logs/controlcenter1/gc/verbosegc_controlcenter1.log_`date +'%Y%m%d_%H%M%Sโ€™` \\
-XX:-PrintGCDetails -XX:-PrintGCTimeStamps -XX:-PrintTenuringDistribution -XX:-UseGCLogFileRotation \\
-XX:NumberOfGCLogFiles=100 -XX:GCLogFileSize=10M"

export CONTROL_CENTER_OPTS="-Djava.io.tmpdir=/logs/controlcenter1"

nohup ${CONFLUENT_HOME}/bin/control-center-start ${CONFLUENT_HOME}/etc/confluent-controlcenter/control-center-production.properties > /logs/controlcenter1/controlcenter1.log 2>&1 &

Control Center์šฉ Stop nohup ์Šคํฌ๋ฆฝํŠธ

$ vi stop_c3.sh

Last updated