fragile and resilient

전체 글 38

[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

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

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

카테고리 없음 2022.10.29

[Spring, AOP] 테스트 격리를 위한 MockRestServiceServer 초기화

문제 상황이번 스프린트에서 슬랙 알림을 도입하기로 하여 알림 로직을 구현하였는데요. 기능을 구현하는 데에는 문제가 없었지만, 알림 기능 테스트를 진행하면서 해당 오류를 마주쳤습니다.오류는 MockRestServiceServer에서 발생하고 있었는데, 내용을 살펴보면 예상되지 않은 추가 요청이라는 문구를 확인할 수 있었습니다. 본격적으로 문제를 살펴보기 전에 간단하게 프로젝트 로직에 대해 설명해 드리겠습니다.프로젝트에서는 외부 API와 통신하며 동작하는 기능(Github OAuth, Slack Alarm)이 있는데요. 해당 작업은 RestTemplate를 사용해서 통신하고 있습니다.(RestTemplate은 Spring에서 제공하는 HTTP 통신에 유용하게 쓸 수 있는 템플릿입니다. )MockRestSer..

Spring 2022.10.11

[MySQL] 인덱스 정리

인덱스란? 데이터베이스 테이블의 모든 데이터를 검색해서 원하는 결과를 가지고 오려면 시간이 오래 걸립니다. 따라서 컬럼의 값과 해당 레코드가 저장된 주소를 key-value 형태로 인덱스를 만들어 두는 것입니다. DBMS의 인덱스는 주어진 컬럼의 값을 기준으로 정렬해서 보관합니다. 인덱스는 INSERT, UPDATE, DELETE의 성능을 희생하고, 그 대신 읽기(Select)의 성능을 높이는 기능이다. 새로운 키를 추가하는 과정에서 B-Tree의 리프 노드가 꽉 찼을 경우, 리프 노드가 분리되어야 하는데 해당 작업은 상위 노드들까지 영향을 미치기 때문에 비용이 많이 드는 작업이기 때문입니다. 인덱스는 SELECT 뿐만이 아니라 UPDATE, DELETE를 처리하기 위해 해당 레코드를 검색하는 경우에도 ..

Storage 2022.09.26

[Java] Thread Pool

Thread Pool은 매번 요청이 올 때마다 스레드를 생성하고 수거하는 것이 아닌, 설정한 스레드 수만큼 미리 생성하여 사용하는 것을 말합니다.Thread Pool이 필요한 이유새로운 스레드를 생성할 때마다 스레드를 위한 메모리 영역(스택)을 확보하고, 스레드가 더 이상 필요 없으면 해당 메모리 영역을 회수하는데, 이는 오버헤드가 큰 작업입니다.Executors 클래스의 정적 메서드를 통해 ExecutorService의 구현 객체를 제공받아 스레드 풀을 생성할 수 있습니다.먼저 ThreadPoolExecutor를 설명하기 위해, Thread Pool 종류 중 하나인 newFixedThreadPool() 메서드를 살펴보겠습니다.내부에서 ThreadPoolExecutor 클래스 생성자를 호출하고 있는데요...

Java 2022.09.12

[Java] 스레드 동기화 - Synchronized

얼마 전 팀 프로젝트에서 모집 인원이 초과하였는데도 스터디 참여가 가능한 일이 발생했다.상황에 대한 설명을 덧붙이면 모집 인원이 3명이고, 현재 2명이 참여한 상태에서 동시에 추가로 2명이 참여 버튼을 누를 경우 가입이 성공하여 총 4명이 되는 문제였다.'스터디 참여자 수’라는 공유 자원이 존재하여 동시성 문제라고 생각하여 스터디 참여를 처리하는 메서드에 synchronized 키워드를 붙여주니까 발생하지 않았다. 해당 문제를 팀원들과 인지한 후 동시성 문제에 대한 이야기를 많이 했는데, 현재 방법이 비효율적인 방식일 수도 있으니 해당 방법 이외의 더 좋은 방식으로 풀 수는 없는지 고민하기로 했다. 자바는 스레드 동기화를 지원하는 방법들을 제공하는데, 그중 위에서 언급한 synchronized에 4가지 ..

Java 2022.09.11

[Logging] Logback이란?

로깅이란? 로깅은 시스템이 실행될 때, 시간의 경과에 따라 시스템의 상태 및 동작 정보를 기록하는 것을 말합니다. 로깅이 필요한 이유 애플리케이션에 문제가 발생했을 경우, 문제를 파악하기 위해서는 당시의 동작 및 상태 정보가 필요합니다. 사용자 로그 데이터를 활용할 수 있습니다. SLF4J Logger 추상체로 SLF4J는 logback이나 log4j2와 같은 로깅 프레임워크의 인터페이스의 역할을 한다. Logback 로깅 프레임워크 중 하나로 SLF4J의 구현체이다. Logback 은 log4j 이후에 출시된 Java 기반 Logging Framework 중 하나로 가장 널리 사용되고 있다. Logback 구조 Logback은 logback-core, logback-classic, logback-acc..

정리 2022.08.26