# Kafka, Zookeeper 설치 및 설정

### 1. 필수 요구사항 확인

#### 1.1. Java 설치 확인

Kafka는 Java 기반으로 동작합니다. Java 8 이상이 필요하며, 설치 여부를 확인하세요.

```bash
java -version
```

- 설치되지 않은 경우, OpenJDK 또는 Oracle JDK를 설치합니다.

```bash
brew update
brew install openjdk@11
```

#### 1.2. 디스크 공간 확인

Kafka는 로그 데이터를 저장하므로 충분한 디스크 공간이 필요합니다. 기본적으로 `/tmp/kafka-logs`에 저장됩니다.

---

### 2. ZooKeeper 설치 및 실행

#### 2.1. ZooKeeper 설치

ZooKeeper는 Kafka가 의존하는 분산 코디네이션 도구입니다. 아래 명령어로 설치합니다.

```bash
brew install zookeeper
```

#### 2.2. ZooKeeper 실행

ZooKeeper를 시작하려면 다음 명령어를 사용합니다.

```bash
brew services start zookeeper
```

#### 2.3. ZooKeeper 실행 상태 확인

ZooKeeper 실행 상태를 확인하려면 아래 명령어를 사용하세요.

```bash
brew services list
```

#### 2.4. ZooKeeper 설정 파일 주요 항목

ZooKeeper 설정 파일은 일반적으로 `/etc/zookeeper/conf/zoo.cfg`에 위치합니다. 아래는 주요 설정 항목입니다

```properties
dataDir=/var/lib/zookeeper
clientPort=2181
maxClientCnxns=60
initLimit=10
syncLimit=5
server.1=localhost:2888:3888
```

- **`dataDir`**:
    
    
    - ZooKeeper 데이터(스냅샷과 트랜잭션 로그)가 저장되는 디렉터리입니다
    - ZooKeeper가 실행 중인 서버의 디스크 경로를 지정합니다
    - 예: `/usr/local/var/run/zookeeper`
- **`clientPort`**:
    
    
    - 클라이언트가 ZooKeeper에 연결하기 위한 네트워크 포트 번호입니다
    - 기본값은 `2181`이며, 클라이언트가 ZooKeeper에 요청을 보내는 진입점 역할을 합니다
- **`maxClientCnxns`**:
    
    
    - ZooKeeper에 연결할 수 있는 클라이언트의 최대 연결 수를 제한합니다
    - 하나의 클라이언트(또는 IP 주소)에서 과도한 연결을 방지하는 역할을 합니다
- **`initLimit`**:
    
    
    - ZooKeeper 클러스터에서 팔로워(follower)가 리더(leader)와 초기 데이터 동기화를 완료하는 데 필요한 시간을 설정합니다
    - 이 시간이 초과되면 동기화가 실패로 간주됩니다
- **`syncLimit`**:
    
    
    - ZooKeeper 팔로워가 리더와 데이터 동기화를 유지할 수 있는 시간(틱 수)을 설정합니다
    - 리더와의 동기화가 이 시간보다 오래 중단되면 팔로워가 재시작됩니다
- **`server.x`**:
    
    
    - ZooKeeper 서버가 클러스터 모드로 동작할 때, 각 서버의 정보를 설정합니다
    - 형식: `server.<ID>=<호스트>:<follower-to-leader>:<leader-to-follower>`
        - `<ID>`: ZooKeeper 서버 ID
        - `<호스트>`: ZooKeeper 서버의 호스트 이름 또는 IP
        - `<follower-to-leader>`: 팔로워가 리더에게 요청을 보낼 때 사용하는 포트
        - `<leader-to-follower>`: 리더가 팔로워와 연결할 때 사용하는 포트

---

### 3. Kafka 다운로드 및 설치

#### 3.1. Kafka 다운로드

```bash
brew install kafka
```

#### 3.2. Kafka 실행

Kafka 브로커를 실행하려면 ZooKeeper가 실행 중인지 확인한 후 아래 명령어를 실행

```bash
brew services start kafka
```

####   


---

### 4. 환경변수 설정

#### 4.1. 환경변수 설정

`~/.bashrc` 또는 `~/.zshrc` 파일을 열고 아래 내용을 추가합니다.

```bash
export KAFKA_HOME=/usr/local/opt/kafka
export PATH=$PATH:$KAFKA_HOME/bin

```

#### 4.2. 환경변수 적용

```bash
source ~/.bashrc
```

---

### 5. Kafka 설정 파일 예제

#### 5.1. 설정 파일 위치

Kafka 설정 파일은 보통 `/usr/local/etc/kafka/server.properties`에 위치합니다.

#### 5.2. 주요 설정 항목

```properties
broker.id=0
log.dirs=/tmp/kafka-logs
zookeeper.connect=localhost:2181
num.partitions=1
default.replication.factor=1
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://localhost:9092
```

- **`broker.id`**: 브로커 ID를 설정합니다. 클러스터에서 고유해야 합니다
- **`log.dirs`**: Kafka 로그 데이터가 저장될 디렉터리 경로
- **`zookeeper.connect`**: ZooKeeper 주소 및 포트 정보
- **`num.partitions`**: 새로 생성되는 토픽의 기본 파티션 수
- **`default.replication.factor`**: 새로 생성되는 토픽의 기본 복제본 수
- **`advertised.listeners`:**  
    
    - **역할:** Kafka 브로커가 클라이언트에게 자신을 알릴 때 사용하는 주소를 설정합니다. 클라이언트는 이 주소를 통해 브로커와 통신
    - **값:** `PLAINTEXT://localhost:9092`
    - **`localhost`**: 브로커가 클라이언트에게 공개하는 IP 주소입니다. 보통 외부 네트워크에서 접근 가능하도록 구성합니다.
    - **`9092`**: 클라이언트와 통신할 포트 번호입니다.
    - **`PLAINTEXT`**: 클라이언트가 이 브로커와 일반 텍스트 프로토콜로 통신함을 나타냅니다.
- **`listners`:**
    - **역할:** Kafka 브로커가 요청을 수신할 때 사용할 네트워크 주소를 설정합니다.
    - **값:** `PLAINTEXT://0.0.0.0:9092`
        - **`PLAINTEXT`**: 이 브로커가 클라이언트와 통신할 때 암호화되지 않은 일반 텍스트 프로토콜을 사용함을 나타냅니다.
        - **`0.0.0.0`**: 브로커가 모든 네트워크 인터페이스에서 연결을 수락하도록 설정합니다. 즉, 외부에서 접근할 수 있도록 열려 있는 상태입니다.
        - **`9092`**: 브로커가 사용할 포트 번호입니다.