목차
비녀장머리말
이 기사 데이터 복제는 데이터베이스를 어떻게 최적화합니까? - 시스템설계 09 데이터베이스 복제의 중요성을 설명합니다. 데이터베이스 복제 기술을 통해 데이터베이스를 최적화할 수 있습니다. 데이터 분할은 데이터베이스 최적화를 위한 또 다른 매우 중요한 개념입니다. 이 문서에서는 데이터베이스 분할에 대해 자세히 설명하고 다양한 샤딩 방법(데이터베이스 샤딩)에 대해서도 설명합니다. 데이터 파티션 및 데이터베이스 샤딩을 포함한 이 문서의 중국어 이름은 현재 Azure 공식 문서의 번역을 의미하지만 독자는 이러한 용어를 참조할 때 원문을 사용하는 것이 좋습니다.
데이터 분할이란 무엇입니까?
데이터 파티셔닝은 데이터베이스의 데이터를 더 작고 관리하기 쉬운 하위 블록으로 나누는 프로세스입니다. 이러한 하위 블록을 파티션이라고 합니다. 데이터 세분화는 시간, 고객 ID, 제품 카테고리 등 다양한 요소를 기반으로 할 수 있습니다.
데이터를 분할해야 하는 이유는 무엇입니까?
확장되지 않는 시스템의 경우 데이터 양이 계속 증가하고 데이터베이스에 대한 읽기 및 쓰기 트래픽이 점점 더 커지므로 기존 데이터베이스에 확장성 압박이 가해집니다. 따라서 데이터 분할을 사용하여 다음을 수행할 수 있습니다. 각각 전체 프로필의 일부를 관리하는 여러 노드를 사용합니다.
데이터 파티셔닝의 장점
- 성능 향상: 데이터를 더 작은 부분으로 나누어 쿼리하기가 더 쉬워집니다. 이는 대용량 데이터를 처리하는 시스템에 특히 유용합니다.
- 확장성 향상: 데이터 양이 증가함에 따라 새로운 데이터를 저장하기 위해 더 많은 파티션을 쉽게 추가할 수 있으므로 큰 변경 없이 데이터베이스를 계속 확장할 수 있습니다.
- 유용성 향상: 파티션에 오류가 발생하면 해당 파티션의 데이터만 영향을 받습니다. 다른 파티션을 계속 사용할 수 있으므로 전체 시스템 가동 중지 시간을 줄이는 데 도움이 됩니다.
- 관리 단순화: 데이터 분할을 통해 데이터베이스 관리를 단순화할 수 있습니다. 예를 들어 각 파티션을 개별적으로 백업 및 복원할 수 있으며 각 파티션에 대해 쿼리를 최적화할 수 있습니다.
데이터 분할의 단점
- 복잡성 추가: 데이터 분할은 데이터베이스의 복잡성을 증가시킵니다. 분할 전략을 개발하고 유지 관리해야 하며, 분할된 데이터를 수용하기 위해 시스템을 일부 변경해야 할 수도 있습니다.
- 비용을 증가시키다: 데이터 분할에는 추가 하드웨어 및 소프트웨어가 필요할 수 있으며 분할 데이터베이스 관리 비용이 더 높을 수 있습니다.
샤딩
여러 노드에 트래픽과 로드를 분산하려면 파티셔닝(Partitioning)이나 샤딩(Sharding)을 통해 데이터를 분할해야 합니다. 우리는 대규모 데이터 컬렉션을 더 작은 데이터 블록으로 나누어 서로 다른 노드에 저장할 것입니다.
그러나 분할되어야 하기 때문에 각 파티션이 대략 동일한 양의 데이터를 저장하도록 파티션의 균형을 유지해야 합니다. 파티션의 균형이 맞지 않고 대부분의 데이터베이스 쿼리가 몇 개의 파티션에 속하면 과부하된 파티션이 로드를 감당할 수 없어 시스템 병목 현상이 발생합니다. 또한, 부하가 과도한 이러한 파티션 노드를 핫스팟이라고 부르기도 합니다.
일반적으로 샤딩에는 수직 샤딩과 수평 샤딩이라는 두 가지 방법을 사용합니다.
수직 샤딩
수직 샤딩은 서로 다른 데이터베이스에 서로 다른 테이블을 배치하는 것입니다. 이 방법은 서로 다른 서버에서 실행될 수 있습니다. 여기서는 사용자가 원칙을 더 잘 이해할 수 있도록 먼저 다른 공식 문서의 그림을 제공합니다.
일반적으로 검색 속도를 향상시키기 위해 수직 샤딩(Vertical Sharding)을 사용합니다. 예를 들어 Blob으로 구성된 테이블(Blob 관련 내용은 추후 자세히 소개하겠습니다). 이 경우 큰 텍스트 데이터나 Blob이 포함된 열은 다른 테이블로 분할됩니다.
수직 샤딩은 수동 파티셔닝에 적합합니다. 주로 이 샤딩 방법이 상대적으로 복잡하고 데이터베이스 관리자가 이러한 데이터 상관 관계를 통해 데이터를 분할하는 방법을 결정해야 하기 때문입니다. 이에 비해 다음에 소개할 수평 샤딩(Horizontal Sharding)은 동적 조건에서도 자동화에 적합하다.
수평 샤딩
이전에 소개한 수직 샤딩 외에도 수평 샤딩(Horizontal Sharding)이라는 또 다른 샤딩 방법이 있습니다. 데이터베이스의 일부 테이블이 너무 커서 읽기/쓰기 성능에 영향을 미치는 경우 수평 샤딩은 이 문제를 해결하는 좋은 샤딩 방법입니다.
수평 샤딩(Horizontal sharding) 또는 파티셔닝(partitioning)이란 테이블을 데이터를 분할해 여러 개의 테이블로 나누는 것인데, 데이터가 500행이라면 직접 두 개의 데이터베이스로 나눌 수 있으며, 각 데이터베이스는 자체적으로 200개의 데이터베이스를 갖는다. 50줄.
독자들이 수평 샤딩의 개념을 더 잘 이해할 수 있도록 그림도 첨부했습니다. 일반적으로 다음과 같은 수평 샤딩 방법이 있습니다. 즉, 키 기반 샤딩, 해시 기반 샤딩, 이러한 중국어 번역은 제가 참조한 내용을 기반으로 합니다. 물론, Tencent의 기술 문서는 일반적인 상황에서는 이름을 영어로 사용합니다.
키 기반 샤딩
키 기반 샤딩(Key Based Sharding)은 데이터 테이블의 키 필드를 기준으로 데이터를 여러 파티션으로 나누는 방법입니다. 예: 고객 데이터는 고객 ID를 기준으로 여러 파티션으로 분할될 수 있으므로 각 파티션에는 특정 고객에 대한 데이터가 포함됩니다.
이점
키 기반 샤딩 방법을 사용하면 쿼리가 매우 효율적이고 구현하기 쉬우며 특정 키 범위(어떤 노드, 어떤 샤드)를 찾을 위치를 정확히 알 수 있다는 장점이 있습니다.
결점
키 선택이 올바르지 않으면 트래픽 분포가 고르지 않아 일부 노드에서 더 많은 데이터를 저장해야 할 수도 있습니다. 즉, 고르지 않은 샤딩이 발생할 확률이 더 높습니다.
범위 기반 샤딩
범위 기반 샤딩은 데이터 테이블의 특정 범위 필드를 기반으로 데이터를 여러 파티션으로 나눕니다. 예를 들어 제품 데이터를 가격을 기준으로 여러 파티션으로 나누어 각 파티션에 특정 제품에 대한 데이터를 포함할 수 있습니다.
이점
범위 기반 샤딩을 사용하면 샤딩 밸런스가 더 좋고, 범위만 기준으로 검색할 데이터베이스를 결정할 수도 있다는 장점이 있습니다.
결점
일반적으로 더 작은 범위의 데이터를 쿼리할 때 이 데이터 샤딩 방법은 덜 효율적입니다.
해시 기반 샤딩
해시 기반 샤딩은 특정 필드(해시 함수)의 값을 기반으로 데이터 테이블을 해시한 후, 해시 결과에 따라 데이터를 다른 파티션에 할당하는 것입니다.
이점
해시 기반 샤딩의 장점은 균형이 매우 높고 쿼리 효율성이 상대적으로 높다는 것입니다.
결점
핫스팟이 있을 수 있습니다. 또한 앞서 언급한 내용을 검토하십시오. 파티션이 불균형하고 대부분의 데이터베이스 쿼리가 몇 개의 파티션에 속하면 과부하된 파티션이 로드를 감당할 수 없어 시스템 병목 현상이 발생합니다. 또한, 부하가 과도한 이러한 파티션 노드를 핫스팟이라고 부르기도 합니다.
재조정 분할
데이터베이스 쿼리 로드 자체가 불균형하면 데이터베이스 성능이 저하됩니다. 이때 불균형의 원인은 다음과 같습니다.
- 데이터가 고르게 분산되지 않았습니다.
- 단일 파티션에 로드가 너무 많습니다.
- 쿼리 트래픽이 증가하면 시스템 트래픽을 감당하기 위해 더 많은 노드를 추가해야 합니다.
다음은 분할 균형을 재조정할 수 있는 몇 가지 방법입니다.
고정된 파티션 수
이 방법에서는 처음에 데이터베이스를 설정할 때 고정된 개수의 파티션을 생성합니다. 일반적으로 노드 수보다 많은 파티션이 생성되어 노드에 할당됩니다. 따라서 새 노드가 시스템에 합류하면 파티션이 균등하게 분할될 때까지 기존 노드에서 일부 파티션을 가져올 수 있습니다.
물론 각 방법에는 장점과 단점이 있습니다. 이 접근 방식의 단점은 클러스터의 전체 데이터 양에 따라 각 파티션의 크기가 커지면 모든 파티션에 전체 데이터 중 작은 부분만 포함되기 때문에 크기도 커진다는 것입니다. 또한 파티션이 매우 작으면 각 파티션에 약간의 비용이 들기 때문에 파티셔닝 비용이 너무 커지게 됩니다. 파티션이 매우 크면 노드 균형을 재조정하고 노드 오류를 복구하는 데 드는 비용이 높아집니다. 올바른 파티션 수를 선택하는 것은 매우 중요합니다.
동적 파티셔닝
동적 파티셔닝(동적 파티셔닝)에서는 파티션 크기가 설정 값에 도달하면 원래 파티션이 두 개의 파티션으로 균등하게 분할됩니다. 서로 다른 파티션에 노드가 할당되고 결국 부하가 균등하게 분산됩니다. 파티션 수는 전체 데이터 볼륨과 동적으로 균형을 이룹니다. 이것이 동적 파티셔닝의 장점입니다.
그러나 동적 파티셔닝에는 단점이 있습니다. 데이터베이스를 동시에 읽고 쓰는 경우 동적으로 균형을 재조정하는 것은 어렵습니다. 읽기 및 쓰기 중 동적 재조정은 읽고 쓴 데이터가 서로 다른 노드에서 이동하기 때문에 매우 복잡합니다. 이때 동적 균형을 수행하면 충돌이 발생하거나 심지어 지연될 수도 있습니다. 데이터 일관성과 가용성을 보장하기 위해 복잡성이 도입되며 이는 시스템 성능과 안정성에 영향을 미칩니다. MongoDB는 이러한 종류의 동적 파티셔닝을 사용하는 잘 알려진 데이터베이스 중 하나입니다.
일관성, 가용성, 안정성에 대해 잘 모르는 경우 이 문서를 참조하세요. 소프트웨어 설계의 비기능적 특징 – 시스템 설계 03
라우팅 요청
다양한 데이터 파티션이 이전에 소개되었지만 데이터가 데이터베이스로 전송되기 전에 클라이언트가 요청할 때 시스템이 연결할 노드를 어떻게 알 수 있는지 질문해야 합니다. 재조정 후에는 노드에 대한 파티션 배포가 변경됩니다. 특정 데이터베이스를 읽으려면 해당 데이터베이스를 읽기 위해 연결해야 하는 IP 주소를 어떻게 알 수 있습니까? 이 문제를 서비스 검색이라고도 합니다. 이 문제에 대한 해결책은 다음과 같습니다.
- 클라이언트가 네트워크의 모든 노드를 요청할 수 있습니다. 노드에 요청된 데이터가 포함되어 있지 않으면 요청은 포함된 노드로 전달됩니다.
- 모든 요청을 라우팅 계층으로 전송하기 위해 라우팅 계층을 설정하면 라우팅 계층은 요청을 충족하기 위해 연결할 노드를 결정합니다.
- 클라이언트에는 이미 파티션에 대한 정보와 어떤 파티션이 어떤 노드에 연결되어 있는지가 있습니다. 따라서 그들은 필요한 정보가 포함된 노드에 직접 접속할 수 있습니다.
동물원지기
분산 시스템에서 특정 클러스터의 수정 사항을 추적하려면 잘 알려진 도구 중 하나인 ZooKeeper를 사용하여 위의 작업을 수행할 수 있습니다. ZooKeeper는 분산형 시스템을 위해 Apache에서 제공하는 분산형 오픈 소스 조정 서비스입니다. 이 도구는 네트워크의 모든 매핑도 추적할 수 있으며 각 노드는 ZooKeeper에 연결되어 정보를 얻습니다. 파티션이 변경되거나 노드가 추가 또는 삭제될 때마다 ZooKeeper는 변경 사항을 라우팅 계층에 업데이트하고 알립니다. ZooKeeper는 Yelp, RackSpace, Yahoo!, Reddit, Facebook 및 Twitter와 같은 회사에서 사용됩니다.
결론적으로
데이터 파티셔닝은 데이터베이스의 데이터를 더 작고 관리하기 쉬운 하위 집합으로 나누는 기술로, 이를 통해 데이터베이스의 성능, 확장성, 가용성 및 관리 효율성을 향상시킬 수 있습니다.
데이터베이스 쿼리 로드의 균형이 맞지 않으면 데이터베이스 성능을 향상시키기 위해 파티션의 균형을 다시 조정해야 합니다. 분할 재조정 프로세스에는 일반적으로 불균형 분할 식별, 재조정 계획 개발 및 재조정 계획 실행 단계가 포함됩니다.
파티셔닝은 오늘날 모든 분산 시스템의 표준이 되었으며 대부분의 소프트웨어 엔지니어가 알아야 할 사항입니다. 또한 시스템의 데이터 양이 계속 증가하기 때문에 데이터를 분할하는 것이 합리적입니다. 쓰기 및 읽기 속도를 높이고 시스템의 가용성, 확장성 및 성능을 더욱 향상시킬 수 있습니다.
관련 기사
데이터 복제는 데이터베이스를 어떻게 최적화합니까? - 시스템설계 09
DNS란 무엇입니까? 도메인 이름 시스템 소개 - 시스템 설계 06
시스템 설계 구성 요소 빌딩 블록 소개 - 시스템 설계 05