fragile and resilient

전체 글 33

[Elasticsearch] Shard Allocation 은 어떻게 결정될까?

성능 테스트 과정에서 특정 데이터 노드에 샤드가 집중된 것을 발견했습니다. 엘라스틱서치에서는 아래 상황에서 샤드의 배치를 결정하게 됩니다.클러스터에 인덱스를 추가하는 경우Node failure - 클러스터에서 노드가 drop된 경우 해당 노드에 존재하던 샤드들을 재배치클러스터 크기 조정 - 클러스터에 새로운 노드가 추가되거나 제거되는 경우 노드의 디스크 사용량이 전체의 90% 이상을 도달하는 경우샤드를 수동으로 라우팅하는 경우라우팅 관련 설정 업데이트ShardsAllo cator는 샤드 배치를 담당하는 ElasticSearch 인터페이스입니다. 해당 인터페이스의 구현체 BalancedShardsAllocator의 allocate를 보면 1. allocate unassigned shards, 2. move..

Storage 2024.04.10

[JPA] SimpleJpaRepository의 EntityManager는 어디서 생성될까?

JPA를 사용하면 보통 아래와 같이 선언해서 Repository를 사용합니다. interface JpaTestRepository extends JpaRepository, TestRepository {}여기서 JpaRepository 의 구현체인 SimpleJpaRepository 를 살펴보겠습니다. 데이터를 저장할 때 사용하는 save 메서드를 기준으로 보겠습니다.로직을 보니 entityInformation.isNew를 확인하고 true이면 em.persist(entity)를 실행하고, false이면 em.merge(entity)를 실행합니다. (이 로직에 대한 부분은 다른 포스팅에서 다루겠습니다.) 여기서 em을 통해 로직을 수행하는 것을 보니 EntityManager가 굉장히 중요한 역할을 하는 것으..

Spring 2024.02.24

[Spring] @Transactional을 통해 어떻게 트랜잭션이 보장될까?

스프링 기반 프로젝트에서 매우 익숙하게 보실 수 있는 코드일 텐데요. 스프링에서는 @Transactional 만 붙여주면 메서드 로직의 트랜잭션이 보장됩니다. 디버그를 실행하여 JpaRepository를 상속한 MemberRepository 를 살펴보면 프록시라는 것을 알 수 있습니다. 적용된 어드바이스들을 살펴보면 TransactionInterceptor 가 눈에 띕니다. TransactionInterceptor.invoke를 보면 TransactionAspectSupport.invokeWithinTransaction를 호출하고 있는 것을 알 수 있는데요. 이 메서드가 핵심 로직입니다. 중요한 몇 가지 부분만 보겠습니다.341번 라인의 getTransactionAttribute 메서드를 타고 들어가보면..

Spring 2024.02.21

[Elasticsearch] Near real-time search, Refresh

색인 작업 시 세그먼트 동작 방식엘라스틱서치는 내부적으로 Lucene이라는 라이브러리를 통해 검색 기능을 수행한다. 검색 요청이 오면 Segment들이 각각의 검색 결과를 만들고 이를 통합해서 검색 결과를 응답하도록 되어있다.루씬은 색인 작업 시 기존에 생성된 세그먼트에는 정보를 추가하거나 변경하지 않고, 색인 작업을 할 때마다 새로운 세그먼트 파일을 생성한다. 해당 방식으로 동작하는 이유는 Segment의 불변성을 유지해서 검색 성능을 보장하기 위함이다.(새로운 세그먼트가 계속 생성되므로, 루씬은 백그라운드에서 세그먼트 파일을 병합하는 작업을 수행하고 이를 통해 모든 세그먼트들을 물리적으로 하나의 파일로 병합한다.)이미지 출처: 엘라스틱서치 실무 가이드Refresh루씬은 효율적인 색인 작업을 위해 내부..

Storage 2024.02.15

[Elasticsearch] No master is elected

문제 상황성능 테스트 과정에서 master node 의 스펙을 변경하였고, 3개의 마스터 노드중에서 2개를 종료한 뒤 새로운 스펙으로 2대를 띄웠습니다. 해당 과정을 진행 후 도큐먼트 조회 / 업데이트가 안 되었고, 아래 에러가 떴습니다.{  "error" : {    "root_cause" : [      {        "type" : "master_not_discovered_exception",        "reason" : null      }    ],    "type" : "master_not_discovered_exception",    "reason" : null  },  "status" : 503}  원인노드가 추가되거나 제거될 때 Elasticsearch는 새 마스터를 선택합니다. 일..

Storage 2024.02.14

물고기는 존재하지 않는다

주기적으로 보는 책이 있다. 아무 생각 없는 지하철에서, 고민되는 일이 있을 때, 그냥 그저 그런 어느 날.특별한 순간에 생각나는 책은 아니고 그냥 주기적으로 펼치게 되는 책이다. 너무나 매력적이고 소중한 책이다. 이 책을 읽으며 나를 가장 강하게 휘감는 생각은 '나는 내가 제어할 수 없는, 너무나 갑작스럽고 충격적이면서도 혼란스러운 일이 생기면 어떻게 행동하고 있었는가?' 이다. 갑작스럽고 혼란스러운 일.누군가는 큰 충격을 받고 무너질 것이고, 누군가는 이 일을 잊기 위해 더 바쁘게 살아갈 것이고, 누군가는 덤덤하게 받아들이겠지.사람마다 대처는 다르겠지만 변하지 않는 한 가지 사실이 있다.이런 일은 누구에게나 올 수 있고, 온다는 것이다. 나는 이럴 때 어떻게 행동하는 사람이었나?  이 책의 가장 훌륭..

생각 2024.02.12

어느 날의 일기들

2024. 2. 10 어렸을 적 내가 기억하는 이모는 항상 무언가를 열심히 하고 학구열이 강한 사람이었다. 방에는 항상 수많은 책들이 즐비했고, 몇 개의 책들에는 북클립이 꽂혀있었다. 이모와 할머니집 근처에 있는 도서관에 자주 갔었다. 이모는 어디를 갈 때 항상 나를 데리고 나갔다. 나는 이모와 함께 나가는 모든 곳을 좋아했다. 초등학교도 입학하기 전이어서 정확하게 기억나지는 않지만, 이모는 도서관 긴 책상에 앉아서 오랜 시간 공부했다. 나는 그 근처에 영상을 볼 수 있는 컴퓨터가 있는 공간에서 혼자 ‘센과 치히로의 행방불명’을 봤다. 그때 그 도서관에서 영화를 보던 순간들이 이따금씩 생각난다. 내 몸보다 지나치게 크던 책상과 의자. 다른 세계로 이동하는 길목인 푸른 들판에 서있던 치히로의 모습과 햇살이..

생각 2024.02.11

그대들은 어떻게 살 것인가

가끔 마음속에서 요동치는 생각들이 있다. 하지만 어떤 말을 하고 싶은 것인지, 어떤 감정을 느끼고 있는 것인지 표현할 수가 없다.​어린 시절부터 좋아했던 하야오 감독의 를 보고 왔다.난해하다는 리뷰가 많았는데 이런 후기를 보고 사실 속으로 좋아했다. 80세가 넘은 하야오 감독의 은퇴작이 될 수도 있다고 생각했기 때문이다. 단순한 킬링타임용의 작품을 보고 싶지는 않았다. 차라리 정말 난해해서 오랫동안 곱씹고 싶었다.​영화는 예상대로 이해하기 어려웠다. 수많은 생각들이 주렁주렁 얽혀있어 어떤 말을 하고자 하는지 쉽게 이해하기가 어려웠고, 봇물이 터지듯 정제되지 않은 생각들을 쏟아내는 것 같았다.보고 난 후 알 수 없는 생각과 감정들이 뒤섞여 일렁였다. 예전이었다면 난해하고 정리가 안 되어있다고 불만을 토해냈..

생각 2024.02.11

부하 테스트 - 아키텍처 설계 고려사항과 부하테스트

좋은 아키텍처란 무엇인가시스템 아키텍처를 설계할 때는 여러 가지 고려할 사항이 있는데요. 밑에는 좋은 아키텍처를 설계하기 위해 고려해야 할 주요 사항들입니다. 1. 가용성(Availability): 서비스가 정상적으로 동작하는 정도. 2. 성능(Performance): 빠른 응답 시간과 낮은 레이턴시를 위해 최적화된 시스템을 만드는 것이 중요. 3. 확장성(Scalability): 트래픽 규모에 맞추어 잘 확장할 수 있는지. 4. 신뢰성(Reliability): 시스템이 항상 정상적으로 동작하는지. 5. 관리성(Manageability): 시스템을 쉽게 운영할 수 있는지. 6. 비용(Cost): 하드웨어와 소프트웨어 비용, 시스템을 배포하고 관리하는 비용, 교육 비용 등. 시스템 운영에 필요한 모든 비용..

카테고리 없음 2022.10.29

[JPA] Pessimistic Lock 적용

이전에 작성한 스레드 동기화라는 포스팅에서 팀 프로젝트에서 동시성 문제가 발생했다고 기록한 적이 있습니다.당시 상황에 대해 다시 한번 짚고 넘어가면, 모집 인원이 초과하였는데도 스터디 참여가 가능한 일이었습니다.예를 들어 모집 인원이 3명이고 현재 2명이 참여한 상태에서 동시에 추가로 2명이 참여 버튼을 누를 경우, 가입이 성공하여 총 4명이 되는 문제였습니다. 그 당시에는 우선 문제를 빠르게 해결하고 넘어가야 하는 상황이었어서 스터디 참여를 처리하는 메서드에 synchronized 키워드를 붙이고 넘어갔습니다.  문제 상황시작은 백엔드 인프라 아키텍처를 개선하고자 하면서 였습니다. 현재의 구조는 이런 형태인데, 단일 장애 지점(SPOF)이 여러 곳에 있었습니다.따라서 팀 회의를 통해 추후 해당 아키텍처..

Storage 2022.10.17