Apache Kafka Cluster ์ค์น ๋ฐ ๊ตฌ์ฑ
Confluent Platform(CP) ์ฌ์ฉ
Ubuntu 18.04 ํ๊ฒฝ์์ ์งํ
Production ํ๊ฒฝ์ ๊ฐ์ (Zookeeper 3 ๋, Broker 3 ๋, Control Center1) 1 ๋ ๊ตฌ์ฑ)
Kafka Broker 1 ๊ฐ๋ง ์ฌ์ฉํ ๊ฒฝ์ฐ(๊ฐ๋ฐ ํ๊ฒฝ), ๋ฌด๋ฃ๋ก ๋ชจ๋ ๊ธฐ๋ฅ ์ฌ์ฉ ๊ฐ๋ฅ
Broker 2๊ฐ ์ด์์ ํด๋ฌ์คํฐ๋ก ๊ตฌ์ฑํ ๊ฒฝ์ฐ, 30์ผ ๊ธฐํ์ ๋ผ์ด์ ์ค๊ฐ ์๋ ์์ฑ
๊ณ์ ์ฌ์ฉ์ด ํ์ํ ๊ฒฝ์ฐ ๋ผ์ด์ ์ค๋ฅผ ๊ตฌ๋งคํด์ผ ํจ
Confluent Platform์ ์์คํ
์๊ตฌ์ฌํญ์ ํ์ธํ ๊ฒ
OpenJDK ํน์ OracleJDK 1.8 / 1.11 ์ฌ์ฉ ๊ฐ๋ฅ(๋ณธ ๊ฐ์์์๋ 1.8 ๋ฒ์ ์ฌ์ฉ)
๋จธ์ ๊ฐ NTP ์๊ฐ ๋๊ธฐํ
[Download URL]
Kafka ์ค์น๋ฅผ ์ํ OS ๊ด๋ จ ๊ตฌ์ฑ
Linux ๊ณ์ ์์ฑ
Confluent Platform(Apache Kafka)์ Linux ํ๊ฒฝ์์ ๋์ : ๊ด๋ฆฌ ํธ์์ฑ์ ์ํด ๋ณ๋์ ๊ณ์ ์์ฑ์ ๊ถ์ฅ
Copy ๊ทธ๋ฃน ์์ฑ : ์) groupadd confluent
์ฌ์ฉ์ ์์ฑ : ์) useradd -g confluent confluent
RHEL, CentOS, Debian, Ubuntu ์ง์
XFS File System ์ฌ์ฉ
JDK ๊ตฌ์ฑ
OpenJDK ํน์ Oracle JDK 1.8.0_202(64bit)๋ฅผ ๋ค์ด๋ก๋๋ฐ์ ํ, ๋ก๊ทธ์ธํ ๊ณ์ ์ Home ๋๋ ํ ๋ฆฌ์ ์์ถํ์ผ์ ์ฎ๊ธฐ๊ณ ํด๋นํ์ผ์ ์์ถ์ ํด์ Linux ๊ณ์ ์ ํ๊ฒฝ๋ณ์์ Java Home ์ง์ ํ๊ณ bin ๋๋ ํ ๋ฆฌ๋ฅผ PATH์ ์ถ๊ฐ
Copy $ 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 ์์ถ ํ์ผ์ ์์ถ ํด์
Confluent Platform ZIP ํ์ผ์ ํ ๋๋ ํ ๋ฆฌ๋ก ๋ณต์ฌํ ๋ค์, ์์ถ์ ํด์
๊ณ์ ์ ํ๊ฒฝ ๋ณ์์ Confluent Platform Home์ ์ง์ ํ๊ณ bin ๋๋ ํ ๋ฆฌ๋ฅผ PATH์ ์ถ๊ฐ
Copy $ 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๋ค์ ๊ตฌ์ฑ ํ์ผ์ด ๋์ผํด์ผ ํจ
Copy 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 ํ์ผ ๋ด์ ์ค์ํ ํ๋ผ๋ฏธํฐ
Copy 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 ํ์ผ ๋ด์ ์ค์ํ ํ๋ผ๋ฏธํฐ
Copy 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์ ๋ณ๊ฐ์ ๋จธ์ ์ ์ค์น, ๊ตฌ์ฑํด์ผ ํจ
Zookeeper ์คํ (3 ๋์ Zookeeper Node์์ ์คํ)
Copy $ ${CONFLUENT_HOME}/bin/zookeeper-server-start\
${CONFLUENT_HOME}/etc/kafka/zookeeper.properties
2. Kafka Broker ์คํ (3 ๋์ Broker Node์์ ์คํ)
Copy $ ${CONFLUENT_HOME}/bin/kafka-server-start\
${CONFLUENT_HOME}/etc/kafka/server.properties
3. Control Center ์คํ (1 ๋์ Control Center Node์์ ์คํ)
Copy $ ${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 ํด๋๋ก ์ด๋, ์์ฑ ํ ์คํ๊ถํ ๋ถ์ฌ
Copy $ mkdir ~/bin
$ cd ~/bin
์คํ ๊ถํ ๋ถ์ฌ (start ์คํฌ๋ฆฝํธ์ ์)
Copy $ chmod u+x start_[์คํํ component ๋ช
].sh
Zookeeper์ฉ Start nohup ์คํฌ๋ฆฝํธ
Zookeeper์ฉ Start nohup ์คํฌ๋ฆฝํธ
Copy #!/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
Copy #!/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
Copy #!/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
Copy #!/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
Copy #!/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