분류 전체보기 (33) 썸네일형 리스트형 MongoDB Replication MongoDB에서는 높은 가용성과 이중화를 위한 기능입니다. 하나의 Primary와 Primary의 Write를 Replication하는 여러개의 Secondary로 구성되어 있습니다. Primary에 문제가 생길 때 Primary 과반수 선출 기능을 통해 자동으로 Secondary 중 하나를 Primary로 승격시켜서 가용성을 제공합니다. Arbiter 과반수 노드를 만들기 위해 홀수 노드를 배포하는게 부담스럽다면 데이터를 가지고 있지 않고, Primary 선출 기능만 가지고 있는 Arbiter를 사용할 수도 있습니다. Hidden Member 데이터는 replication되지만, client에게 보이지 않는 멤버입니다. 백업 용도로 사용하는게 좋습니다. Delayed Member x시간만큼 이전 데이.. Redis 궁금했던것들 정리 Redis는 왜 빠른가? Redis의 경우 내부적으로 해시 테이블에 key/value를 저장하고 있습니다. 인메모리에서 해시테이블을 사용해 key/value를 사용하기 때문에 매우 빠릅니다. 또, 내부적으로 명령어를 처리할 때는 싱글스레드를 사용하지만, 클라이언트 I/O에는 버전 6부터 멀티스레드를 사용하기 때문에 클라이언트 I/O 처리에서 효율적입니다. 키는 어떻게 관리되는가? Redis에서 데이터를 집어넣을 때 TTL을 줄 수 있습니다. TTL의 경우 만료시간이 지나더라도 바로 만료되지 않고, 아래 정책에 따라서 만료처리가 됩니다. 1. 만료된 키에 접근하면 그 때 삭제 2. 뒷단에서 TTL이 있는 key들을 Redis가 체크하면서 TTL이 지났다면 삭제 따라서, 만료된 키라도 일정시간동안 메모리에 .. 카프카는 어떻게 설계되었는가? 이벤트 스트리밍 플랫폼 카프카 카프카는 이벤트 스트리밍 플랫폼입니다. 이벤트 스트리밍 플랫폼으로써 카프카는 아래와 같은 특징을 가집니다. 이벤트 데이터를 카프카에 쓰고(publish), 읽는(subscribe)것이 가능합니다. 배치성 데이터도 지원합니다. 메시징 시스템 같은 사용케이스를 다루기 위한 낮은 지연시간과 빠른 속도 지원 대용량 이벤트 메시지들을 원하는 만큼 저장 가능 메인 컨셉과 용어 event record 이벤트 레코드는 비지니스에서 어떤 일이 발생했을 때의 값을 가지고 있습니다. 카프카에서는 이벤트 형태로 데이터를 읽고 쓰게 됩니다. 이벤트는 키, 값, 타임스탬프와 기타 메타데이터를 가지고 있습니다. 이벤트 형태 키: "앨리스" 값: "Bob에게 2만원 송금" 타임스탬프: "2020년 7월.. MongoDB WiredTiger 스토리지 엔진 WiredTiger 스토리지 엔진은 3.2버전부터 MongoDB의 기본 스토리지 엔진으로 대부분의 상황에 잘 맞는 스토리지 엔진입니다. 특징 도큐먼트 레벨 동시성 모델 제공 체크포인트 기능 압축 기능 스냅샷과 체크포인트 WiredTiger는 MVCC 모델을 사용합니다. 연산을 시작할 때 WiredTiger에서는 데이터에 대한 그 시점의 스냅샷을 제공합니다. 스냅샷은 데이터가 메모리에서 일관성있게 보이는 것을 보장해줍니다. 그리고 디스크에 쓸 때, 스냅샷에 있는 모든 데이터를 일괄적으로 디스크에 기록하는데, 거기에서 기록된 데이터가 디스크 파일의 새로운 체크포인트로 동작합니다. WiredTiger는 기본적으로 60초마다 스냅샷을 디스크에 기록하고 체크포인트를 새로 생성하는 작업을 진행하고, 새로운 체크포인.. MongoDB 데이터 모델링 (vs MySQL) 저는 3년정도 개발해오면서 MySQL만 사용해봤었는데 회사에서 RDB의 단점에 대해서 많이 느낀게 있었고, NoSQL에 최근에 관심도 생기고 해서, NoSQL 중에서 범용성이 높은 MongoDB의 데이터모델링 쪽을 살펴봤습니다. 물론 저는 MongoDB를 프로덕션에서 써본적이 없고 문서만 읽어보고 몇 가지 상황을 고려해서 데이터 모델링만 해본 상태라 MongoDB를 많이 사용해본 분들의 글이나 문서, 컨퍼런스 영상 같은걸 참고하시는걸 추천드리고 혹시나 글에서 틀린 내용 말씀해주시면 감사드리겠습니다. 정규화 vs 비정규화 (embedded vs reference) MongoDB의 경우 굉장히 유연한 데이터 모델을 가지고 있습니다. MySQL의 경우 데이터를 넣기전에 이미 스키마가 결정되어 있어야 하지만, .. The Log: What every software engineer should know about real-time data's unifying abstraction 번역 (1) 이 글은 카프카를 창시한 사람이 작성한 아래 글을 요약한 글입니다. https://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying The Log: What every software engineer should know about real-time data's unifying abstraction I joined LinkedIn about six years ago at a particularly interesting time. We were just beginning to run up against the limits of our mono.. 메모리릭 해결하기 문제상황 Spring Boot 2.5 -> 2.7 버전으로 업그레이드를 진행한 이후 파드의 메모리가 아주 천천히 늘어나고, 간혹 배포를 일주일정도 안한 서버군 파드에서 OOM kill이 발생하는 현상이 발생했습니다. Grafana 대시보드 내용으로 보았을 때, 힙 메모리가 조금씩 늘어나는 현상이 발생하여서, JVM 에서 발생하는 메모리릭을 의심하였습니다. 쿠버네티스에서 Heap 덤프 뜨는 법 먼저 아주 천천히 진행되는 메모리릭이었기 때문에 전체적으로 문제가 발생할 수 있는 모든 서버군 파드의 메모리를 충분히 늘려주었습니다. 현재 저희 서버에서는 eks 를 사용하고 있고, eks 노드가 충분히 설정되어 있었기 때문에 별다른 설정 변경 없이 파드 메모리만 늘려주었습니다. 그리고 힙덤프를 뜨는 과정은 실서버 .. 데이터팀 전용 DB 생성 및 엔드포인트 분리 문제상황 갑자기 실서버 Replica DB Load가 늘어나는 현상이 발생했습니다. 문제 상황을 인지한 이후 즉시, 아래 쿼리를 이용해서 문제가 되는 쿼리를 찾아 제거하였습니다. 문제의 쿼리를 빠르게 kill하면서 장애 상황은 10분 이내로 해결되었습니다. SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST where time > 10 and info is not null; 원인은 데이터팀에서 날린 쿼리였습니다. 그동안 따로 데이터팀 전용 Replica DB를 사용하지 않았고, 실서버 read DB를 공유해서 사용했기 때문에 데이터팀 전용 DB를 분리하기로 했습니다. 해결 방법 RDS cluster instance를 추가하여 데이터팀 전용 DB를 추가하고, 데이터팀 DB로 접.. g1gc 도입 도입 배경 회사의 여러 서버군들의 jvm 매트릭들을 보는데 모두 parallel gc 를 사용하고 있었고, stop the world 시간이 꽤 길게 나오고 있었습니다. 우선 parallel을 사용하고 있다는 것에 놀랐고, stop the world 기간이 너무 길게 나오고 있어서 놀랐습니다. 실제 서버로 들어가서 jstat으로 살펴본 gc 기록은 아래와 같았습니다. full gc가 평균적으로 3분 30초마다 0.58 초가 걸리고 있었습니다. full gc 주기가 너무 짧고, stop the world 시간이 길었기 때문에 latency에 강점이 있는 g1gc를 테스트 해보기로 결정했습니다. 설정한 g1gc 옵션 g1gc의 튜닝은 max heap size, max pause time 두 가지 설정을 먼저.. 코루틴 커텍스트와 디스패쳐 코루틴은 CoroutineContext 타입의 값 같은 컨텍스트에서 항상 실행되야 합니다. 다양한 elements의 set이고, 중요 element는 코루틴의 Job과 Dispatcher 입니다. 디스패쳐와 스레드 코루틴 컨텍스트는 실행을 위해 코루틴과 상호작용하는 스레드들 중 어떤 스레드를 결정할지에 대한 책임을 가진 코루틴 디스패쳐를 포함하고 있습니다. 코루틴 디스패쳐는 특정 스레드에 실행을 제한시킬 수 있고, 스레드 풀로 결정할 수 있고, 제한 없이 할 수도 있습니다. launch 나 async 같은 코루틴 빌더들은 optional로 CoroutineContext 를 받는데, 이를 통해서 새로운 코루틴의 디스패쳐를 특정해서 실행할 수 있고, 다른 컨텍스트 element 또한 마찬가지입니다. 예제 1.. 이전 1 2 3 4 다음