분류 전체보기 308

Zookeeper 구성에 관한 팁

[zookeeper 홀수개를 권장하는 이유] 클러스터를 구성할 때 적절한 노드 수: (n/2+1) → 5개의 노드로 zookeeper quorum을 구성하고자 한다면, (5/2+1) = 3개의 노드가 quorum으로 구성되어야 한다. 아래가 예제 만약 quorum 크기가 2라고 가정한 상태에서.. 두 DC간 단절상황인 Split Brain이 발생한다면 각 DC에서는 각자 자신들이 Primary라고 인식하게 되서 중복으로 서비스가 실행되게된다. 이후에 장애가 복구되었을 때 정상적인 운영이 불가해지는 상태에 빠질 수 있다고 한다. 즉 Split Brain을 방지하기 위해 (n/2+1) = 3개를 quorum으로 구성할 필요가 있다. 참조: https://paulsmooth.tistory.com/156 [zo..

Kafka 2022.11.02

Schema-Registry Compatibility

목차 [Compatibility] 호환성은 Schema Evolution이 발생할 때 어떻게 변화할 수 있는가에 대한 것이다. 기본적으로 3가지 전략이 있다. Backward Forward Full Backward Compatibility Consumer V2가 V1을 문제없이 처리가능한 호환성. Consumer 업데이트 → Producer 업데이트 순서로 배포해야한다. 필드추가 (기본값이 있을 때 가능) Consumer가 V2일 때 V1을 처리할 수 있다. #V1 { "Name": "String", "Age": "Int" } #V2 { "Name": "String", "Age": "Int", "Sex": "Char" (Default: M) } 필드 삭제 가능. Consumer가 V2일 때 V1을 문제없..

Schema-Registry + Validation

목차 [Schema-Validation] Confluent 5.4 버전부터 지원하는 기능으로 Kafka에 등록된 토픽이 유효한 Schema Registry ID를 갖고 있는지 확인 할 수 있다. 이를 통해 중앙 집중식 토픽 정책 적용을 하기위한 기반을 마련할 수 있게 되었다. 아래처럼 validation = true로 지정하여 검증할 수 있다. 중앙 집중화된 데이터 거버넌스가 중요한 이유 데이터 거버넌스는 한 기업의 데이터를 공식적이고 적절하게 관리하여 책임성과 전송성을 확보할 수 있도록 한다. 즉, 조직끼리 데이터의 생성, 전송, 해석 등이 동일하게 관리될 수 있다. 이벤트 스트리밍에서는 아래와 같은 뉘앙스를 가질 수 있다. 모든 사람이 이해할 수 있는 하나의 구조를 가질 수 있게 된다. P2 메시지 ..

Schema-Registry : Producer

목차 [주요 Configuration] #schema-registry url spring.kafka.producer.properties.schema.registry.url: http;://localhost:8081 # schema 자동등록 여부 (default: true. 운영에서는 false 권고) spring.kafka.producer.properties.auto.register.schemas: false # 최신버전의 schema만 사용할지 여부 (default: false) spring.kafka.producer.properties.use.latest.version: false # key-serializer spring.kafka.producer.properties.key-serializer: o..

Schema-Registry?

목차 [Overview] Schema Registry는 메타데이터에 대한 서비스를 제공한다. Schema Registry는 Avro, JSON, Protobuf 스키마를 저장하고 검색할 수 있는 RESTful 인터페이스를 제공한다. 특화된 subject name strategy를 기반으로 모든 스키마의 버전을 기록하고, 다양한 compatibility 세팅과 정의된 compatibility를 바탕으로 schema evolution을 허용한다. Schema Registry는 Kafka Broker와는 분리되어 있다. Producer와 Conumer는 메시지를 쓰기위해 여전히 Kafka와 통신하게 된다. 이와 동시에 Schema Registry와 통신하여 메시지의 데이터 모델을 describe하는 스키마를 ..

로컬에 ELK 환경 구성해보기

[Elasticsearch 설치] https://velog.io/@qnfmtm666/elasticsearch-Elasticsearch-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-Ubuntu-20.04 [🌎elasticsearch] Elasticsearch 설치하기 (Ubuntu 20.04) Elasticsearch 가이드북 ✈Elasticsearch 홈페이지 가기 ✈다음과 같은 사항이 필요합니다.Ubuntu 20.04 버전이 깔려 있는 OS듀얼코어 이상의 cpu 와 4gb 이상의 램 원활한 실행을 위해 필요하며 필수는 아닙 velog.io [Kibana 설치] https://www.elastic.co/guide/kr/kibana/current/deb.html Debian 패키지로 ..

Elasticsearch 2022.10.30

Elasticsearch 시스템 구성 가이드

Last but not least, choosing the filesystem is a critical part of designing an Elasticsearch cluster. With small datasets on your disks, Ext4 is a fast, reliable option that does not need tuning. If you plan to store lots of indexes and more than 1TB of data per node, prefer a well tuned XFS for better performances. 마지막으로, 파일 시스템을 선택하는 것은 Elasticsearch 클러스터를 설계하는 데 있어 매우 중요한 부분입니다. Disk에 작은 데이터 ..

Elasticsearch 2022.10.30

JPA?

JPA: 인터페이스 Hibernate: JPA인터페이스의 구현체. [JPA Components] EntityManager JPA 인터페이스의 일부로 자바 객체 ("@Entity")를 DB에 저장된 데이터와 맵핑 해주는 ORM 기술을 정의한 인터페이스 "@Entity" 어노테이션을 달고 있는 Entity 객체들을 관리하며 실제 DB테이블과 맵핑하여 데이터를 조회/수정/저장 하는 기능을 수행한다. PersistenceContext라는 논리적인 영역을 두어 내부적으로 Entity의 생애주기를 관리한다. Entity의 생애주기 New 처음 생성되어 아직 EntityManager의 관리를 받지 않는 상태. 즉 순수한 자바 객체 상태라고 보면 된다. Managed EntityManager에 의해 관리되고 있는 단계..

Java/JPA 2022.10.30

Annotation 정리

[AutoConfigurationBefore] Target.class 전에 어노테이션이 선언된 Class를 진행한다. [ConditionalOnProperty] Spring 기반 Application에서는 구성 속성의 존재와 값에따라 조건부로 빈을 생성해야 하는 케이스가 있다. ex) 속성 값을 "prod" 혹은 "test"로 설정했는지 여부에 따라 운영이나 테스트 데이터베이스를 가리키도록 Datasource 빈을 등록할 수 있다. 이럴때 사용하는 케이스 ConditionalOnProperty 어노테이션을 사용하면 구성 속성의 존재여부에 따라 조건부로 빈을 등록할수 있게 되는 것

Bean 생성

BeanDefinitionRegistryPostProcessor Spring에서 Bean을 동적으로 생성하는 방법 중 하나. 스프링에서는 보통 정적으로 Bean을 생성한다. 근데 DcmDatasource 같은 경우는 properties파일을 읽어다가 여러 개의 DcmDataSource Bean을 생성해야 한다. (configuration에서 dcm properties수가 몇개가 될 지 모르는 상황) 결국 동적으로 Bean을 생성해줘야하는 상황이다. 이럴 때 사용할 수 있다. ex) configuration에 언급된 에이전트 개수 (DB A서버,DB B서버..) 만큼 datasource를 만들어야 하는 상황 샘플코드 BeanDefinitionRegistryPostProcessor를 사용하기 위해서는 인터페..

Auto Configuration

[Auto Configuration?] AutoConfiguration을 알아보기 전에 "@SpringBootApplication"을 먼저 알아본다. "@SpringBootApplication"은 3가지 어노테이션을 합친것 "@SpringBootConfiguration": "@Configuration"과 같은 기능을 한다. "@EnableAutoConfiguration": "/reousrce/META-INF/spring.factories중 EnableAutoConfiguration에 정의된 Configuration들을 자동으로 빈등록한다. "@ComponentScan": 컴포넌트 어노테이션을 모두 스캔해서 빈으로 등록 이 때 ComponentScan이 먼저 일어난 후 AutoConfiguration의 B..

Fluentd vs Logstash 비교해보기..?

로그를 수집하고 분석할 때 ELK Stack은 매우 유용하게 사용되어 왔다. fluentd는 Docker나 kubernetes 환경과 같은 마이크로 서비스의 로깅에 인기를 끌고 있다. (fluentd가 CNCF의 일부이고, Treasure Data (고객데이터플랫폼 구축 클라우드 서비스?) 를 기반으로 구축되었기 때문) 어떤 사례에 어떤 도구를 사용하는 것이 좋을지 비교해본다. [Logstash vs Fluentd 비교] 항목 Logstash Fluentd 비고 코드 언어 JRuby (Java 필요) CRuby (Java 필요 X) 오픈 소스 Apache 2.0 라이센스 오픈소스 Apache 2.0 라이센스 오픈 소스. CNCF. 이벤트 라우팅 if-else 조건 기반 태그 기반 이벤트에 태그를 지정하는..

Fluentd - Kafka 로컬 파이프라인 구축해보기

fluentd를 통한 데이터 파이프라인 구축을 위해서 로컬환경에서 fluentd - kafka로 이어지는 파이프라인을 구축해본다. [Docker Container로 간단히 구동하기] Docker-Image Pull docker pull fluent/fluentd:edge-debian Fluentd 설정 파일 생성 http input을 stdout으로 출력하는 형식으로 테스트한다. $ sudo vim fluentd.conf @type http port 9880 bind 0.0.0.0 @type stdout Docker Run # RUN $ sudo docker run -d --name fluentd -p 9880:9880 -v $(pwd):/fluentd/etc fluent/fluentd:edge-debi..

Fluentd란?

[Fluentd?] 로그 수집기 (보통 로그 수집의 목적으로 사용하나 다양한 데이터 소스로부터 데이터를 받아 처리할 수 있음) C와 Ruby로 개발됨. fluentd로 전달된 데이터는 tag, time, record (JSON)으로 구성된 이벤트로 처리됨. 원하는 형태로 가공 후 다양한 목적지 (ES, Kafka etc..)로 전달 될 수 있음. Filter, Buffer, Parser를 직접 설정할 수 있는 것이 가장 큰 장점 데이터 유실을 막기 위해 메모리와 파일 기반의 버퍼 시스템을 사용. Failover를 위한 HA구성도 가능. Use-Cases Application Log 수집 mongodb와 같은 DB에 데이터 수집 스트림 데이터 처리 Tag fluentd에서는 Tag를 통해 이벤트가 흘러가면..

Streaming?

[Why Streaming?] 데이터를 처리하는 역사를 따라가보면 Data Warehouse - Batching - Streaming 순으로 발전해왔다. Data Warehouse 클라우드 이전 시절에는 Data Warehouse만을 사용하였고, 이 공간 자체는 한정적이지 엄격한 schema를 기반으로 분석을 위한 데이터만 추출하여 저장하는 방식으로 사용하였다. 그리고 데이터를 실제로 사용하는 시점은 데이터가 모두 이관된 이후 BI툴을 이용한 접근만이 가능하였다. Batch 하둡의 Batch 시스템이 나오고나서 다양한 schema를 사용할 수 있었지만 여전히 배치가 끝난 후 데이터에 접근할 수 있었다. Streaming 다양한 schema 뿐만 아니라 Ingestion (데이터를 빼오는 시점)에 바로 데..

Source, Sink별 Connector 정리

개인적으로 생각하는 Source, Sink별 사용할 만한 Connector를 정리해봄. Source Sink 용도 Tool 비고 참조 Kafka Kafka 기존 토픽 메시지 가공 후 새로운 토픽 생성 Ksql, Flink 스트림 처리 Kafka Elasticsearch 데이터 이관 logstash kafka input: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-kafka.html output: https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html Kafka Mongodb 데이터 이관 logstash mongodb input은 없음. ka..

Apache Flink란?

[Apache Flink?] 분산 스트림 처리를 하는 엔진으로 "unbounded", "bounded" 데이터에 대해 상태가 있는 (stateful) 스트림 처리를 하는데 적합한 프레임 워크 비슷한 프레임워크들 중에 Spark, Kafka Streams, Storm 등이 있음 Spark: 마이크로 배치 Kafka Streams: Data Source로 Kafka만 지원함. Storm: Exactly Once 처리를 지원하지 않음. [Unbounded(무한한)와 Bounded(경계있는) 데이터의 처리 ] 모든 종류의 데이터는 이벤트 스트림으로 생성될 수 있다. ex) 카드거래, 센서측정, 로그, 웹 사이트의 사용자 행동 이러한 데이터는 Unbounded 혹은 Bounded 스트림으로 처리될 수 있다. Un..