목차

Cloud Data Stream 환경

개요

Cloud Data Stream 기반으로 발행(Publish) 예제 프로젝트와 구독(Subscribe) 에제 프로젝트 2개로 구성되어 있다.

설명

Data Stream 예제 5종

Service mesh 구성도

연계 유형

순번 유형 발행 Messsage Broker 구독 비고
1 IOT 온습도 센서 RabbitMQ Websocket(Google Chart)
2 Log Logback Appender Apache Kafka OpenSearch OpenLogstash로 자료 처리 및 연동
3 File Line 기반 파일 Apache Kafka Websocket
4 DB H2 DB Apache Kafka Websocket(Google Chart)
5 Open API 지하철 전동차 정보 Apache Kafka MongoDB 구독 데이터 저장

환경설정

라즈베리 파이

초소형 PC 라즈베리파이(Raspberry Pi)는 영국 라즈베리 파이 재단이 학교와 개발도상국에서 기초 컴퓨터 과학의 교육을 증진시키기 위해 개발한 신용카드 크기의 싱글 보드 컴퓨터이다.
리눅스 OS 기반으로 초소형에 아주 적은 소모전력을 사용하기 때문에 IOT관련 개발용 및 테스트용으로 주로 사용된다.

필요 패키지 환경 구성하기

1. 패키지 목록 최신화
$ sudo apt-get update
$ sudo apt-get upgrade
2. 파이썬 패키지의 다운로드 및 설치에 필요한 툴 설치

python3-dev : 파이썬 확장 모듈( https://docs.python.org/2/extending/extending.html )을 컴파일하는 데 필요한 모든 것이 포함되어 있음
python3-pip : Python 3.x용 패키지 소프트웨어를 설치·관리하는 패키지 관리 시스템

$ sudo apt-get install python3-dev python3-pip
3. 파이썬 패키지 설치용 툴 최신화

setuptools : 파이썬 표준 라이브러리 distutils를 개선하여 파이썬 프로젝트의 관리를 쉽게 하도록 설계된 패키지 개발 프로세스 라이브러리이다
wheel : 파이썬의 build package로 일반적인 source distribution보다 더 빠른 설치가 가능하여서 공식적으로 권장되는 포맷이다.

$ sudo python3 -m pip install --upgrade pip setuptools wheel
4. pip3 패키지 매니저를 통해 Adafruit_DHT 패키지 설치

Python3에서 센서정보 추출을 위해 설치 필요

$ sudo pip3 install Adafruit_DHT

라즈베리파이 GPIO(general-purpose input/output) 핀 배열

gpio_핀_배열

온습도 센서와 배선 맵핑 방법

DHT22 온습도 센서 배선 맵핑

DHT22 온습도 센서 스펙

DHT22 온습도 센서

동작 전압 (Power) 3~5 V
온도 측정 범위 (Temperature range) -40 ~ 80 ℃ (오차 ±0.5 ℃)
습도 측정 범위 (Humidity range) 0 ~ 100 % (오차 ±2 %)
데이터 주기 (sampling rate) 2 Hz

DHT11 온습도 센서 스펙

DHT11 온습도 센서

동작 전압 (Power) 3~5 V
온도 측정 범위 (Temperature range) 0 ~ 50 ℃ (오차 ±2 ℃)
습도 측정 범위 (Humidity range) 20 ~ 80 % (오차 ±5 %)
최대소비전력 (Max. current) 2.5 mA
데이터 주기 (sampling rate) 1 Hz

RabbitMQ

설치방법

Docker 기반 설치
docker run -d -e TZ=Asia/Seoul --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management

⇒ 재시작 docker ps -a docker restart b6a2dfd68666{컨테이너 ID}

관리 UI 접속하기

접속 URL
http://localhost:15672

초기 guest 계정 정보

※ IP가 외부에 오픈 되는 경우 변경 필수
Username : guest , Password : guest

초기 화면

Apache Kafka

설치방법

1. docker-compose.yml
version: '2'
services:
  zookeeper:
    networks:
      - kafka-network
    container_name: zookeeper
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    networks:
      - kafka-network
    container_name: kafka
    image: wurstmeister/kafka
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.100.50:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_CREATE_TOPICS: "sample-topic:1:1"
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - zookeeper
networks:
  kafka-network:
    external: true
2. Docker Compose 설정
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.100.40:9092
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
KAFKA_ADVERTISED_PORT : 9092
KAFKA_CREATE_TOPICS "sample-topic"
3. Docker Compose 실행
$ docker-compose -f docker-compose.yml up -d
4. Docker Container 접속
$ docker ps -a
$ docker exec -it kafka /bin/bash
$ docker exec -it zookeeper /bin/bash
$ docker exec -it [컨테이너명] /bin/bash
5. 버전 확인

Kafka 버전

$ kafka-topics.sh --version

ZooKeeper 버전

$ echo srvr | nc localhost 2181

* 현재 확인 버전
Apache Kafka : v2.8.1
ZooKeepeer : v3.4.13

6. Kafka Topic

topic 생성

$ kafka-topics.sh --create --topic sample-topic --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1
$ kafka-topics.sh : kafka-topics.sh shell script
 
--create : topic 생성
--topic : topic 명
--bootstrap-server : host:port, 대상 카프카 클러스터
--replication-factor : replica 갯수 지정 (복제본의 수)
--partitions : paritions 갯수 지정 (토픽을 몇개로 나눌 것인가)

topic 확인

# topic 목록 확인
$ kafka-topics.sh --list --bootstrap-server localhost:9092
 
# 상세 확인
$ kafka-topics.sh --describe --topic sample-topic --bootstrap-server localhost:9092
7. Producer - 메시지 전송
$ kafka-console-producer.sh --topic sample-topic --bootstrap-server localhost:9092
 
This is my first event
This is my second event
8. Consumer - 메시지 읽기
$ kafka-console-consumer.sh --topic sample-topic --bootstrap-server localhost:9092 --from-beginning
 
This is my first event
This is my second event

Kafka UI

설치방법

KAFKA_CLUSTERS_0_NAME = 클러스터 명 지정
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS = Kafka Server URL ( Docker Network내에 호스명지정 가능 )
KAFKA_CLUSTERS_0_ZOOKEEPER = Zookeper Server URL ( Docker Network내에 호스명지정 가능 )

# compose 파일 버전
version: '3'
services:
  # 서비스 명
  kafka-ui:
    networks:
      - kafka-network
    # 사용할 이미지
    image: provectuslabs/kafka-ui
    # 컨테이너명 설정
    container_name: kafka-ui
    # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)  
    ports:
      - "9980:8080"
    # 환경 변수 설정
    environment:
      - KAFKA_CLUSTERS_0_NAME=local
      - KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka:9092
      - KAFKA_CLUSTERS_0_ZOOKEEPER=zookeeper:2181
      #- KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=192.168.100.40:9092
      #- KAFKA_CLUSTERS_0_ZOOKEEPER=192.168.100.40:2181
networks:
  kafka-network:
    external: true

이미지 구동

$ docker-compose up -d

UI 초기화면

호출 URL
http://localhost:9980
초기화면

OpenSearch

설치방법

version: '3'
services:
  opensearch:
    image: opensearchproject/opensearch:latest
    container_name: opensearch
    environment:
      - cluster.name=opensearch-cluster
      - node.name=opensearch
      - discovery.seed_hosts=opensearch
      - cluster.initial_master_nodes=opensearch
      - bootstrap.memory_lock=true # along with the memlock settings below, disables swapping
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" # minimum and maximum Java heap size, recommend setting both to 50% of system RAM
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536 # maximum number of open files for the OpenSearch user, set to at least 65536 on modern systems
        hard: 65536
    volumes:
      - opensearch-data:/usr/share/opensearch/data
    ports:
      - 9200:9200
      - 9600:9600 # required for Performance Analyzer
    networks:
      - egov-network
  openlogstash:
    container_name: openlogstash
    image: opensearchproject/logstash-oss-with-opensearch-output-plugin:latest
    restart: always
    ports:
      - "5001:5001"
    environment:
      LS_JAVA_OPTS: "-Xmx256m -Xms256m"
      TZ: Asia/Seoul
    volumes:
      - type: bind
        source: ./logstash/config/logstash.yml
        target: /usr/share/logstash/config/logstash.yml
        read_only: true
      - type: bind
        source: ./logstash/pipeline
        target: /usr/share/logstash/pipeline
        read_only: true
    networks:
      - egov-network
  opensearch-dashboards:
    image: opensearchproject/opensearch-dashboards:latest
    container_name: opensearch-dashboards
    ports:
      - 5601:5601
    expose:
      - "5601"
    environment:
      OPENSEARCH_HOSTS: '["https://opensearch:9200"]'
    networks:
      - egov-network
 
volumes:
  opensearch-data:
 
networks:
  egov-network:

이미지 구동

$ docker-compose up -d

UI 초기화면

호출 URL
http://localhost:9200
초기화면

Mongo DB

설치방법

1. docker-compose.yml
version: '3.8'
 
services:
  mongodb:
    image: mongo:latest
    container_name: my-mongodb
    ports:
      - 27017:27017
    environment:
      - MONGO_INITDB_DATABASE=com
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=frame001
      - MONGO_USERNAME=com
      - MONGO_PASSWORD=com01
    restart: always
    platform: linux/x86_64

docker-compose.yml 파일을 이용하여 docker image, container 설치

$ docker-compose up -d
2. docker shell 접속
$ docker exec -it my-mongodb bash
3. mongodb 접속
$ mongosh -u root -p frame001

* 5.x 까지는 mongo

4. database 생성
show dbs;
use com;

* exist : use database, not exist : create database

5. user 생성
use com;
db.createUser({user:"com",pwd:"com01",roles:[{role:"dbOwner",db:"com"}]});
db.getUsers();

참고자료