환경 설정 및 사전 준비
3대의 서버로 구성된 Kafka 클러스터를 구축하기 위해 먼저 시스템 환경을 정리합니다.
- 운영체제: CentOS Linux release 7.5.1804 (Core)
- 메모리: 각 노드별 8GB 이상 권장 (가상머신 사용 시 2GB도 가능)
- 노드 수: 3개 (CDHNode1, CDHNode2, CDHNode3)
필수 소프트웨어 버전
| 소프트웨어 | 버전 | 다운로드 링크 |
|---|---|---|
| Java | jdk-8u172-linux-x64 | 다운로드 |
| ZooKeeper | zookeeper-3.4.5-cdh5.14.2 | 다운로드 |
| Kafka | kafka_2.12-1.1.0 | 다운로드 |
| Kafka Manager | kafka-manager-1.3.3.4 (사전 컴파일 버전) | 다운로드 |
노드 역할 분배
| 호스트명 | IP 주소 | ZooKeeper | Kafka |
|---|---|---|---|
| CDHNode1 | 192.168.223.201 | Yes | Yes |
| CDHNode2 | 192.168.223.202 | Yes | Yes |
| CDHNode3 | 192.168.223.203 | Yes | Yes |
시스템 초기화 작업
모든 노드에서 다음 작업을 수행합니다.
SELinux비활성화:firewalld및iptables중단:- 시간 동기화 설정:
- 언어 및 시간대 설정:
kafka사용자 생성 및 권한 설정:- SSH 무결성 설정 (CDHNode1에서 키 생성 후 복사):
sed -i 's/^SELINUX=.*$/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl disable firewalld; systemctl stop firewalld
systemctl disable iptables; systemctl stop iptables
echo "*/5 * * * * /usr/sbin/ntpdate asia.pool.ntp.org | logger -t NTP" >> /var/spool/cron/root
echo 'export TZ=Asia/Shanghai' >> /etc/profile
echo 'export LANG=en_US.UTF-8' >> /etc/profile
. /etc/profile
useradd -m kafka
echo '123456' | passwd --stdin kafka
su - kafka
echo 'export PS1="\u@\h:\$PWD>"' >> ~/.bash_profile
echo "alias mv='mv -i'; alias rm='rm -i'" >> ~/.bash_profile
. ~/.bash_profile
ssh-keygen -t rsa
cd .ssh
cat id_rsa.pub > authorized_keys
chmod 600 authorized_keys
zip -r ssh.zip .ssh
scp ssh.zip CDHNode2:/home/kafka
scp ssh.zip CDHNode3:/home/kafka
# 이후 압축 해제 및 권한 조정
JDK 1.8 설치
모든 노드에 동일하게 적용됩니다.
tar zxvf jdk-8u172-linux-x64.tar.gz
mkdir -p /home/kafka/app
mv jdk-8u172-linux-x64 /home/kafka/app/jdk
rm -f jdk-8u172-linux-x64.tar.gz
# 환경변수 설정
echo '#java
export JAVA_HOME=/home/kafka/app/jdk
export CLASSPATH=.:$JAVA_HOME/lib:$CLASSPATH
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin' >> ~/.bash_profile
. ~/.bash_profile
java -version
ZooKeeper 설치 및 구성
CDHNode1에서 시작하여 다른 노드로 배포합니다.
tar zxvf zookeeper-3.4.5-cdh5.14.2.tar.gz
mv zookeeper-3.4.5-cdh5.14.2 /home/kafka/app/zookeeper
rm -f zookeeper-3.4.5-cdh5.14.2.tar.gz
# 환경 변수
echo '#zk
export ZOOKEEPER_HOME=/home/kafka/app/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin' >> ~/.bash_profile
. ~/.bash_profile
# 설정 파일 작성
vim /home/kafka/app/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/kafka/data/zookeeper/zkdata
dataLogDir=/home/kafka/data/zookeeper/zkdatalog
clientPort=2181
server.1=CDHNode1:2888:3888
server.2=CDHNode2:2888:3888
server.3=CDHNode3:2888:3888
mkdir -p /home/kafka/data/zookeeper/zkdata
mkdir -p /home/kafka/data/zookeeper/zkdatalog
mkdir -p /home/kafka/app/zookeeper/logs
# myid 파일 생성
echo 1 > /home/kafka/data/zookeeper/zkdata/myid
# 로그 설정
vim /home/kafka/app/zookeeper/libexec/zkEnv.sh
ZOO_LOG_DIR="$ZOOKEEPER_HOME/logs"
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
vim /home/kafka/app/zookeeper/conf/log4j.properties
zookeeper.root.logger=INFO, ROLLINGFILE
zookeeper.log.dir=/home/kafka/app/zookeeper/logs
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
CDHNode2, CDHNode3로 배포:
scp -pr /home/kafka/app/zookeeper CDHNode2:/home/kafka/app
scp -pr /home/kafka/app/zookeeper CDHNode3:/home/kafka/app
ssh CDHNode2 "echo 2 > /home/kafka/data/zookeeper/zkdata/myid"
ssh CDHNode3 "echo 3 > /home/kafka/data/zookeeper/zkdata/myid"
시작 및 상태 확인:
/home/kafka/app/zookeeper/bin/zkServer.sh start
/home/kafka/app/zookeeper/bin/zkServer.sh status
jps
Kafka 설치 및 설정
CDHNode1에서 시작합니다.
tar zxvf kafka_2.12-1.1.0.tgz
mv kafka_2.12-1.1.0 /home/kafka/app/kafka
rm -f kafka_2.12-1.1.0.tgz
# 환경 변수
echo '#kafka
export KAFKA_HOME=/home/kafka/app/kafka
export PATH=$PATH:$KAFKA_HOME/bin' >> ~/.bash_profile
. ~/.bash_profile
# server.properties 설정
vim /home/kafka/app/kafka/config/server.properties
broker.id=0
port=9092
log.dirs=/home/kafka/data/kafka/kafka-logs
num.partitions=3
default.replication.factor=3
zookeeper.connect=CDHNode1:2181,CDHNode2:2181,CDHNode3:2181
log.retention.hours=168
log.retention.bytes=1073741824
message.max.byte=5242880
replica.fetch.max.bytes=5242880
export KAFKA_HEAP_OPTS="-Xmx3G -Xms3G"
mkdir -p /home/kafka/data/kafka/kafka-logs
# 다른 노드로 복사
scp -pr /home/kafka/app/kafka CDHNode2:/home/kafka/app
scp -pr /home/kafka/app/kafka CDHNode3:/home/kafka/app
ssh CDHNode2 "mkdir -p /home/kafka/data/kafka/kafka-logs"
ssh CDHNode3 "mkdir -p /home/kafka/data/kafka/kafka-logs"
# broker.id 수정
# CDHNode2: broker.id=1
# CDHNode3: broker.id=2
클러스터 시작:
/home/kafka/app/kafka/bin/kafka-server-start.sh -daemon /home/kafka/app/kafka/config/server.properties
jps
Kafka 기본 명령어
테스트용 토픽 생성:
/home/kafka/app/kafka/bin/kafka-topics.sh --zookeeper CDHNode1:2181,CDHNode2:2181,CDHNode3:2181 --create --topic test --replication-factor 3 --partitions 3
토픽 목록 확인:
/home/kafka/app/kafka/bin/kafka-topics.sh --zookeeper CDHNode1:2181,CDHNode2:2181,CDHNode3:2181 --list
메시지 생산:
/home/kafka/app/kafka/bin/kafka-console-producer.sh --broker-list CDHNode1:9092,CDHNode2:9092,CDHNode3:9092 --topic test
메시지 소비 (그룹 기반):
/home/kafka/app/kafka/bin/kafka-console-consumer.sh --bootstrap-server CDHNode1:9092,CDHNode2:9092,CDHNode3:9092 --group test_group --topic test --reset-offsets earliest
Consumer 그룹 조회:
/home/kafka/app/kafka/bin/kafka-consumer-groups.sh --bootstrap-server CDHNode1:9092,CDHNode2:9092,CDHNode3:9092 --list
Leader 리밸런싱 실행:
/home/kafka/app/kafka/bin/kafka-preferred-replica-election.sh --zookeeper CDHNode1:2181,CDHNode2:2181,CDHNode3:2181
Kafka Manager 설치 및 활용
CDHNode1에서 설치:
unzip kafka-manager-1.3.3.4.zip
mv kafka-manager-1.3.3.4 /home/kafka/app/kafka-manager
mkdir -p /home/kafka/app/kafka-manager/logs
rm -f kafka-manager-1.3.3.4.zip
# 설정 파일 수정
vim /home/kafka/app/kafka-manager/conf/application.conf
kafka-manager.zkhosts="CDHNode1:2181,CDHNode2:2181,CDHNode3:2181"
basicAuthentication.enabled=true
basicAuthentication.username="admin"
basicAuthentication.password="password"
basicAuthentication.realm="Kafka-Manager"
서비스 시작:
nohup /home/kafka/app/kafka-manager/bin/kafka-manager -Dconfig.file=/home/kafka/app/kafka-manager/conf/application.conf -Dhttp.port=8080 > /home/kafka/app/kafka-manager/logs/server.log 2>&1 &
관리자 인증 정보는 설정 파일에서 변경 가능하며, JMX 모니터링 활성화 시 추가 설정 필요.