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();