Cloud Data Stream 기반으로 발행(Publish) 예제 프로젝트와 구독(Subscribe) 에제 프로젝트 2개로 구성되어 있다.
| 순번 | 유형 | 발행 | 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관련 개발용 및 테스트용으로 주로 사용된다.
$ sudo apt-get update $ sudo apt-get upgrade
python3-dev : 파이썬 확장 모듈( https://docs.python.org/2/extending/extending.html )을 컴파일하는 데 필요한 모든 것이 포함되어 있음
python3-pip : Python 3.x용 패키지 소프트웨어를 설치·관리하는 패키지 관리 시스템
$ sudo apt-get install python3-dev python3-pip
setuptools : 파이썬 표준 라이브러리 distutils를 개선하여 파이썬 프로젝트의 관리를 쉽게 하도록 설계된 패키지 개발 프로세스 라이브러리이다
wheel : 파이썬의 build package로 일반적인 source distribution보다 더 빠른 설치가 가능하여서 공식적으로 권장되는 포맷이다.
$ sudo python3 -m pip install --upgrade pip setuptools wheel
Python3에서 센서정보 추출을 위해 설치 필요
$ sudo pip3 install Adafruit_DHT
| 동작 전압 (Power) | 3~5 V | 
| 온도 측정 범위 (Temperature range) | -40 ~ 80 ℃ (오차 ±0.5 ℃) | 
| 습도 측정 범위 (Humidity range) | 0 ~ 100 % (오차 ±2 %) | 
| 데이터 주기 (sampling rate) | 2 Hz | 
| 동작 전압 (Power) | 3~5 V | 
| 온도 측정 범위 (Temperature range) | 0 ~ 50 ℃ (오차 ±2 ℃) | 
| 습도 측정 범위 (Humidity range) | 20 ~ 80 % (오차 ±5 %) | 
| 최대소비전력 (Max. current) | 2.5 mA | 
| 데이터 주기 (sampling rate) | 1 Hz | 
docker run -d -e TZ=Asia/Seoul --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management
⇒ 재시작 docker ps -a docker restart b6a2dfd68666{컨테이너 ID}
※ IP가 외부에 오픈 되는 경우 변경 필수
Username : guest , Password : guest
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
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"
$ docker-compose -f docker-compose.yml up -d
$ docker ps -a $ docker exec -it kafka /bin/bash $ docker exec -it zookeeper /bin/bash $ docker exec -it [컨테이너명] /bin/bash
Kafka 버전
$ kafka-topics.sh --version
ZooKeeper 버전
$ echo srvr | nc localhost 2181
* 현재 확인 버전
Apache Kafka : v2.8.1 
ZooKeepeer : v3.4.13 
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
$ kafka-console-producer.sh --topic sample-topic --bootstrap-server localhost:9092 This is my first event This is my second event
$ kafka-console-consumer.sh --topic sample-topic --bootstrap-server localhost:9092 --from-beginning This is my first event This is my second event
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
http://localhost:9980
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
http://localhost:9200
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
$ docker exec -it my-mongodb bash
$ mongosh -u root -p frame001
* 5.x 까지는 mongo
show dbs; use com;
* exist : use database, not exist : create database
use com;
db.createUser({user:"com",pwd:"com01",roles:[{role:"dbOwner",db:"com"}]});
db.getUsers();