====== Cloud Data Stream 환경 ====== ===== 개요 ===== Cloud Data Stream 기반으로 발행(Publish) 예제 프로젝트와 구독(Subscribe) 에제 프로젝트 2개로 구성되어 있다. ===== 설명 ===== ==== Data Stream 예제 5종 ==== === Service mesh 구성도 === {{:egovframework:rte4:rex:data_stream_example.png?800|}} === 연계 유형 === ^ 순번 ^ 유형 ^ 발행 ^ 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) 핀 배열 === {{:egovframework:rte4:rex:gpio_pinout.png?350|gpio_핀_배열}} === 온습도 센서와 배선 맵핑 방법 === {{:egovframework:rte4:rex:dht-22-mapping.png?700|DHT22 온습도 센서 배선 맵핑}} === DHT22 온습도 센서 스펙 === {{:egovframework:rte4:rex:dht22_pin_spec.png?130|DHT22 온습도 센서}} | 동작 전압 (Power) | 3~5 V | | 온도 측정 범위 (Temperature range) | -40 ~ 80 ℃ (오차 ±0.5 ℃) | | 습도 측정 범위 (Humidity range) | 0 ~ 100 % (오차 ±2 %) | | 데이터 주기 (sampling rate) | 2 Hz | === DHT11 온습도 센서 스펙 === {{:egovframework:rte4:rex:dht11_pin_spec.png?150|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 {{:egovframework:rte4:rex:rabbitmq_login.png?700|}} == 초기 guest 계정 정보 == ※ IP가 외부에 오픈 되는 경우 변경 필수\\ Username : guest , Password : guest == 초기 화면 == {{:egovframework:rte4:rex:rabbitmq_main.png?700|}} ==== 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 == 초기화면 == {{:egovframework:rte4:rex:kafka_ui_main.png?800|}} ==== 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 == 초기화면 == {{:egovframework:rte4:rex:opensearch_ui_main.png?800|}} ==== 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(); ===== 참고자료 ===== * [[https://ko.wikipedia.org/wiki/%EB%9D%BC%EC%A6%88%EB%B2%A0%EB%A6%AC_%ED%8C%8C%EC%9D%B4|라즈베리파이]] * [[https://github.com/adafruit/Adafruit_Python_DHT|Adafruit Python DHT 센서 라이브러리]] * [[egovframework:rte4.2:itl:cloud_data_stream|Cloud Data Stream 가이드]]