my_first_kafka의 보안 규칙에서
인바운드 규칙 편집에서 추가해준다.
kafka 의 9092port
zookeeper의 2181 port
인스턴스를 연결해서 apt-get을 update한다
ubuntu@ip-172-31-0-147:~$ sudo apt-get update
### root로 이동하고 jre를 설치한다.
ubuntu@ip-172-31-0-147:~$ sudo su
root@ip-172-31-0-147:/home/ubuntu# apt-get install default-jre
### java 버전을 확인한다.
root@ip-172-31-0-147:/home/ubuntu# java -version
openjdk version "11.0.25" 2024-10-15
OpenJDK Runtime Environment (build 11.0.25+9-post-Ubuntu-1ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.25+9-post-Ubuntu-1ubuntu122.04, mixed mode, sharing)
### ubuntu 계정으로 다시 돌아온다.
root@ip-172-31-0-147:/home/ubuntu# exit
ubuntu@ip-172-31-0-147:~$ pwd
/home/ubuntu
### kafka 디렉토리를 만들어준다.
ubuntu@ip-172-31-0-147:~$ mkdir kafka
### kafka를 다운로드한다.
ubuntu@ip-172-31-0-147:~$ curl "https://archive.apache.org/dist/kafka/2.7.2/kafka_2.12-2.7.2.tgz" -o /home/ubuntu/kafka/kafka.tgz
### kafka 디렉토리로 이동해서 kafka.tgz 파일을 압출해제한다.
-- strip은 하나 벗겨낸다.
ubuntu@ip-172-31-0-147:~$ cd kafka/
ubuntu@ip-172-31-0-147:~/kafka$ tar -xvzf kafka.tgz --strip 1
### /home/ubuntu/kafka 해당 경로가 kafka 설치한 곳
### bin 디렉토리로 들어가면 kafka와 zookeeper를 시작하는 sh 파일과 종료하는 sh 파일을 확인할 수 있음
ubuntu@ip-172-31-0-147:~/kafka$ cd bin
### ls -al 치면 나옴
-rwxr-xr-x 1 ubuntu ubuntu 1376 Oct 12 2021 kafka-server-start.sh
-rwxr-xr-x 1 ubuntu ubuntu 1361 Oct 12 2021 kafka-server-stop.sh
-rwxr-xr-x 1 ubuntu ubuntu 1393 Oct 12 2021 zookeeper-server-start.sh
-rwxr-xr-x 1 ubuntu ubuntu 1366 Oct 12 2021 zookeeper-server-stop.sh
kafka-server-start.sh 파일을 보면
server.properties 정보를 이용해서 돌리고
log4j 를 쓴다.
if [ $# -lt 1 ];
then
echo "USAGE: $0 [-daemon] server.properties [--override property=value]*"
exit 1
fi
base_dir=$(dirname $0)
if [ "x$KAFKA_LOG4J_OPTS" = "x" ]; then
export KAFKA_LOG4J_OPTS="-Dlog4j.configuration=file:$base_dir/../config/log4j.properties"
fi
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
fi
EXTRA_ARGS=${EXTRA_ARGS-'-name kafkaServer -loggc'}
COMMAND=$1
case $COMMAND in
-daemon)
EXTRA_ARGS="-daemon "$EXTRA_ARGS
shift
;;
*)
;;
esac
exec $base_dir/kafka-run-class.sh $EXTRA_ARGS kafka.Kafka "$@"
여기서
KAFKA_HEAP_OPTS는 kafka에 할당한 메모리가 1g인데
지금 vm이 1g이기 때문에 400mb로 다운시켜야한다.
export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
을
export KAFKA_HEAP_OPTS="-Xmx400m -Xms400m"
으로 변경한다.
사실 sh 파일을 변경하지않고
export로 입력하고 echo로 확인하면 된다.
ubuntu@ip-172-31-0-147:~/kafka/bin$ export KAFKA_HEAP_OPTS="-Xms400m -Xmx400m"
ubuntu@ip-172-31-0-147:~/kafka/bin$ echo $KAFKA_HEAP_OPTS
-Xms400m -Xmx400m
위 는 세션이 유지 되어 있어야지만 유지가 되지 때문에
세션이 꺼져도 유지가 가능하게 bashrc 파일에 등록을 해주자
ubuntu@ip-172-31-0-147:~/kafka/bin$ cd /home/ubuntu/
ubuntu@ip-172-31-0-147:~$ vi .bashrc
### bashrc 파일의 맨 밑에 다음 내용 추가
export KAFKA_HEAP_OPTS=" -Xms400m -Xmx400m"
export JAVA_HOME="/usr/lib/jvm/java-11 -openjdk -amd64"
export PATH=$PATH:$JAVA_HOME/bin
### kafka 구동과 실행에 사용되는 config파일을 확인한다.
ubuntu@ip-172-31-0-147:~$ cd kafka/config/
### kafka property를 수정한다.
$ vi /kafka/config/server.properties
advertised.listeners=PLAINTEXT://ec2-publicIP:9092
log.dirs=/home/ubuntu/kafka/logs
zookeeper.connect=172.31.0.147:2181, 172.31.4.6:2181, 172.31.13.150:2181
### (kafka1의 private ip, kafka2의 private ip, kafka3의 private ip)
### zookeeper 서비스 파일을 등록
$ sudo su
$ vi /etc/systemd/system/zookeeper.service
[Unit]
Requires=network.target remote-fs.target
After=network.target remote-fs.target
[Service]
Type=simple
User=ubuntu
ExecStart=/home/ubuntu/kafka/bin/zookeeper-server-start.sh /home/ubuntu/kafka/config/zookeeper.properties
ExecStop=/home/ubuntu/kafka/bin/zookeeper-server-stop.sh
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
### kafka 서비스 파일 등록
$ vi /etc/systemd/system/kafka.service
[Unit]
Requires=zookeeper.service
After=zookeeper.service
[Service]
Type=simple
User=ubuntu
ExecStart=/bin/sh -c '/home/ubuntu/kafka/bin/kafka-server-start.sh /home/ubuntu/kafka/config/server.properties > /home/ubuntu/kafka/kafka.log 2>&1'
ExecStop=/home/ubuntu/kafka/bin/kafka-server-stop.sh
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
zookeeper가 실행되어 있어야지 실행하겠다.
끝낼때도 zookeeper를 끝내겠다.
### 일단 root 계정에서 ubuntu 계정으로 나간다.
# exit
### kafka를 실행 시키고 상태를 본다
### zookeeper는 실행 시킬 필요가 없다.
ubuntu@ip-172-31-0-147:~/kafka/config$ sudo systemctl start kafka
ubuntu@ip-172-31-0-147:~/kafka/config$ sudo systemctl status kafka
● kafka.service
Loaded: loaded (/etc/systemd/system/kafka.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2024-11-25 08:40:15 UTC; 6s ago
Main PID: 4534 (sh)
Tasks: 69 (limit: 1130)
Memory: 283.6M
CPU: 4.480s
CGroup: /system.slice/kafka.service
├─4534 /bin/sh -c "/home/ubuntu/kafka/bin/kafka-server-start.sh /home/ubuntu/kafka/config/server.properties > /home/ubuntu/kafka/kafka.log 2>&1"
└─4535 java -Xmx400m -Xms400m -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+ExplicitGCInvokesConcurrent ->
Nov 25 08:40:15 ip-172-31-0-147 systemd[1]: Started kafka.service.
###
Service 실행
$ sudo systemctl start kafka
Service 상태 확인
$ sudo systemctl status kafka
### Service Enable
ubuntu@ip-172-31-0-147:~/kafka/config$ sudo systemctl enable zookeeper
Created symlink /etc/systemd/system/multi-user.target.wants/zookeeper.service → /etc/systemd/system/zookeeper.service.
ubuntu@ip-172-31-0-147:~/kafka/config$ sudo systemctl enable kafka
Created symlink /etc/systemd/system/multi-user.target.wants/kafka.service → /etc/systemd/system/kafka.service.
이미지 생성
기존 kafka 인스턴스에서 이미지를 생성한다.
인스턴스ID를 클릭하고
이미지를 생성한다.
생성한 이미지로 새로운 인스턴스를 만든다.
그리고 로컬 터미널로 접속하는데 에러가 발생했다.
taekgyu@taekgyuui-MacBookAir keypair % ssh -i "my_first_redis_keypair.pem" ubuntu@52.79.191.141
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'my_first_redis_keypair.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "my_first_redis_keypair.pem": bad permissions
ubuntu@52.79.191.141: Permission denied (publickey).
그래서 gpt 검색해보니까
이 에러는 SSH 개인 키 파일(my_first_redis_keypair.pem)의 파일 권한 설정이 잘못되어 발생하는 문제입니다.
SSH는 개인 키 파일의 권한이 안전하게 설정되어 있지 않으면 이를 사용할 수 없도록 설계되어 있습니다. 파일 권한이 "너무 열려 있다"고 판단되면 SSH 클라이언트는 보안을 위해 개인 키 파일을 무시하며, 이로 인해 인증 실패가 발생합니다.
에러 메시지 분석
- Permissions 0644 for 'my_first_redis_keypair.pem' are too open.
- 개인 키 파일의 권한이 **0644**로 설정되어 있습니다.
- 이는 "소유자는 읽을 수 있고, 다른 사용자도 읽을 수 있다"는 의미로, SSH에서는 보안상 허용되지 않습니다.
- It is required that your private key files are NOT accessible by others.
- 개인 키 파일은 오직 소유자만 읽을 수 있어야 합니다. 다른 사용자(그룹 또는 기타 사용자)가 접근 가능한 경우, 보안 위협이 있을 수 있다고 판단합니다.
- Load key "my_first_redis_keypair.pem": bad permissions
- SSH가 키 파일을 로드하려 했으나, 파일 권한 문제가 있어 실패했습니다.
- Permission denied (publickey)
- 인증에 실패했음을 나타냅니다. SSH는 공개 키 기반 인증을 시도했으나 개인 키가 무시되어 서버에 접근할 수 없습니다.
아래 처럼 권한을 변경한다.
taekgyu@taekgyuui-MacBookAir keypair % chmod 400 my_first_redis_keypair.pem
그리고 다시 실행하면 접속 된다.
taekgyu@taekgyuui-MacBookAir keypair % ssh -i "my_first_redis_keypair.pem" ubuntu@52.79.191.141
먼저
서버1, 서버2, 서버3 에 접속을 하고
$ sudo service kafka status
으로 확인하낟.
그러면 서버1, 서버2, 서버3은
failed가 뜰 것이다.
각 서버마다 Zookeeper id 번호 만들어주기
1번 서버
echo 1 > ~/kafka/zookeeper/myid
2번 서버
echo 2 > ~/kafka/zookeeper/myid
3번 서버
echo 3 > ~/kafka/zookeeper/myid
zookeeper.properties 파일 수정
ubuntu@ip-172-31-0-147:~$ vi ~/kafka/config/zookeeper.properties
zookeeper 디렉토리가 있는 곳으로 dataDir 를 수정
3개의 서버를 전부 수정한다.
dataDir=/home/ubuntu/kafka/zookeeper
server 주소 및 수정
initLimit=5
syncLimit=2
server.1=public ip:2888:3888
server.2=public ip:2888:3888
server.3=public ip:2888:3888
kafka.properties 파일 수정
vi ~/kafka/config/server.properties
수정후
sudo service kafka start 로 실행 했는데 에러가 발생함
tail -f server.log
로그를 확인해보니 명확하지 않아서
tail -n -100 server.log
의 로그로 확인해봤더니 아래와 같은 에러가 발생함
kafka.common.InconsistentClusterIdException: The Cluster ID d7gZEQ95RXqV-7LKsyYjog doesn't match stored clusterId Some(j6ZqqmzOQKKsXpOfo-0NdA) in meta.properties. The broker is trying to join the wrong cluster. Configured zookeeper.connect may be wrong.
kafka/logs의
meta.properties 정보를 지우고 띄워야하는 경우가 있다.
meta.properties 정보를 삭제하고 다시 띄워라
그랬더니 3개의 서버 전부다
kafka와 zookeeper가 정상적으로 실행됐다.
sudo service kafka status
sudo service zookeeper start
sudo service kafka status
sudo service zookeeper status
'개발일지 > message queue,broker' 카테고리의 다른 글
Kafka와 SSE를 활용한 비동기 처리 (0) | 2025.01.07 |
---|---|
Kafka Stream 이란 (0) | 2024.12.05 |
Redis설치 및 Configuration(2) (0) | 2024.08.28 |
Redis설치 및 Configuration(1) (0) | 2024.08.21 |
Redis 구조 및 성능 비교 (0) | 2024.08.16 |