[CDC] MySQL Debezium Change Data Capture 따라해보기 - 3 아래 레포에서 데모 구현한 샘플 확인할 수 있다. https://github.com/sanggi-wjg/spring-cdc-debezium-demo GitHub - sanggi-wjg/spring-cdc-debezium-demo Contribute to sanggi-wjg/spring-cdc-debezium-demo development by creating an account on GitHub. github.com Spring boot 설정 build.gradle.kts import com.github.imflog.schema.registry.Subject import org.jetbrains.kotlin.gra..
[CDC] MySQL Debezium Change Data Capture 따라해보기 - 2 MySQL Master INSERT 실행 마스터 디비에 데모 테이블과 로우를 생성한다. CREATE TABLE user ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, email VARCHAR(124) NOT NULL, password VARCHAR(256) NOT NULL, nickname VARCHAR(124) NULL, user_status VARCHAR(32) DEFAULT 'ACTIVE' ); INSERT INTO user (email, password, nickname, user_status) VALUES ('user@dev.com', 'hashed_password', ..
[CDC] MySQL Debezium Change Data Capture 따라해보기 io.apicurio.registry.utils.converter.AvroConverter를 사용해서 설정을 하고 싶었는데 잘 안되서 혹시 아신다면 댓글 부탁 드립니다. 실제 데모 구현한 프로젝트 레포 입니다. https://github.com/sanggi-wjg/spring-cdc-debezium-demo GitHub - sanggi-wjg/spring-cdc-debezium-demo Contribute to sanggi-wjg/spring-cdc-debezium-demo development by creating an account on GitHub. github.com Docker-compose.yaml versio..
[CDC] Change Data Capture 데이터베이스에서 변경 데이터 캡처(change data capture, CDC)는 변경된 데이터를 사용하여 동작을 취할 수 있도록 데이터를 결정하고 추적하기 위해 사용되는 여러 소프트웨어 디자인 패턴들의 모임이다. https://ko.wikipedia.org/wiki/%EB%B3%80%EA%B2%BD_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%BA%A1%EC%B2%98 CDC란 CDC(Change Data Capture)는 데이터베이스 안에서 일어나는 모든 변화를 감지하고, 이를 각각의 이벤트로 기록하며 이를 이벤트 스트림으로 전달합니다. 이렇게 수집된 이벤트들은 분석, 운영적인 목적으로 활용하거나 다른 데이터베이스로 전송하는 등 다양한 용도로..
카프카 컨슈머 Kafka Consumer는 사용자가 제어하며 poll 메소드를 호출하여 카프카 브로커에서 데이터를 가져올 수 있다. 일반적으로 Consumer의 group.id와 가져올 topic을 지정한다. 같은 group.id를 사용하는 Consumer를 묶어서 Consumer Group이라고 한다. // KafkaConsumer ... set properties of consumer val consumer = consumerFactory(props).createConsumer() consumer.subscribe(listOf("topic-name")) while (true) { val records = consumer.poll(Duration.ofMillis(100)) records.forEach ..
카프카 프로듀서 프로듀서는 카프카 프로듀서 API를 포함하여 구성된 애플리케이션을 마라혀 브로커에 특정 토픽의 파티션에 메시지를 전달하는 역할을 합니다. 프로듀서가 전달하는 메시지의 구조는 다음과 같습니다. Topic (토픽) Partition (특정 파티션 위치) Timestamp (생성 시간) Header (헤더) Key (키) Value (값) 카프카 서버에 메시지를 전송하는 책임을 가지고 있으며 데이터를 전송하기 위한 전략을 가지고 있다. 재시도는 어떻게 할 것 인지 데이터 전송 시 Compression은 어떻게 할 것 인지 데이터 전송 시 Serializer는 어떤것을 사용할 것인지 어떤 Partition으로 데이터 전송을 할 것인지 Compression (압축) 메시지 압축 옵션을 사용하였다면..
카프카 구조 Zookeeper (주키퍼) 분산 코디네이션 서비스를 제공하는 오픈소스 프로젝트로 직접 어플리케이션 작업을 조율하는 것을 쉽게 개발할 수 있도록 도와주는 도구이다. API를 이용해 동기화나 마스터 선출 등의 작업을 쉽게 구현할 수 있게 해준다. Broker (브로커) Kafka 서버를 의미하며 한개의 Cluster 내에 여러개의 Kafka 서버를 실행시킬 수 있다. Topic (토픽) 메시지가 생산되고 소비되는 주체 Partition (파티션) 하나의 토픽내에서 토픽의 메시지가 분산되어서 각자 저장되는 단위 (위 카프카 아키텍쳐대로면 한개의 토픽에서 3개의 파티션으로 저장 관리되고 있다.) 파티션은 내부가 Queue로 구성이 되어있어서 순서를 보장하지만, Partition끼리의 순서를 보장하..
Pattern 1: Stop on error (에러시 중지) 모든 이벤트들이 순서 보장과 함께 에러 없이 처리 되어야 하는 경우에 사용함. (예를 들어, CDC) 처리 도중 에러가 발생한다면 어플리케이션은 중단되며 수동 개입이 필수적이다. Source 토픽의 이벤트는 다른 경로를 사용하지 않는다. Pattern 2: Dead letter queue (실패 대기열 큐) 일반적인 시나리오로 메인 스트림이 계속되는 동안 어플리케이션에서 처리가 불가하다면 Error 토픽으로 향하도록 함. 이 방식에서는 재시도를 위한 프로세스를 요구하거나 지원하지 않는다. 즉, 이벤트는 성공적으로 처리되거나 Error 토픽이다. 일반적인 상황에서 어플리케이션은 Source 토픽의 각 이벤트를 처리하고 Target 토픽으로 생성한..
[Ubuntu 20.04] OpenVPN Server Docker 설치 및 Client Server Side 우분투 패키지 설치 apt update && apt upgrade --y apt install openssl easy-rsa net-tools docker.io Docker로 설치 및 실행 OVPN_DATA="ovpn-data" docker volume create --name $OVPN_DATA # Download the OpenVPN server docker image file with the argument to set it to use your server’s(host) public IP address or your domain name via UDP protocol docker run -..
Airflow Concepts Airflow 는 프로그래밍을 통해서 workflows를 작성하고 스케쥴링 하고 모니터링 하는 플랫폼 이다. Airflow 는 Directed Acyclic Graphs(DAGs)을 통해서 workflows를 작성하며 Airflow 스케줄러는 지정된 종속에 따라서 array of workers를 이용하여 Task를 실행 한다. DAG은 tasks 사이에 종속성과 실행될 순서, 재시도를 명시 해야하며, Taks는 무엇을 할지 작성하여야 한다. Strength points Airflow는 Python 기반으로 쉽게 작성 가능하며 콘솔을 통해서 Task 작업 확인과 bottleneck을 찾을때도 유용하다. Install Requirements 적어도 4Gb 이상의 메모리 이상이여..
Fluentd MySQL slow log 연동하기 MySQL slow log MySQL slow log 는 멀티라인입니다. 따라서, conf 를 꿍짞꿍짝 해서 나중에 수정불가한 conf 를 생성 하거나 open soruce 사용해서 연동을 하면 되는데 착하신 분이 미리 mysqlslowquery 라는 것을 만들어 놓아서 이걸로 연동 했습니다. 설치 및 사전 준비 gpasswd mysql -a td-agent apt install -y ruby ruby-dev libc6-dev # 현재 서버에서 사용중인 gem 레포지가 # td-agent-gem 인지 fluentd-gem 인지 gem 인지 먼저 확인하세요 td-agent-gem install fluent-plugin-mysqlslowquery설정 # IN..
MySQL Exporter 설치 및 연동 MySQL Exporter 다운로드 # 버전 MySQL >= 5.6. MariaDB >= 10.2 # 유저 없으면 추가, 있으면 접속 useradd -m -s /bin/bash prometheus su - prometheus # 다운로드 wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.13.0/mysqld_exporter-0.13.0.linux-amd64.tar.gz tar zxvf mysql-5.6.51-linux-glibc2.12-x86_64.tar.gz mv mysqld_exporter-0.13.0.linux-amd64/ mysql_exporter exit MySQL 에 권한 추..
프로메테우스 설치 https://prometheus.io/ # 유저 추가 useradd -m -s /bin/bash prometheus su - prometheus # 다운로드 cd /home/prometheus wget https://github.com/prometheus/prometheus/releases/download/v2.28.0/prometheus-2.28.0.linux-amd64.tar.gz tar -xzvf prometheus-2.28.0.linux-amd64.tar.gz # 폴더명 변경 로그아웃 mv prometheus-2.28.0.linux-amd64/ prometheus exit# 시스템 서비스 등록 vi /etc/systemd/system/prometheus.service [Unit..
PHP 연동 PHP 7 이상 (https://github.com/fluent/fluent-logger-php) composer.json 추가 "fluent/logger": "1.0.*" PHP 7 미만 (https://github.com/DQNEO/php-fluent-simplelogger) 오픈소스 라이브러리 설치 샘플 use Fluent\Logger\FluentLogger; defined('BASEPATH') or exit('No direct script access allowed'); function f_log(string $label, array $data) { try { # TODO : Constants setting $logger = new FluentLogger('192.168.10.7', ..
Prometheus 연동 https://github.com/fluent/fluent-plugin-prometheus Prometheus 플러그인은 총 6개를 제공 연동전 설치 CentOS 라 td-agent $ td-agent-gem install fluent-plugin-prometheus 샘플 input plugin 은 promethues 사용해서 server_ip:24231/metrics 를 리스닝 상태로 두고 output plugin은 prometheus_output_monitor 사용해서 10 초마다 promethues 에서 pull 해가도록 한다. @type prometheus bind 0.0.0.0 port 24231 metrics_path /metrics @type prometheus_ou..
Nginx 로그 연동 개요 리눅스 서버에서 nginx의 access log 와 error log 를 수집하려고 한다. 우선, Nginx 는 날짜별로 파일 로그를 생성하고 날짜가 지나면 압축시켜 버린다. 그렇다면 Input 시에는 현재 작성하고 있는 파일에 접근해서 데이터를 수집해야 하기때문에 Input 플러그인은 tail 을 사용할 것이고 tail plugin은 access.log, error.log 를 대상으로 수집을 진행 할것이다. 또, Nginx 폴더에 그룹 권한이 admin으로 되어 있다. fluentd 를 adm 그룹으로 추가해주자. # CentOS 7 $ gpasswd adm -a td-agent 연동 @type tail @label @NGINX_LOG @id NGINX_ACCESS_LOG t..