0. Table of content

 

 

 

1. 목표 아키텍처

 

 

 

 

 

2. Apache Kafka Download

 

다음 명령어를 통해 Apache Kafka 최신 버전을 다운받고 java1.8을 설치한다.

sudo yum install -y java-1.8.0-openjdk-devel.x86_64
 
wget http://apache.mirror.cdnetworks.com/kafka/2.5.0/kafka-2.5.0-src.tgz
 
tar -xzf kafka-2.5.0-src.tgz

 

압축을 해제하면 다음과 같은 구조의 디렉토리를 볼 수 있을 것이다.

 

 

 

3. Zookeeper Cluster Configuration

 

Zookeeper Cluster를 구성하기 위해 3개의 VM을 생성하였으며, 상세 config 및 서버 스펙은 다음과 같다.

IP AddressZookeeper IdKafka Broker IdInstance Type

IP Address Zookeeper Id Kafka Broker Id Instance Type
10.0.6.218 1 1 t2.medium
10.0.7.5 2 2 t2.medium
10.0.6.195 3 3 t2.medium

 

ZooKeeper 데이터 디렉토리에는 특정 서빙 앙상블에 의해 저장된 znodes의 영구 사본 인 파일이 있습니다.

각 zookeeper의 설정을 {kafkaDir}/config/zookeeper.properties에 다음과 같이 3개의 vm에 입력한다.

# 여러 zookeeper에 의해 저장된 znode의 사본과 zookeeper id를 저장하는 dir
dataDir=/home/ec2-user/zookeeper

# zookeeper가 coordinate하고 있는 kafka에 접속하기 위한 클라이언트 port
clientPort=2181

# 클라이언트 connection 접속 제한 개수
maxClientCnxns=10

# Follower가 leader에 접속하고 싱크를 맞추기 위해 허용된 시간. 값이 증가할수록 zookeeper가 책임지는 데이터의 양이 증가한다.
initLimit=5

to allow followers to sync with ZooKeeper. If followers fall too far behind a leader, they will be dropped.
# Follower가 Zookeeper에 싱크를 맞추기 위해 허용된 시간. Follower가 leader에 대해 싱크를 맞추지 못하면 drop 된다고 햔다.
syncLimit=2

# Zookeeper VM의 정보
# 형식 : server.{id}={VM HostName or IP address}:{Cluster Sync Port}:{Leader Election Port}
# 입력시, localhost는 기입하지 않으며, 무조건 hostname, ip address를 이용하여 기입한더ㅏ.
server.1=10.0.6.218:2888:3888
server.2=10.0.7.5:2888:3888
server.3=10.0.6.195:2888:3888

 

 

또한, 각 Zookeeper id를 다음과 위에서 설정한 dataDir 경로에 myid라는 파일을 만들어 다음과 같이 입력한다.

echo 1 > {Your zookeeper dataDir in zookeeper.properties}/myid

 

입력한 후, 다음과 같이 각 VM의 zookeeper를 다음 명령어로 실행시킨다.

정상적으로 동작이 되는 경우는 첨부된 다음과 같은 사진과 같은 화면을 볼 수 있다.

# 테스트를 위해 데몬으로 실행시키지 않음.
# kafka cluster 실행을 위해서는 -daemon 옵션으로 백그라운드 실행시킨다.
bin/zookeeper-server-start.sh config/zookeeper.properties

 

 

4. Kafka Cluster Configuration

[업데이트 예정]

 

5. 참고자료

    - https://zookeeper.apache.org/doc/r3.4.7/zookeeperAdmin.html 

    - https://kafka.apache.org/documentation/#brokerconfigs 

 

6. 삽질프로젝트 로그

    - 20200630 : Zookeeper Cluster VM생성 완료

    - 20200701 : Zookeeper Cluster 구성완료

 

'IT > OpenSource' 카테고리의 다른 글

[OpenSource] Apache Kafka  (0) 2020.09.07
[Apache Kafka] Kafka Cluster 구성하기(수정중)  (0) 2020.07.01

1. 대시보드에서 나타내야 할 것

- 기간에 따른 사용자 수

- 인기글 리스트

- 유입 경로 및 채널

- 유입 키워드

- 유입자 현황 차트 (척도 : 기간, Refere URL, 컨텐츠, 디바이스)

 

 

2. 추가 구현하고 싶은 것

- 전날 유입자 통계를 카카오톡으로 알림 받기

- 현재 학습하고 있는 OAuth2.0을 이용하여 대시보드 사이트 인증

- 일일 평균 유입자 현황

- 현재 기능별로 레포지토리가 분리되어있고, kafka broker에 다양한 로그들을 수집할 예정이기 때문에 향후 kubernetes를 적용할 예정

 

 

3. 사용할 기술

- DB : DynamoDB or MongoDB (조회성이 많기 때문에 RDB보다 NOSQL이 낫다고 판단) with JPA

- Message Broker : Apache Kafka (Topic은 YYYYmmDD 형식 사용, content는 json형식의 로그데이터 / 일일 배치로 DB BulkUpdate)

- Framework : spring boot with jstl (다른 가벼운 것을 써도 되지만, 학습 차원에서 사용하도록 한다.)

- 언어 : Java1.8

- 인증 : Oauth2.0(Spring Security 사용 예정), jwt

 

 

4. 수집해야할 정보

- 블로그 유입자들이 클릭한 컨텐츠

- 유입 시간대

- 블로그를 조회한 Referer URL

 

 

 

5. 아키텍처 구성도

 

 

6. 참고 문헌

- KISA 고시 및 권고 : www.kisa.or.kr/public/laws/laws2.jsp

- Apache Kafka Documentation : www.kafka.apache.org/documentation/

- RFC6749 : www.tools.ietf.org/html/rfc6749

 

 

7. 수정 로그

2020.05.13 : 최초 작성

2020.05.20 : 아키텍처 다이어그램 추가 완료

2020.06.11 : 아키텍처를 AWS로 옮기는 중, 불필요한 로드밸런서 개수와 외부 노출 서비스의 도메인 연결로 인해 아키텍처 수정중.

2020.06.16 : 서비스별 로드밸런서 아키텍처 적용 및 향후 계획(kubernetes 적용 예정) 추가

2020.06.30 : 운영 환경을 생각하고 설계할 것이기 때문에 kafka와 zookeeper를 분리하는 아키텍처 적용 예정

2020.07.01 : Zookeeper Cluster 구성 완료

1. https://json.geoiplookup.io 오픈소스

   - 위 링크를 통해 가져 올 수 있는 데이터의 목록은 다음과 같다.

(
   {
      "ip":"-",
      "isp":"-",
      "org":"",
      "hostname":"-",
      "latitude":-,
      "longitude":-,
      "postal_code":"",
      "city":"-",
      "country_code":"KR",
      "country_name":"South Korea",
      "continent_code":"AS",
      "continent_name":"Asia",
      "region":"Seoul",
      "district":"-",
      "timezone_name":"Asia\/Seoul",
      "connection_type":"Corporate",
      "asn_number":3786,
      "asn_org":"-",
      "asn":"-",
      "currency_code":"KRW",
      "currency_name":"South Korean Won",
      "success":true,
      "premium":false
   }
);

  - 하지만, 개인정보 보호법에 따르면 특정인을 유추할 수 있는 정보를 수집하여서는 안되므로, ip address, 위도, 경도를 수집하지 않겠다.

  - 최종적으로 위 오픈소스를 통해 가져갈 정보는 "country code", "region"만 가져가겠다.

 

 

 

2. Javascript - document.referrer 

  - document객체의 referrer를 이용하면, 참조한 페이지를 알 수 있다.

  - 실험 결과, 주소창에 직접 친 경우 빈 string을 출력하였으며,

  - 블로그 내부에서 다른 글을 참조하였을 경우, 블로그 도메인을 포함한 url이 출력되었다.

  - 외부 링크를 타고 오는 경우, 그대로 외부 링크를 표시했다.

  - 이를 이용하여 실질적인 블로그 이용자를 추적할 수 있을 것으로 보인다.

 

 

 

 

3. Javascript - Date.now()

  - 티스토리 대시보드에는 어느 시간대에 사람들이 들어왔는지에 대한 정보가 없다.

  - 시간대까지 포함하면, 개발자들이 어느시간대에 가장 공부를 많이하고 참조를 하는지 알 수 있을거같다. (?)

  - 그래서 이 정보 또한 수집하기로 하였다......

 

 

 

 

4. 기타 필요한 정보

  - 블로그 컨텐츠 정보

  - 디바이스 정보

 

 

 

 

5. NOSQL Table 초안

   {
      "topic":"kafka broker topic - PK"
      "date":"내 블로그를 조회한 날짜 - SK",
      "content":"조회한 블로그 컨텐츠 정보",
      "referer":"블로그 참조 경로",
      "device":"참조한 디바이스 정보",
      "time":"블로그 글을 조회 한 시간",
      "country":"국가",
      "city":"지역 이름 (시 단위 까지만)"
   }

 

 

 

 

6. 작업 이력

  - 2020.06.09 : 초안 작성 완료.

  - 2020.06.10 : AWS DynamoDB 테이블 생성 완료

+ Recent posts