엘라스틱서치 - 장애 복구 작업 도중 새 인덱스 생성될 때
2023. 10. 4. 10:20
Elasticsearch
추석 연휴 동안 서버 3대중 한대가 죽어서 2대로 테스트 데이터를 받고있었습니다. 오늘 회사 서버를 살려서 연결 해 보니, 새로 생성된 데이터의 샤드가 제대로 분배가 되지 않는것을 파악했습니다. 그 해결책으로 밑에 구문을 보시면 될거같습니다. 장애 대응으로 한참 샤드 복구와 샤드 할당 작업 등이 수행 중인 바쁜 상황에서 새 인덱스가 생성 될 때를 조심해야 한다. 엘라스틱서치에 새 샤드가 할당될 때 엘라스틱서치는 해당 노드에 총 몇개의 샤드가 있는지 체크한 뒤 적은 수의 샤드를 들고 있는 노드에 새 샤드를 할당한다. 문제는 장애 복구 작업 중 방금 재시작된 노드는 샤드 복구가 제대로 끝난 상태가 아니라는 것이다. 이 노드는 겉으로 보기에는 적은 샤드를 들고 있는 것으로 판정된다. 이때 새 인덱스가 생성되면..
스트림 Stream 을 사용하는 이유 - Modern Java in Action
2023. 10. 2. 20:43
Language/Java
자바 8은 데이터베이스 질의 언어에서 표현식을 처리하는 것처럼 병렬 연산을 지원하는 스트림이라는 새로운 API 를 제공한다. 데이터베이스 질의 언어에서 고수준 언어로 원하는 동작을 표현하면, 구현(자바에서는 스트림 라이브러리가 이 역할을 수행) 에서 최적의 저수준 실행 방법을 선택하는 방식으로 동작한다. 즉, 스트림을 이용하면 에러를 자주 일이키며 멀티코어 CPU 를 이용하는 것보다 비용이 훨씬 비싼 키워드 synchronized를 사용하지 않아도 된다. 더보기 멀티코어 CPU의 각 코어는 별도의 캐시(빠른 메모리) 를 포함하고 있다. 락을 사용하면 이러한 캐시가 동기화되어야 하므로 속도가 느린 캐시 일관성 프로토콜 인터코어 통신이 이루어진다. 조금 다른 관점에서 보면 결국 자바8에 추가된 스트림 API..
Modern Java in Action - Reviews(모던 자바 인 액션 - 리뷰)
2023. 10. 2. 20:28
Language/Java
안녕하세요, 늘 부족하고 배움을 갈구하는 2년차 백엔드 개발자 던킨 입니다. 오늘 Modern Java in Action 책을 사고 읽으면서 좋은 내용들이 많아 리뷰를 하려고합니다. 많은 개발자 분들이 이미 이 책에 관련해서 리뷰와 함께 많은 리소스를 공유 해주었다고 해도 과언이 아니지만, 저 또한 이 책에 푹 빠져있는 독자로써 또한, 제 블로그를 찾아오시는분들을 위해 짧게 나마 잘 정리 해서 공유드리고 싶어 리뷰를 시작했습니다. '함수형 프로그래밍은 뭔가요?' - 함수형 프로그래밍은 프로그래밍 기법을 지칭한다. 함수형 프로그래밍에서는 함수를 값으로 취급한다. 자바 8의 놀라운 점은 함수형 프로그래밍의 여러 장점을 친숙한 자바 문법으로 접목했다는 것이다. 훌룡한 자바 8의 설계 덕분에 함수형 프로그래밍을..
엘라스틱서치 - 롤링 리스타트
2023. 10. 1. 17:27
카테고리 없음
ES 운영중에는 롤링 리스타트를 수행할 일이 매우 많다. 동적으로 변경할 수 없는 설정의 적용, 플러그인 설치나 삭제의 적용, 엘라스틱서치의 버전 업그레이드 등 다양한 상황에서 롤링 리스타트가 필요하다. 그리고 무엇보다 장애 상황에서 문제를 일으키고 있는 노드를 재기동하기 위해 많이 수행된다. 롤링 리스타트는 크게 샤드 할당 비활성화, flush 수행, 노드 재기동, 샤드 할당 활성화, green 상태까지 대기 순으로 수행된다. 샤드 할당 비활성화 노드를 재기동하기 위해 엘라스틱서치 프로세스를 종료시키면 클러스터 구성에서 노드가 빠진다. 빠진 노드가 데이터 노드라면 주 샤드를 새로 지정하고 줄어든 복제본 개수를 맞추기 위해 복제본 샤드를 새로 할당해 생성하는 작업이 수행된다. 사실 롤링 리스타트 과정에서..
엘라스틱서치 - 샤드 운영전략
2023. 10. 1. 17:03
Elasticsearch
인덱스의 샤드 개수(number_of_shards) 는 한 번 지정하면 reindex 등의 특별한 작업을 수행하지 않는 한 변경할 수 없다. 그런데 샤드 개수를 어떻게 지정하느냐에 따라 엘라스틱서치 클러스터 전체의 성능이 크게 달라진다. 중요한 설정임에도 불구하고 샤드 개수를 정확히 어떤 값으로 지정하면 되는지 딱 정해주는 알기 쉽고 명확한 기준은 알려진 바가 없다. 이 문제는 굉장히 어려운 문제다. 이번 절에서는 샤드 개수를 어떻게 지정할지 그 전략을 알아보도록 하겠습니다. 샤드 크기와 개수 조정 클러스터에 샤드 숫자가 너무 많아지면 클러스터 성능이 눈에 띄게 떨어지게 됩니다. 샤드 하나당 루씬 인덱스가 하나씩 더 뜨며 힙을 차지 한다. 주 샤드를 하나 더 띄울 때마다 복제본 샤드도 늘어나는 것을 고려..
엘라스틱서치 - 대량 색인이 필요할 때
2023. 10. 1. 15:55
Elasticsearch
서비스 출시를 위한 초기 데이터 세팅이나 마이그레이션, reindex 를 통한 인덱스 재생성 등 대량 색인이 필요할 때가 있습니다. 이런 경우에는 색인 도중 데이터를 조회할 필요가 없다. 따라서 다음과 같은 설정을 통해 색인 속도를 높일 수 있습니다. PUT my_index/_settings { "refresh_interval" : "-1", "number_of_replicas" : 0 } refresh를 끄고 복제본 샤드 개수를 0으로 지정해서 복제본 생성을 중지하는 설정이다. 작업이 끝나면 원래 설정으로 복구하는 것을 잊지 않아야 한다.
엘라스틱서치(Elasticsearch) - 동시성 제어
2023. 9. 19. 16:59
Elasticsearch
개요 Elasticsearch 와 같은 분산형 시스템을 다룰 때 동시성 때문에 문제가 생길수 있습니다. Elasticsearch는 어떻게 동시성 문제를 제어하는지에 대해 알아볼겁니다. 그 이전에 동시성 문제가 무엇인지 알아야합니다. 동시성 제어는 여러 클라이언트나 요청이 동시에 Elasticsearch 클러스터에 접근하거나 쓰기 작업을 수행할 때 데이터 무결성을 유지하고 성능을 최적화하기 위해 사용되는 중요한 개념입니다. 인덱스 동시성 - 여러 클라이언트가 동시에 같은 인덱스에 데이터를 쓰려고 할때, Elasticsearch 는 쓰기 작업을 조정하여 데이터 무결성을 보장합니다. 검색 동시성 - 많은 클라이언트가 동시에 검색을 실행할 때, Elasticsearch 는 검색 요청을 효율적으로 처리하기 위해 ..
기술 면접 질문 모음
2023. 9. 14. 16:29
lecture
운영체제 프로세스 프로세스와 스레드의 차이는 무엇인가요? 교착상태란 무엇이며, 교착상태가 발생하기 위해서는 어떤 조건이 있어야 하나요? 교착상태의 해결법은 무엇인가요? 뮤텍스와 세마포어에 대해서 설명해 보시오. 컨텍스트 스위칭이란 무엇인가요? 경쟁 상태란 무엇인가요? 프로세스 혹은 스레드의 동기화란 무엇인가요? 사용자 수준의 스레드와 커널 수준의 스레드의 차이는 무엇인가요? CPU 스케줄링이란 무엇인가요? CPU 스케줄링 방법에는 대표적으로 어떤 것들이 있나요? 동기와 비동기, 블로킹과 넌블로킹의 차이는 무엇인가요? 메모리 프로세스에 할당되는 메모리의 각 영역에 대해서 설명해 주세요. 메모리 구조의 순서가 어떻게 되는가? CPU에서 가까운 순으로 말해보시오. 페이지와 세그멘테이션에 대해서 설명해 보시오...
엘라스틱서치에서 인덱스 생명주기 (elasticsearch- index_lifeCycle management) 설정
2023. 8. 23. 14:47
Elasticsearch
ES Version : 7.12 kibana : 7.12 요건 : 핫 노드에서 웜 노드로 하루 주기 설정하여 이동 및 read_only 설정했을때와 안했을때의 차이점 현재 핫 노드에서 한달 주기로 저장된 인덱스를 웜 노드로 이동시키고 있습니다. 단지 테스트를 위해서 하루 주기로 변경하였습니다. 대략 한달 된 인덱스 xxxx_2023.08 의 데이터는 하루 대략 2천만건 씩 쌓여서 한달에 대략 6억건 정도가 쌓입니다. 용량으로는 7기가에서 8기가 사이 정도가 됩니다. 요구사항 : 처음 핫웜 아키텍쳐를 도입할때, 고객사에서 한달이 지난 데이터 즉, 웜노드에서도 드물게 읽기 및 검색 외에 업데이트를 원하였습니다. index.lifeCycle management 에서 read_only를 기본설정으로 해놓았기때문..
애플리케이션에서 여러 개의 스레드를 사용하는 이유?
2023. 8. 17. 01:51
lecture/Java 멀티스레딩, 병행성 및 성능 최적화
1) 여러 개의 스레드를 사용하면 동시에 여러 개의 관련 작업을 실행 할 수 있어서, 애플리케이션의 반응성을 향상시킬수 있기 때문입니다. 또한 여러개의 작업을 동시에 실행하여 더 뛰어난 성능을 달성할 수도 있습니다. 2) 하나의 프로레스에 속한 다수의 스레드는 다음 항목을 공유합니다. 힙 코드 프로세스의 열린 파일 프로세스의 메타 데이터 3) 운영 체제는 어떤 방식으로 스케줄링한 스레드를 설계해야하나? 운영 체제는 각 스레드의 대한 동적 우선 순위를 유지하여 인터렉티브 스레드를 우선시하고 시스템의 특정 스레드가 기아 상태 가 되는것을 방지합니다. 이 코드는 어떤 작업을 수행하나요? Thread thread = new Thread(new Runnable() { @Override public void run..