728x90
전체 글

전체 글

    QueryDsl에서 delete limit 문법을 사용할 수 없는 이유

    mariadb를 사용하여 서비스 개발 중 delete로 필요한 row를 지울 때 limit을 줘서 지우려고 시도를 했었다. mariadb 문법에서는 정상적으로 동작이 가능한 문법이기 때문에 당연히 제공할거라고 생각했다. 하지만 JPADeleteClause에서는 limit을 찾아볼 수 없어 사용할 수 없었다. http://www.querydsl.com/static/querydsl/4.1.4/apidocs/com/querydsl/jpa/impl/JPADeleteClause.html 그 이유는 jpa의 dialect 때문이었다. target DBMS가 변경되어도 쿼리를 수정할 필요가 없는 장점을 제공해주는 jpa의 dialect 때문에 공통 문법이 아닌 특정 specific한 dbms 문법은 제공하지 못하는 ..

    kotlin 기본 정리

    기본적인 특징 - 자바와 마찬가지로 정적 타입 지정 언어로 컴파일 시 모든 것이 결정된다. - 자바와는 별개로 모든 타입을 직접 명시할 필요 없이 컴파일러가 타입 추론을 통해 자동 추출한다. - nullable type을 제공하여 컴파일 시 npe 발생 여부를 미리 확인 할 수있다. - 코틀린 사용에 있어서 실용성, 간결성, 안전성(casting, npe 이점), 상호 운용성(자바와 호환)등의 장점이 있음. - 컴파일 시 코틀린 런타임 라이브러리에 의존한다. - java의 기본 가시성은 default인것에 반해 코틀린의 기본 가시성은 public이다. - 클래스를 만들지 않고 함수와 변수를 만들 수 있으며 이는 자동으로 컴파일 시 별도의 클래스를 만들도록 해준다. - 최상위 변수(프로퍼티)도 getter..

    kafka cluster replica partition reassignment

    kafka replica kafka는 내장애성을 위해 복제본을 만든다고 한다. 그래서 안정적인 고가용성을 유지하기 위해 일정 수준의 replica partition이 살아있지 않은 경우 ISR(In-Sync Replica)이 복구 될 때까지 데이터를 쓸 수가 없는 상태가 된다. 만약 replica partition이 있는 broker가 down 될 경우에 새로운 broker를 클러스터에 추가하게 되면 broker와 함께 죽어버린 replica partition이 자동으로 assign 되면서 생성될까? 확인 결과 그렇지 않다고 한다. 하둡이나 ES처럼 자동으로 새로운 노드, broker가 붙는다고 해서 auto assign을 하지 않는다고 한다. (엄청 불편하군) 그럼 실제로 broker가 죽었다고 생각하..

    Kafka cluster에서 topic 지우기

    카프카 토픽을 지우기 위해 kafka-topic command를 사용해서 시도했다. [root@f6ed7547e36f /]# kafka-topics --delete --zookeeper centos1:2181,centos2:2181,centos3:2181 --topic wedul Topic wedul is marked for deletion. Note: This will have no impact if delete.topic.enable is not set to true. for deletion을 위함 marked가 되었다는 내용가 delete.topic.enable을 true로 하지 않으면 실제 효과가 없다는 알림을 받았다. 이에 /etc/kafka/server.properties에 있는 delete...

    Kafka Connect 정리

    Kafka Connect - kafka에서 외부로 데이터로 출력을 하거나 kafka로 데이터를 입력하도록 도와주는 도구 - kafka connect는 kafka connect와 플러그인 형태로 되어 있으며 데이터를 producer를 통해 넣는 부분을 source라고 하고 consumer 쪽으로 보내는 곳을 sink라고 한다. - 공개된 플러그인이 있으며 sink, source 양쪽 모두 공개된 플러그인만 사용하는게 좋다. (신뢰도가 떨어지는 플러그인은 버그가..) - kafka connect는 브로커와 동일한 서버에서 동작할 수 있기 때문에 kafka 클러스터와 kafka connect 클러스터를 함께 구성도 가능 - kafka connect 클러스터에 source, sinke의 플러그인으로 데이터를 입..

    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 ..

    도메인 주도 설계 책 리뷰

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

    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를 하지 않는다면 어떻게 될까? 이 ..

반응형