전체 글 648

docker에서 Kafka + zookeeper 클러스터 구성하기

설명 주키퍼와 브로커가 한 서버에 위치하는 구조의 클러스터를 구성해보자. Docker #network - docker container가 서로 통신할 수 있도록 bridge driver형태의 네크워크 생성 sudo docker network create mynetwork #centos docker container 생성 - 일반 centos 이미지를 사용할 경우 systemd command가 정상동작하지 않기 때문에 centos/systemd 이미지를 사용할 것 docker run --privileged -d --name centos1 --network mynetwork -P centos/systemd init docker run --privileged -d --name centos2 --network ..

web/kafka 2021.02.22

도메인 주도 설계 책 리뷰

기본 개념 매우 복잡한 작업을 처리하는 소프트웨어를 만들경우 관심사의 분리가 필요하며, 이로써 격리된 상태에 있는 각 설계 요소에 집중할 수 있다. 대표적인 모델인 Layered Architecture를 통해서 같은 계층의 모든 요소는 오직 같은 계층에 존재하는 다른 요소나 계층상 아래에 위치한 요소에만 의존한다는 매커니즘을 가져야한다. (상위 계층과는 결합도를 느슨하게 유지해야한다.) 다층 구조를 통해서 응집력이 있는 설계가 가능해지며 설계의 이해가 쉬우지고 이는 어너정도 관습화 되어 널리 사용되고 있다. 계층별 설명은 아래와 같다. Presentation Layer : 사용자에게 정보를 보여주고 해석하는 책임을 가진 Layer Application Layer : 실제로 작업하는 코드가 존재하며 도메인..

Book Review 2021.02.14

Lucene의 segment가 immutable한 이유

Elasticsearch의 Document의 수정, 삭제 동작이 발생되었을 때 실제 Document를 구성하고 있는 각 shard 내부 Segment는 바로 지워지지 않는다. 대신 해당 세그먼트가 지워졌다고 mark만 하고 수정되었을 경우에는 새로운 세그먼트를 할당한다. 이렇게 동작하는 이유는 Lucene레벨에서 비용을 아끼기 위해서 사용된다고 알고는 있었는데 정확하게 왜 segment가 immutable한지 알지 못해서 정리해 봤다. 1. 동시성 이슈 우선 개인적으로 생각했을 때는 immutable한 데이터의 경우 수정에 의한 고민을 할 필요가 없기 때문에 multi thread 환경에서 특별한 race condition을 고려할 필요가 없어서 이점이 있다고 생각했다. 우연한 기회에 해당 부분에 대해 ..

Elasticsearch의 Translog 설명

Lucene을 공부하면서 실제 세그먼트를 조작 하고 인덱싱을 반영 하는 부분을 보면서 Lucene에 commit에 대해서 공부했었다. wedul.site/678 Lucene의 commit과 flush의 차이 Lucene에서 데이터 색인을 위해서 사용하는 IndexWriter의 flush와 commit 두 가지 command의 차이를 정리해보자. 두 개의 operation 이름만 보게되면 동일한 동작을 수행할 것 같지만 실질적으로 다른 동작을 wedul.site 그럼 실제로 Elasticsearch에서 이 Lucene commit에 영향을 받는 부분이 어디인지 알아보게 되면서 translog에 대해 공부해봤다. 우선 translog는 양 자체가 워낙 방대하기 때문에 성능을 위해서는 이 부분에 대한 튜닝이 ..

Lucene의 commit과 flush의 차이

Lucene에서 데이터 색인을 위해서 사용하는 IndexWriter의 flush와 commit 두 가지 command의 차이를 정리해보자. 두 개의 operation 이름만 보게되면 동일한 동작을 수행할 것 같지만 실질적으로 다른 동작을 수행한다. 우선 공통적으로 commit과 flush는 둘 다 메모리에 있는 데이터를 디스크에 쓰는 작업을 한다. 하지만 이 부분에 차이점이 있는데 commit은 인덱스를 업데이트하여 디스크에 데이터를 바로 찾을 수 있도록 하는 추가작업을 수행한다. 그래서 만약 lucene IndexWriter에서 flush만 수행하고 commit을 하지 않았다면 해당 인덱스에 대한 변경사항은 검색할 수 없다. 그렇다면 commit을 수행하고 flush를 하지 않는다면 어떻게 될까? 이 ..

Lucene 기본, 색인, 성능 최적화 정리

용어 정리 재현율 검색 시스템에서 관련된 문서를 얼마나 빼먹지 않고 찾아두는지 정확도 검색 시스템에서 사용자가 입력한 검색어와 관련없는 문서를 얼마나 정확하세 제거 하는지 fuzzy 레빈슈타인 편집거리를 통해서 입력한 텀과 유사한 텀을 가진 문서를 찾아줌 비교되는 두 단어의 추가, 수정, 삭제에 대한 비용 처리를 하며 비용이 높을수로 서로 다른 term 검색 모델 순수 boolean 모델 지정된 질의에 문서가 해당하는지 아니면 해당하지 않는지를 판단하며 별도의 계산 부분이 없다. 벡터 공간 모델 질의와 문서 모두 고차원(차원은 term을 의미)의 벡터로 표현. 벡터간의 거리를 계산하면 문서와 질의 사이의 연관도나 유사도를 산출 할 수 있다. 확률모델 확률적인 방법을 통해 개별 문서가 질의와 일치하는 확률..

elasticsearch metric 수집 방법

Elasticsearch metric 정보 수집관련해서 요근래 질문을 받았었다. 처음에는 java application이라면 기본적으로 생각하는 JMX metric을 고려했었으나 그때 당시에 이 community를 보고 직접 aggregation해서 influxdb에 수집하는 방법을 선택했던게 생각난다. (실제로 내 입장에서는 jmx로 metric 정보를 보는게 너무 불편했다.) 또 aggregation할 때 spring actuator micrometer를 사용하려 했으나 이곳에서 모으는 데이터를 정제해서 보고자 하는 데이터 형태로 influxdb에 넣는건 좋지 못한 방법이었다. 그래서 결국 pooling방식으로 얻고자 하는 클러스터에 직접 stats관련된 http api를 요청해서 잘 조립해서 inf..

Spring Webflux url length 제한 413 에러 해결 방법

프로젝트에서 사용되는 특정 api에 request param의 길이가 길어지는 api가 현재 구조상 어쩔 수 없이 존재하게 되었다. 그렇게 조심스럽게 운영하다가 request param의 길이가 너무 길어져서 api에서 413에러를 내뱉으면서 결과를 반환 받지 못하는 문제가 생겼다. 우선 nginx에 있는 request param 길이 관련 설정이 문제를 유발하는지 확인해봤다. 우선 테스트를 위한 api를 하나 만들었다. 단순하게 요청을 받고 바로 반환하는 api package com.wedul.reactivetest; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annot..

web/Spring 2020.12.26

Deview 2020 딥러닝 기술을 이용한 검색시스템 응답시간 예측 세션 리뷰

도입 배경 - 네이버 검색 시스템이 보유하고 있는 검색에 필요한 데이터는 방대하다. - 다양한 호출처로부터 요청이 들어오고 검색어, 검색옵션, 검색방식등에 따라 수백~수천가지의 쿼리 타입이 만들어 질 수 있음 - 이런 수천가지 형태의 검색 요청이 왔을 때 1초라는 타임아웃 시간을 지키기 위해 검색 시간이 오래걸리는 쿼리를 찾기 위해 딥러닝을 사용하여 검색 시간이 오래 걸리는 요청들을 예측했다. 현재 검색 시스템 동작의 원리 검색 시스템 구성에는 여러 단계가 있는데 순서대로 다음과 같이 동작한다. - 문서 데이터 : 검색 대상이 되는 컬렉션 - 색인어 추출 : 컬렉션에 의미 있는 단어를 추출 - 색인 : 검색 대상이 되는 컬렉션에 색인된 색인어로 포스팅 해주는 작업. 이 때 색인어에 매칭된 문서의 횟수를 ..

IT 지식 2020.12.26

[번역] 2-2. Domain 모델 (Enum, UUID, Date, Attribute, Generated Properties)

2.3.7 Enums 매핑 Hibernate는 기본값 유형으로써 다양한 방법으로 Java Enum의 매핑을 지원한다. @Enumrated 기본적인 JPAdml enums의 매핑 방법은 @Enumrated 또는 @MapKeyEnumrated 애노테이션을 통해 javax.persistence.EnumType에 표시된 두 가지 전략 중 하나에 따라 enum 값이 저장된다는 원칙에 따라 동작한다. ORDINAL - java.lang.Enum#ordinal에 기재된대로 Enum 클래스 내에서 Enum값의 순서에 따라 저장된다 STRING - java.lang.Enum#name 방식에 기재에 따라 Enum값의 이름에 따라서 저장된다. 아래 예시로 PhoneType이라는 Enum이 있다고 가정해보자. public e..