String 숫자넣으면 incre decre 기능 사용 가능 활용사례 : 좋아요 수 증감처리 mset mget으로 한번에 여러 키/벨류 삽입 조회 가능 List 링크드리스트 자료구조 인덱스 조회 불가, 데이터 넣고빼기 용이 파이썬 deque와 비슷한 느낌? Set 활용사례 : 이벤트 쿠폰 발급하고 중복사용 막기. 사용한 유저id를 셋에 삽입 Hash 벨류가 오브젝트 처럼 여러 필드를 갖고있음 기존 스트링에 json으로 보관하는 것 과의 차이점 : 특정 필드에 따로 접근 가능 각 필드에 접근하여 incre decre도 가능 : 특정 숫자 증가 가능 (string inc와의 차이점) SortedSet Set의 필드에 score값이 포함되어있음 활용사례 : 게임 랭킹 시스템 Bitmap 비트벡터로 아루어짐 활..
BSON(Binary JSON) JSON과 유사한 문서를 바이너리 형태로 인코딩한 데이터 포맷 날짜 타입, BinData 타입 등 JSON보다 많은 타입을 지원 Protocol Buffer, Thrift와 같은 바이너리 교환 형식(Binary Interchange Format) BSON은 Protocol Buffer 대비 schema-less 하여 유연하다는 장점이 있지만, 직렬화된 데이터의 필드명에 대한 오버헤드가 있어 공간 효율성 면에서 약간의 단점이 있다 특징 가볍다 쉬운 데이터 순회 (Traversable) 타입과 길이 정보를 인코딩하여 순회를 빠르게 할 수 있다 효율적이다 문서 맨 앞에 길이 정보를 포함하고 있어 빠르게 스캔 및 쿼리 가능 C언어의 데이터 타입을 사용하기 때문에 대부분의 프로그래..
Schema Design Pattern 데이터 모델링 시 자주 나타나는 과제들을 해결하기 위한 방법들을 비슷한 특징끼리 묶어 정리한 것 디자인 패턴의 데이터 모델링 버전이라고 볼 수 있다 소프트웨어 개발 방법에서 사용되는 디자인 패턴은 프로그램 개발에서 자주 나타나는 과제를 해결하기 위한 방법 중 하나로, 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이름을 붙여, 이후에 재이용하기 좋은 형태로 특정의 규약을 묶어서 정리한 것이다. 알고리즘과 같이 프로그램 코드로 바로 변환될 수 있는 형태는 아니지만, 특정한 상황에서 구조적인 문제를 해결하는 방식을 설명해 준다. - 위키피디아 사실 MongoDB만을 위한 패턴은 아니다. 다만 유연한 스키마를 가진 MongoDB에서 사용하기에 효과적이다..
Ranged Sharding 샤드키의 값을 기준으로 청크에 분산 연속된 숫자들이 같은 샤드와 같은 청크에 존재함 데이터의 값으로 정확히 어떤 샤드에 존재하는지 알기 때문에 데이터가 존재하는 샤드에만 쿼리를 요청하는 Target Query가 가능 단점 : 데이터가 균형있게 분산되지 않을 가능성이 높다 usage 타겟쿼리가 필수일 경우 hash shrading을 이용하지 못하는 경우 Hash Sharding 샤드키의 값의 해시값을 기준으로 분산 균등 분산 카디널리티가 낮으면 부하편중을 완전히 막을 순 없음 샤디드 클러스터의 목적이 분산이므로 균등분산이 잘되는 해시샤딩을 대부분 사용 주의할 점 데이터가 연속되어있지 않고 분산되어있으므로 모든 샤드에 다 요청해서 데이터를 가져온 후 필터링 해야 할 수도 있음 →..
Sharded Cluster MongoDB의 분산 솔루션 Replica Set에 더 이상 감당 안될 정도로 데이터가 유입되면 Sharded Cluster 사용 고려 모든 샤드는 Replica Set으로 구성되어 있다 분산을 위한 솔루션이지만 Replica Set 구성이기 때문에 HA도 지원 Replica Set의 목적 : HA 샤딩의 목적 : 스케일아웃 대량으로 늘어나는 데이터를 저장하고 쓰기에 대한 부하가 클 때 적합 Replica Set은 secondary를 늘리면서 읽기 부하를 분산할 수 있지만 primary는 하나이기 때문에 쓰기 분산이 커지면 sharded cluster를 사용하는 것이 좋다 용어 Sharding : 하나의 큰 데이터를 여러 장비에 걸쳐서 분할하는 과정 Shard : 분할된 데이..
Replica Set은 HA(High Availability)를 보장해 주기 때문에 내부적으로 아키텍처가 복잡해지는 트레이드오프가 있음 이로 인해 우리가 꼭 알아야 하는 것들이 생긴다 개발자 입장에서 Replication에 대한 이해가 있어야 Replica Set을 이용한 몽고디비를 잘 활용할 수 있다 Replica Set 3대의 MongoDB 멤버 이루어진 구조 1Primary, 2 Secondary HA(High Availability)에 대한 해결방안 멈춤 없이 지속적 운영이 필요한 서비스에서 필요한 최소 배포 단위 각 멤버는 같은 서버에 존재할 수도, 다른 서버에 존재할 수도 있다 replica set의 목적이 HA이기 때문에 각각 다른 서버에 설치되어 있어야 목적에 맞는 효과를 볼 수 있다 각 ..
구글링 해보면 보통 Clustered Index라고 많이 하는 것 같은데, 필자가 참고한 Real MySQL 8.0 책에서는 클러스터링 인덱스라고 언급하여 여기서도 일단 클러스터링 인덱스라고 표기하겠다. PK값이 비슷한 레코드끼리 묶어서 저장하는 것 PK값에 의해 레코드의 저장 위치가 정해짐 PK값 변경 시 해당 레코드의 물리적인 저장 위치도 변경됨 클러스터링 인덱스는 InnoDB 스토리지 엔진에서만 지원 인덱싱 알고리즘이라기보단 테이블 레코드의 저장 방식이라 볼 수 있어 ‘클러스터링 테이블’이라고도 불림 세컨더리 인덱스의 리프 노드에 PK가 있는 것 과 달리, 클러스터링 인덱스의 리프노드에는 레코드의 모든 컬럼이 (=해당 식별자의 모든 데이터) 같이 저장되어있음 → 즉, 클러스터링 테이블은 그 자체가 ..
대표적인 인덱스 알고리즘 : B-Tree vs Hash Hash 인덱스 알고리즘 컬럼의 값으로 Hash값을 계산하여 인덱싱 → 그래서 전방(prefix)일치 등 값의 일부만 검색하거나 범위 검색 시엔 사용할 수 없음 매우 빠른 검색을 지원 메모리 기반 데이터베이스에서 주로 사용 B-Tree 인덱스 알고리즘 가장 일반적으로 사용되는 알고리즘 Hash와 달리 컬럼의 값을 변형하지 않고 원래의 값을 사용하여 인덱싱 B-Tree 인덱스의 구조 Root, Branch, Leaf 노드로 이루어져있음 루트 노드 : 최상위노드. 자식 노드 주소를 가지고있음 브랜치 노드 : 루트와 리프 사이의 중간 노드. 자식 노드 주소를 가지고 있음 리프 노드 : InnoDB와 MyISAM의 인덱스 리프노드가 갖는 값이 다름 MyIS..
업무 중 트랜젝션 내에서 특정 테이블에 insert 한 데이터를 바로 다시 select 하는 비즈니스 로직을 작성하였는데, 이 조회 반환 값이 null이 되는 문제를 마주하게 되었다. 읽기 작업과 쓰기 작업의 DB 커넥션을 분리해서 사용하고 있었고, 커밋되지 않은 데이터였기 때문에 읽기용 커넥션에서 새로 추가한 데이터를 읽어올 수가 없었다. insert를 하는 커넥션과 동일한 커넥션에서 조회하도록 하여 문제는 해결하였지만, 문제의 원인이 궁금해졌다. (현재 MySQL InnoDB 스토리지 엔진을 사용 중이다.) 데이터 정합성 (Consistency) 데이터가 서로 모순 없이 일관되게 일치해야 함을 의미한다. 예를 들어, 상품 테이블에서 상품번호 1의 이름은 ‘도넛’인데, 주문 테이블에서 상품번호 1의 이..
‘ABCD’를 INSERT 할 경우 CHAR CHAR : 저장공간의 크기가 고정적이다. CHAR(10) 컬럼에 ‘ABCD’를 insert 할 경우, 6바이트가 남아있다. VARCHAR VARCHAR : 저장되는 값에 따라 저장공간이 변한다. 해당 값의 길이를 별도로 저장할 1~2바이트를 추가로 필요로 한다. VARCHAR(10) 컬럼에 ‘ABCD’를 insert 할 경우, 길이를 나타내는 숫자 4를 위한 1바이트와, ‘ABCD’를 저장하기 위한 4바이트, 총 5바이트의 저장공간이 생긴다. ‘ABCD’→’ABCDE’로 UPDATE 할 경우 CHAR(10) : 이미 10바이트가 준비되어 있으므로 그냥 변경되는 컬럼의 값을 업데이트 VARCHAR(10) : 현재 4바이트밖에 저장할 수 없는 구조이므로 더 큰 ..
- Total
- Today
- Yesterday
- database
- NoSQL
- laravel 테스트코드
- pods
- docker
- 라라벨
- php
- 주니어개발자
- java
- Apache POI
- 도커
- 몽고디비
- 백엔드
- mockery
- redis
- k8s
- kubernetes
- 샤딩
- 분산처리
- 쿠버네티스
- index
- mongoDB
- springboot
- phpUnit
- 리눅스 컨테이너
- laravel
- 샤드
- MySQL
- 대규모 데이터 처리
- laravel 테스트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |