아무거나

Zookeeper 및 Kafka 설치(Centos7) - 1 본문

Infra/kafka

Zookeeper 및 Kafka 설치(Centos7) - 1

전봉근 2020. 6. 27. 17:35
반응형

Zookeeper 및 Kafka 설치(Centos7)

  • Zookeeper 클러스터 설치 (과반수 방식이라 홀수로 운영이 구성되야함)
    • Java 설치

        $ sudo yum -y install java-1.8.0-openjdk
      
    • https://zookeeper.apache.org/ 접속하여 하위 메뉴에 Getting Started의 2번 Download 링크를 클릭한다. (=2. Download ZooKeeper from the release page.)

    • 그 다음 Download 에서 3.4.14 버전의 확장자 tar.gz으로 다운받는다

    • 아래 명령으로 압축을 해제한다.

        // 경로이동 및 설치폴더 생성
        mkdir /home/bkjeon/app
      
        // 다운
        $ wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
      
        // 압축해제
        $ tar zxf zookeeper-3.4.14.tar.gz
        
        // 심볼릭 링크 생성
        $ ln -s zookeeper-3.4.14 zookeeper
      
    • 지노드(=데이터를 저장하기 위한 공간)의 복사본인 스냅샷과 트랜잭션 로그들이 저장되는 별도의 데이터 디렉토리를 생성한다.

        // data 폴더 생성 (중요한 데이터 이므로 설치경로와는 다른 경로로 설정하는게 좋다)
        $ sudo mkdir -p /data/zookeeper
        $ sudo chown -R bkjeon:bkjeon /data
      
    • 앙상블(=클러스터) 내 주키퍼 노드를 구분하기 위한 ID를 생성

        // 주키퍼에서는 myid 라고 부르며 방금 만든 /data 하위에 myid라는 파일을 만들고 내용은 1이라고 입력한다. (myid는 주키퍼의 설정 파일에서 사용하게 된다.)
        $ echo 1 > /data/zookeeper/myid
        $ cat /data/zookeeper/myid // 출력값: 1
      
    • 위의 myid 생성하는 과정을 다른 주키퍼 서버에도 아래와 같이 myid를 지정한다

        server1 -> myid: 1
        server2 -> myid: 2
        server3 -> myid: 3
      
    • 환경설정 파일 생성

        $ vi /home/bkjeon/app/zookeeper/conf/zoo.cfg
      
        # 주키퍼가 사용하는 시간에 대한 기본 측정(밀리초)
        tickTime=2000
        # 팔로워가 리더와 초기에 연결하는 시간에 대한 타임 아웃 tick의 수
        initLimit=10
        # 팔로워가 리더와 동기화 하는 시간에 대한 타임 아웃 tick의 수(주키퍼에 저장된 데이터가 크면 수를 늘려야함)
        syncLimit=5
        # 주키퍼의 트랜잭션 로그와 스냅샷이 저장되는 데이터 저장 경로(중요)
        dataDir=/data/zookeeper
        # 주키퍼 사용 TCP Port
        clientPort=2181
        # server.1에 자기 자신은 0.0.0.0 로 입력 ex) 2번서버일 경우 server.2가 0.0.0.0이 된다
        # server.{1} -> {1} 은 myid이다 즉, server.myid 형식으로 되어있다. 
        server.1=0.0.0.0:2888:3888
        server.2=127.0.0.1:2888:3888
        server.3=127.0.0.1:2888:3888
      

      각각 서버마다 해당 설정파일을 만들어야한다.

    • 방화벽 허용

        $ su  // 관리자 로그인
        $ firewall-cmd --permanent --zone=public --add-port=2181/tcp
        $ firewall-cmd --permanent --zone=public --add-port=2888/tcp
        $ firewall-cmd --permanent --zone=public --add-port=3888/tcp
      
        // 방화벽 reload
        $ firewall-cmd --reload
      
        // 만약 방화벽을 제한할 경우
        $ firewall-cmd --permanent --zone=public --remove-port=2181/tcp
      
    • Zookeeper 실행

        // 실행
        $ {zookeeper경로}/bin/zkServer.sh start
      
        // 중지
        $ {zookeeper경로}/bin/zkServer.sh stop
      
    • zookeeper 프로세스를 systemd에 등록

      • zookeeper용 systemd 파일을 생성 [zookeeper-server.service]
          $ sudo vi /usr/lib/systemd/system/zookeeper-server.service
        
          // 내용
          [Unit]
          // systemctl status 명령어에 표시되는 상세 설명
          Description=zookeeper-server
          // 유닛이 시작되는 순서를 조정하여 After에 지정된 유닛이 실행된 이후 시작된다.
          After=network.target
        
          [Service]
          // ExecStart에 영향을 주는 유닛 프로세스가 시작되며, simple, forking, oeshot, idle 등이 있다.
          Type=forking
          User=bkjeon
          Group=bkjeon
          // syslog에서 구분하기 위한 이름
          SyslogIdentifier=zookeeper-server
          // 실행된 프로세스의 작업 디렉토리를 설정
          WorkingDirectory=/home/bkjeon/app/zookeeper
          // systemctl 명령어로 인한 중지를 제외하고 프로세스가 종료된 후 재시작한다.
          Restart=always
          // Restart 옵션과 연결되어 몇 초에 실행할지 결정
          RestartSec=0s
          // 서비스가 시작될 때 실행할 명령어 또는 스크립트 작성
          ExecStart=/home/bkjeon/app/zookeeper/bin/zkServer.sh start
          // 서비스가 정지될 때 실행할 명령어 또는 스크립트 작성
          ExecStop=/home/bkjeon/app/zookeeper/bin/zkServer.sh stop
        
          [Install]
          // 서비스가 실행될 타겟 설정
          WantedBy=multi-user.target
        
      • zookeeper용 systemd설정 적용을 위한 systemd 재시작
          $ sudo systemctl daemon-reload
        
      • 주키퍼 시작
          $ sudo systemctl start zookeeper-server.service // 시작
          $ sudo systemctl stop zookeeper-server.service // 중지
          $ sudo systemctl restart zookeeper-server.service // 재시작
          $ sudo systemctl status zookeeper-server.service // 상세정보 확인
        
      • 만약 selinux is preventing /usr/lib/systemd/systemd from read access 오류를 표시할 때
        • SELinux 해제 (SELinux 는 Linux의 보안을 강화해 주는 보안 강화 커널이고 zero-day 공격 및 buffer overflow 등 어플리케이션 취약점으로 인한 해킹을 방지해 주는 핵심 구성요소이다. -> 인터넷에 연결된 리눅스 서버일 경우 SELinux 해제는 추천하지 않는다)
        • sudo vi /etc/sysconfig/selinux
            SELINUX=enforcing ->  SELINUX=disabled 로 변경 후 재부팅
          
        • reboot
      • 서버가 부팅할 때 자동으로 주키퍼 서비스를 실행하게 설정
          // enable 적용되면 "Created symlink from /etc/systemd/system/multi-user.target.wants/zookeeper-server.service to /etc/systemd/system/zookeeper-server.service" 을 출력 -> /etc/systemd/system/multi-user.target.wants 경로에 심볼릭 링크로 생성되어있다.
          $ sudo systemctl enable zookeeper-server.service
        
  • Kafka 클러스터 설치(자유롭게 서버 구성 가능)
    • 주키퍼와 카프카를 같은 서버에 두지 말자 -> 예를 들어 3대의 주키퍼 서버에서 2대가 다운되면 과반수에 미치지 못하여 장애가 발생한다. 이와 같은 상황에서 주키퍼가 코디네이션 역할을 수행하지 못하게되면 카프카 클러스터에는 문제가 없더라도 주키퍼와 통신이 되지 않아 카프카 또한 장애상황에 놓이게 된다. 즉, 주키퍼와 카프카는 별도의 서버에 넣는것이 좋음 (개발은 같은 서버, 운영은 별도의 서버로 하면 좋을 것 같다)
    • 자바 설치
        $ sudo yum -y install java-1.8.0-openjdk
      
    • 카프카 설치
        // 경로이동 및 설치폴더 생성
        $ mkdir /home/bkjeon/app
      
        // kafka 다운
        $ wget https://archive.apache.org/dist/kafka/1.0.0/kafka_2.11-1.0.0.tgz
      
        // 압축해제
        $ tar zxf kafka_2.11-1.0.0.tgz
      
        // 심볼릭 링크 생성
        $ ln -s kafka_2.11-1.0.0 kafka
      
    • 주키퍼를 설치하 때 처럼 서버별 구분을 위한 myid 지정
        $ echo 1 > /data/kafka/myid
        $ cat /data/kafka/myid // 출력값: 1 (각 서버별로 지정해주자 -> 2번 서버: 2, 3번 서버: 3)
      
    • 카프카에서 사용할 저장 디렉토리를 생성 (디스크가 여러 개인 서버의 경우 각 디스크의 수만큼 디렉토리를 만들어줘야 각 디스크별로 I/O를 분산할 수 있음)
        // 저장 디렉토리를 2개로 설정하는 방법으로 설정
        $ sudo mkdir -p /data/kafka
        $ sudo mkdir -p /data/kafka/data1
        $ sudo mkdir -p /data/kafka/data2
        $ sudo chown -R bkjeon:bkjeon /data
      
    • 이 과정으로 총 3개의 kafka 서버를 구성하였다. 그 다음 환경설정 파일인 server.properties 파일을 변경하자 [/home/bkjeon/app/kafka/config/server.properties]
        ...
          # 이전 과정에서 지정한 해당하는 myid값을 서버별로 입력
          broker.id=1
        ...
          # listeners에 현재 카프카가 설치되어 있는 서버의 자신의 IP를 입력(ex:192.168.0.203)
          listeners=PLAINTEXT://192.168.0.203:9092
        ...
          # 이전 과정에서 구성한 디스크를 입력(하나인경우 /data1, 두개인경우 /data1,/data2)
          log.dirs=/data/kafka/data1,/data/kafka/data2
        ...
          # 필자는 미리 설정해놓은 고정IP로 zookeeper connect 경로를 설정하고, bkjeon-kafka라는 지노드를 공통으로 만들어 하위 지노드로 생성할 수 있게 구성하였다.(ex:01, 02)
          zookeeper.connect=192.168.0.200:2181,192.168.0.201:2181,192.168.0.202:2181/bkjeon-kafka
        ...
      
    • 방화벽 허용
        $ su  // 관리자 로그인
        $ firewall-cmd --permanent --zone=public --add-port=9092/tcp
      
        // 방화벽 reload
        $ firewall-cmd --reload
      
    • 카프카 실행
        // 시작
        /home/bkjeon/app/kafka/bin/kafka-server-start.sh /home/bkjeon/app/kafka/config/server.properties -daemon
      
        // 종료
        /home/bkjeon/app/kafka/bin/kafka-server-stop.sh
      
    • 카프카 또한 주키퍼처럼 운영 편의성을 위하여 systemd에 등록하자. kafka용 systemd 파일을 생성 (kafka 서버마다 다 생성) [kafka-server.service]
        $ sudo vi /usr/lib/systemd/system/kafka-server.service
      
        // 내용
        [Unit]
        Description=kafka-server
        After=network.target
      
        [Service]
        Type=simple
        User=bkjeon
        Group=bkjeon
        SyslogIdentifier=kafka-server
        WorkingDirectory=/home/bkjeon/app/kafka
        Restart=no
        RestartSec=0s
        ExecStart=/home/bkjeon/app/kafka/bin/kafka-server-start.sh /home/bkjeon/app/kafka/config/server.properties
        ExecStop=/home/bkjeon/app/kafka/bin/kafka-server-stop.sh
      
        [Install]
        WantedBy=multi-user.target
      
    • kafka용 systemd설정 적용을 위한 systemd 재시작
        $ sudo systemctl daemon-reload
      
    • kafka 시작
        $ sudo systemctl start kafka-server.service // 시작
        $ sudo systemctl status kafka-server.service // 상세정보 확인
      
    • 서버가 부팅할 때 자동으로 카프카 서비스를 실행하게 설정
        $ sudo systemctl enable kafka-server.service
      
  • 상태확인

    • TCP 포트 확인
        // zookeeper port 상태 확인
        $ netstat -ntlp | grep 2181
      
        // kafka port 상태 확인
        $ netstat -ntlp | grep 9092
      
    • kafka와 zookeeper가 제대로 연동이 되었는지 zookeeper의 지노드를 사용하여 kafka의 정보와 로그를 확인하는 방법
      • zookeeper CLI 접속
          $ /home/bkjeon/app/zookeeper/bin/zkCli.sh
        
      • zookeeper CLI로 위의 설정한 bkjeon-kafka 라는 지노드가 있는지 확인
          // 출력화면에 [zookeeper, bkjeon-kafka]가 있는지 확인
          $ [zk: localhost:2181(CONNECTED) 11] ls /
        
          // 출력 [1, 2, 3]
          $ [zk: localhost:2181(CONNECTED) 11] ls /bkjeon-kafka/brokers/ids
        
      • kafka 로그 확인
          $ cat /home/bkjeon/app/kafka/logs/server.log
        
반응형

'Infra > kafka' 카테고리의 다른 글

컨슈머 주요 옵션  (0) 2020.07.31
프로듀서 주요 옵션  (0) 2020.07.31
Zookeeper 및 Kafka 설치(Centos7) - 3  (0) 2020.07.25
Zookeeper 및 Kafka 설치(Centos7) - 2  (0) 2020.07.07
Comments