Inflearn brand logo image

인프런 커뮤니티 질문&답변

리나님의 프로필 이미지
리나

작성한 질문수

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

논리적 shard 통해 router 가 특정 shard로 라우팅 해줄때 질문 있습니다.

해결된 질문

작성

·

142

0

 

일단 해당 영상 강의에서 article_like 이라는 독립 데이터베이스 기준으로 질문 드리도록 하겠습니다.

 

shard_qa

여기를 보면 강의 내용에서 각각 테이블 따라 샤드키 기준 컬럼이 다른것을 확인 되었습니다.

예를들어서 'article_like' 테이블 경우 샤드키는 article_id 컬럼 으로 이용하고

당연히 연관관계 테이블인 'article_like_count' 테이블 경우도 샤드키를 article_id 컬럼으로 하고 있습니다.

그런데 outbox 테이블 경우는 'shard_key' 컬럼으로 해주고 있는데요.

 

여기서 질문은

client (애플리케이션) 에서 일단 곧장 해당 특정 샤드 데이터베이스로 보내지 않고 router 를 이용해서 정해진 샤드키 통해 어디 샤드로 전송할지 역활을 할텐데요.

 

router 역활의 개념을 이해가 되었지만 구체적으로 어떻게 구현되어 있는것인지 잘 몰라서 질문 드립니다.

각각의 테이블 마다 샤드키에 해당되는 컬럼명이 다 다르기 때문에 이때 router 에서는 각각 어떻게 분기해서 알맞게 특정 샤드키에 해당되는 컬럼명을 추출해 특정 샤드 데이터베이스로 보내는지 궁금합니다.

 

그냥 무식하게 if else 조건문으로 'outbox' 테이블은 'shard_key' 컬럼값을 추출해 분기 처리하고

'article_like' 테이블하고 'article_like_count' 테이블은 'article_id' 컬럼값을 추출해 분기 처리해서 특정 샤드 데이터베이스로 보내는지 궁금 합니다!

 

 

 

 

 

 

답변 3

0

쿠케님의 프로필 이미지
쿠케
지식공유자

리나님, 안녕하세요!

 

테이블의 샤드 키를 실제로 어떻게 인식해서 라우팅할 수 있을지 궁금하신 것 같습니다!

 

일단 개념적인 부분은 잘 이해하신 것 같은데요,

개념에 대한 구현은 정형화된 정답이 있는건 아니고, 결국 만들기 나름입니다.

구현 방식에 대해서는 다양할 수 있는 것입니다.

그리고 이러한 라우터의 구현은 애플리케이션에서 처리될 수도 있고, 별도 레이어(애플리케이션과 DB 사이)에서 처리될 수도 있습니다.

 

스프링부트 기준으로 구현 방법에 대해 몇 가지 예시 드려보겠습니다!

예시 1)

엔티티의 특정 필드가 샤드 키라는 정보를 알려주는 @ShardKey 애노테이션을 만들고,

엔티티에서 샤드 키로 활용할 필드에 애노테이션을 설정해둡니다.

그러면 라우터는 쿼리 시점에 @ShardKey 애노테이션이 설정된 엔티티의 필드 데이터를 찾아낼 수 있습니다.

해당 필드의 데이터로 샤드가 결정되고, 쿼리가 전송됩니다.

위처럼 구현하면, 라우터는 샤드 키로 설정된 필드가 무엇인지 구체적인 네이밍을 알 필요는 없습니다.

그냥 엔티티 클래스에서 @ShardKey 필드의 데이터만 꺼내와서 샤드를 결정하면 됩니다.

article_like 테이블의 article_id = 3

article_like_count 테이블의 article_id = 3

outbox 테이블의 shard_key = 3

데이터가 위와 같다면, 라우터 입장에서는 단순히 샤드 키를 결정하기 위해 3라는 데이터를 꺼내면 됩니다.

샤드 전략까지 예시로 들어보면,

샤드 키를 결정하기 위한 방식이 단순하게 나머지 연산(%2)이라고 가정해보겠습니다.

(샤드 키 3) % 2 == 1 이므로, 1번 샤드로 쿼리를 전송하면 됩니다.

 

예시 2)

각 테이블의 샤드 키 정보를 관리하는 매핑 테이블을 만들어볼 수도 있습니다.

매핑 테이블은, 테이블명에 대응하는 샤드 키 컬럼 명을 가지고 있습니다.

쿼리를 전송할 때 또는 애플리케이션이 실행될 때 각 테이블의 샤드 키 컬럼 명을 매핑 테이블에서 읽어옵니다.

라우터는 쿼리 시점에 엔티티에서 샤드 키로 설정된 필드의 데이터를 찾고(리플렉션을 활용),

이를 기반으로 샤드 결정 및 쿼리를 전송합니다.

 

예시 3)

Shardable(샤드가 가능한) 이라는 인터페이스를 만들어볼 수도 있습니다.

위 인터페이스는 findShardKey라는 메소드를 구현해야 합니다.

엔티티 클래스는 Shardable 인터페이스를 구현하고, findShardKey 메소드의 반환 값으로 샤드 키를 설정해줍니다.

라우터는 쿼리 시점에 엔티티 객체를 Shardable로 캐스팅하여 findShardKey 메소드를 호출합니다.

findShardKey는 샤드 키 데이터를 반환해줄 것이고, 이를 기반으로 샤드 결정 및 쿼리를 전송합니다.

 

일단 당장 떠오르는 예시 중에서 몇 가지 언급 드려보았는데요, 위 내용들도 정답은 아니고 그냥 여러가지 예시일 뿐입니다.

구현 방식에 대해서는 다양할 수 있는거라 타당하고 합리적인 이유를 들 수 있다면 편하신 방법으로 만들어볼 수 있습니다.

자체적으로 샤딩을 지원하는 분산 DB를 이용한다면, DB 테이블 만드는 시점 또는 쿼리 전송 시점에 샤드 키 설정하는 방법을 제공해주기도 합니다.

 

혹시 더 궁금한 점 있으시면 편히 문의주세요!

쿠케님의 프로필 이미지
쿠케
지식공유자

위에 구현 방식에 대해 보충 설명 드렸습니다!

실무에서는 직접 만드는 것 보단, 처음부터 분산 DB를 사용하는게 제일 편하긴 합니다.. ㅎㅎㅎ

이미 잘 만들어진 분산 DB의 내장 기능을 이용하면 간단하게 처리할 수 있습니다.

이러한 개념들을 간단하게 처리하려고 만들어진 도구들이거든요.

개념과 원리에 대해서만 이해하고 있다면, 사용 방식만 봐도 내부 구현에 대해서 어느정도 유추 가능하고 흐름 파악이 용이할 수 있습니다.

샤드 키를 무엇으로 설정할지에 대해서는 몇 가지 전략들을 검토해볼 수 있는데,

이러한 전략들에 대해서는 "분산 데이터 모델링"이란 주제로 다음 강의로 준비중입니다..!

리나님의 프로필 이미지
리나
질문자

너무너무 기대되는 주제입니다!!!!! 강의 출시되면 꼭 구입하겠습니다 ㅠㅠ

0

안녕하세요, 인프런 AI 인턴입니다. 리나님.

샤드 아키텍처를 구현하면서 라우터의 역할과 구체적인 구현 방법에 대해 질문 주셨네요. 이는 데이터베이스 설계와 시스템 아키텍처에서 매우 중요한 부분을 다루고 있습니다.

라우터의 역할과 구현

라우터는 클라이언트의 요청을 적절한 샤드로 분배하는 역할을 합니다. 대규모 시스템에서 데이터베이스 샤딩은 데이터의 수평적 분할을 통해 시스템의 확장성을 높이고 성능을 향상시키는 전략입니다.

  1. 라우터의 기본 역할:

    • 라우터는 요청이 들어올 때마다 각 요청이 어떤 샤드로 가야 할 것인지 결정합니다. 이는 샤드 키의 값을 기준으로 라우팅을 수행합니다.
  2. 샤드 키 결정:

    • 각 테이블마다 샤드 키가 다르므로, 라우터는 테이블에 따라 어떤 컬럼이 샤드 키로 사용되는지를 알고 있어야 합니다. 테이블의 메타정보를 따로 관리하거나 하드코딩된 로직을 통해 샤드 키를 식별할 수 있습니다.
  3. 구현 예시:

    • 일반적으로 if-else 문은 간단한 시스템에서는 사용될 수 있으나, 이러한 방법은 확장성과 유지보수성 측면에서 비효율적일 수 있습니다.
    • 대신, 테이블별로 샤드 키를 매핑하는 설정 파일이나 데이터베이스 메타데이터를 사용하여 설정하는 것이 일반적입니다. 예를 들어, 각 테이블 명을 키로 하고, 샤드 키 컬럼 명을 값으로 가지는 매핑을 사용할 수 있습니다.
  4. 라운드 로빈 또는 해시 기반 라우팅:

    • 해시 기반 라우팅을 사용하면 샤드 키의 값을 기반으로 해시 함수를 통해 특정 샤드를 결정할 수 있습니다. 이 방법은 데이터의 불균형을 최소화하는 데 도움을 줍니다.
    • 라운드 로빈 방식 또한 간단한 분배 기법으로 사용될 수 있지만, 일반적으로 해시 기반 라우팅의 유연성과 성능이 더 우수합니다.

아래 게시글에서 구체적인 라우터의 구현 및 개념을 보다 자세히 탐구할 수 있습니다:
- Implementing a Router for Database Sharding (게시글 제목)

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

리나님의 프로필 이미지
리나

작성한 질문수

질문하기