주노 / 페이팔 디비 / 대규모 / 처리 / 대용량 처리 디비
JunoDB 의 overview
paypal 에서 자신들이 사용하던 NoSQL DB 를 open source 로 공개했다.
여기선 ref.1 의 내용을 정리한다.
- 사실상 paypal 의 모든 core back-end service 가 JunoDB에 의존하다.
- JunoDB 를 이용해서, application 들은 data 를 효과적으로 저장하고, cache 를 해서 RDS 와 다른 서비스들에 대한 빠른 access 와 부하를 줄일 수 있다.
- 단일 스레드 C++ 프로그램으로 시작
- 이후 동시성이 높고 멀티코어 친화적인 Golang으로 재작성
- 인메모리의 짧은 TTL(Time To Live) 데이터 저장소
--> 에서 긴 TTL을 지원하는 영구 데이터 저장소로 발전 - 온디스크 암호화와 전송 중 TLS를 통해 향상된 데이터 보안을 제공
- 데이터 재분배(data redistribution)를 통한 빠른 확장(quick scaling)
- 현재, 시스템 가용성이 99.999%에 달하는 JunoDB
- 매일 3,500억 건의 요청을 처리.(평균 초당 40,510건)
Juno DB 사용하는 경우
- 캐싱
- Idempotency 로 사용 : 여러 요청이 와도 오직 하나의 동작만 하도록
- counter : 특정 자원의 한도를 정하고 사용할 수 있게 해준다.
- SoR(System of Record, 기록시스템) : 영구적인 기록은 아니지만, 몇년정도의 장기적인 기록을 위해 사용한다.
- latency bridging
- JunoDB의 빠른 클러스터간 복제(replication)는, Oracle 처리중의 복제 지연들 해결해준다.
- 그래서 거의즉시(near-instant)적으로 모든 곳에서 일관된 읽기를 가능하게 해준다.
- latency bridging 기술은 “계정/사용자 생성 과 결제 처리를 위한 멀티 데이터 센터 active-active processing” 에서 사용돼서 높은 가용성, 신뢰성, 읽기확정성(read sacling)을 보장해 준다.
JunoDB Architecture: A High-Level Overview
JunoDB 는 매끄럽게 함께 작동하는 3개의 중요 component들로 구성돼 있다.
- JunoDB client library : 이것은 DB를 사용하는 Client 쪽에서 사용하는 library
- JunoDB proxy :
- JunoDB proxy instance들은 load balancer 에 의해 제어된다.
- client 의 request들과 다른 site들로 부터의 replication traffic 을 받는다.
- 각각의 proxy 는 모든 JunoDB storage server instance들에게 연결되고,
- 각 request 를 storage server instance들의 group 으로 전달한다.
- 이 group은 shard mapping 을 기반으로 만들어져 있다.
- ETCD에서 유지된다. 이 ETCD는 JunoDB cluster 설정(configurations)들을 저장하는 data store 다.
- JunoDB storage server
- JunoDB storage server instance들은 proxy 로 부터 오는 작업 요청들을 수락하고 RocksDB 를 이용해서 memory 또는 영구 저장소(persistent storage)에 data 를 저장한다. 각 storage server instance 는 shard들의 집합을 담당해서 원활하고, 효과적인 data 저장과 관리를 보장한다.
Scalability 달성
PayPal 은 십수년전에 지속적인 빠른 고객 및 결제 건수의 성장을 지원하기 위해, application layer 에서 horizontally scale 되는 마이크로서비스들의 구조로 변경했다. 그래서 키-값 저장소로 지속적으로 인바운드 연결 수가 증가했다.
필요한 규모를 처리하기 위한 상용 또는 오픈 소스 솔루션이 제공되지 않았기 때문에, 직접만들었다.
분산 key-value store들에서 2가지 주요한 scaling 요구를 처리한다.
- 성장하는 클라이언트 연결 수를 수용하여, 원활한 액세스와 시스템 응답성을 보장합니다.
- 데이터 양과 액세스 속도가 증가함에 따라 데이터 증가을 처리하고 효율적인 읽기 및 쓰기 처리량(throughput)을 보장한다.
Scaling for Client Connections
- 가로 연결 확장을 용이하게 하기 위해 proxy 기반 아키텍처가 선택되었다.
- 이 구성에서 클라이언트는 가벼워서 모든 저장 노드와 연결을 설정할 필요가 없다.
- 클라이언트 연결이 한도에 도달하는 경우, 추가적인 프록시를 간단히 추가할 수 있다.
- 이 방법은 약간의 지연을 초래할 수는 있지만, 확장성에 매우 효과적인 해결책을 제공한다.
데이터 크기에 대한 Scaling 과 Access 처리량
- 데이터 크기가 커짐에 따라, 효율적인 저장 및 검색을 보장하기 위해 ‘데이터 파티셔닝’ 방식을 통해 데이터를 여러 storage nodes 또는 servers에 분산하는 것이 필수적이다.
- JunoDB는 일관된 해싱을 활용하여 고정된 파티션(샤드)을 효과적으로 분할하며, 이러한 샤드는 샤드 맵을 사용하여 물리적인 저장 노드에 할당된다.
- 클러스터 내 노드 수가 ‘추가’ 또는 ’제거’로 인해 변경될 때는 오직 적은 수의 샤드만 다른 저장 노드로 재할당되어야 한다. 또한, 각 샤드 내에, 마이크로 샤드(micro-shard)를 도입했다. 이 micro-shard는 데이터 재분배의 기본 구성 요소로 작용한다.
- 전체 샤드 수는 충분히 크고 클러스터의 수명 동안 일정하게 유지되어야만 한다.
- 실무에서는 일반적으로 1,024개의 샤드를 사용한다. 샤드 맵은 사전에 생성되어 ETCD에 저장된다.
- 샤드 맵의 변경은 데이터 재분배 처리(data redistribution process)를 일으킨다.
- 우리의 효율적인 데이터 재분배 과정은 JunoDB 클러스터를 빠르게 점진적으로 확장하여 트래픽 성장에 대응할 수 있게 한다.
- 현재, 대규모 JunoDB 클러스터는 200개 이상의 저장 노드로 구성될 수 있다. 이것은 하루에 1000억 건 이상의 요청을 처리한다.
고가용성 (Ensuring Availability)
- JunoDB storage node들은 논리적인 grid 로 구성된다.
- 각 열(column)은 zone이고, 각행(row)은 storage group 이다.
- 데이터는 shard로 partitioned되고 storage group에 할당된다.
- 저장 그룹 내에서 각 샤드는 quorum protocol 에 기반해서 다양한 zone으로 동기적으로(synchronously) replicated 된다.
quorum protocol 은 저장 그룹 내에서 값에 대한 합의(consensus)를 도출하기 위해 사용한다. 데이터 일관성을 보장하기 위해 다음 2가지 rule을 준수해야 한다.
quorum protocol :
- read quorum(R)과 write quorum(W)의 합이 존의 수(N)보다 커야 합니다: W+R > N.
- 이는 read quorum이 데이터의 가장 최신 버전을 포함하는 노드를 적어도 하나 이상 포함하도록 보장합니다.
- write quorum은 존(zone) 수의 절반보다 많아야 합니다: W > N/2.
- 이는 동시에 두 개의 쓰기 작업이 동일한 키에 대해 수행되는 것을 방지합니다. 일반적으로 PayPal은 5개 zone, read quorum 3, write quorum 3의 구성을 사용합니다.
노드 오작동이 발생하는 경우, JunoDB의 장애 조치 프로세스는 자동적이고 즉각적으로 이루어지므로 리더를 다시 선출하거나 데이터를 재분배할 필요가 없습니다.
프록시는 연결이 끊기거나 읽기 시간 초과를 통해 노드 장애를 감지할 수 있으며, 일반적으로 읽기 시간 초과가 100밀리초 이하로 구성됩니다.
JunoDB는 동일한 행/그룹 내에서 두 번 이상 장애가 발생하지 않는 한 클러스터에서 여러 노드 장애를 견딜 수 있습니다.
또한, 이러한 설계를 통해 다운타임 없이 소프트웨어 또는 OS 업그레이드와 같은 유지보수 목적으로 전체 영역을 오프라인으로 전환할 수 있습니다.
Cross-data center replication between clusters
데이터센터 간 복제도 구현, 각 클러스터의 proxy들 사이의 데이터를 비동기적으로 복제 하도록 해서 구현했다.
Performance at Scale
- JunoDB는 가장 부하가 높은 시점에서(the most demanding workloads)도 한 자릿수 밀리초의 응답 시간과 원활한 사용자 경험을 유지하도록 해준다.
- 애플리케이션이 성능 저하 없이 선형 확장성(linear scalability)을 달성할 수 있도록 지원하여, 높은 처리량과 짧은 지연 시간을 제공한다.
- junodb/juno_performance_bench.md at main · paypal/junodb · GitHub
High security
- JunoDB 시스템은 ‘전송 중인 데이터’(in transit)와 ‘미사용 데이터’(at rest)를 모두 보호하도록 설계
- 전송 중 데이터 보안을 위해 TLS 가 활성화 되어 있다.
- 클라이언트 <–> proxy 사이
- 다른 데이터 센터에 위치한 proxy 사이(데이터 복제를 할 때)
- 페이로드 암호화는 클라이언트 또는 proxy 수준(스토리지 서버 외부)에서 수행되어 동일한 데이터가 여러번 암호화되는 것을 방지한다. 이상적으로는, 암호화는 클라이언트 측에서 수행돼야만 하지만, 클라이언트가 실행하지 않는 경우 proxy는 메타데이터 플래그를 통해 이를 감지하고 암호화를 수행한다.
- 스토리지 서버가 받아서 스토리지 엔진에 저장되는 모든 데이터는 암호화되어 유휴 상태에서의 보안을 유지(maintain security).
- Key management module
- TLS, 세션, 암호화 키 배포를 위한 인증서를 관리하고
- 키 교체(key rotation)를 용이하게 하기 위해 사용된다.
junodb 빌드방법
- https://www.paypalobjects.com/junodb/junodb_Server_Build.mp4
- https://www.paypalobjects.com/junodb/junodb_Docker_Build.mp4
- https://www.paypalobjects.com/junodb/junodb_client_sdk.mp4
댓글 없음:
댓글 쓰기