본문 바로가기

3.구현/Java or Kotlin

[spring boot] 다중 DB 사용하기: ApacheShardingSphere 활용

들어가기

자바에서 샤딩용 라이브러리로 많이 사용하고 있는 Apache ShardingSphere을 사용해서 다중 DB사용하는 방법을 살펴볼려고 한다. 여기서는 간단하게 맞보기로 살펴볼 예정이다.

작성자: ospace114@empal.com, http://ospace.tistory.com/

Sharding

이름에도 나오지만 Apache의 ShardingSphere는 샤딩에 많이 사용된다. 샤딩이란 데이터를 여러 DB 서버로 분산해서 처리량을 높이는 방법이다. 이런 샤딩은 데이터를 분산하는 방식에 따라 여러 종류로 구분할 수 있다.

  • Vertical: 부하가 몰리는 테이블을 분리해서 다른 DB로 분산
  • Horizontal: 한 테이블 데이터를 여러 DB로 분산

샤딩하는 방법은 직접 연결 구현하거나 중간 프록시를 구현하는 방식이 있다.

  • 직접 연결 구현
    • JDBC를 직접 제어해 명시적으로 호출 계획 실행
    • 종속성이 없고 가볍지만, 수정시 모든 어플에 영향
    • JDBC 연결가능한 DB 사용 가능
  • 중간 프록시 구현
    • 모든 응용은 프록시로 호출하고 프록시에서 샤딩
    • 기존 응용에 투명하게 제공되지만 중간 추가 처리 부하
    • DB 바이너리 프로토콜 지원 필요

샤딩을 쉽게 사용할 수 있게 해주는게 Apache ShardingSphere이다.

기본 환경 구성

먼저 spring boot 프로젝트를 구성하고 난 후에 dependency 추가한다. 여기서는 spring boot 프로젝트 구성에 대해서는 다루지 않는다.

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.1.1</version>
</dependency>
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-namespace</artifactId>
    <version>4.1.1</version>
</dependency>

환경설정

다음으로 application.properties 파일 설정을 살펴보자.

# datasource 설정
spring.shardingsphere.datasource.names = db1, db2
spring.shardingsphere.datasource.db1.type = com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.db1.jdbc-url = jdbc:mysql://127.0.0.1:3306/db1?serverTimezone=UTC
spring.shardingsphere.datasource.db1.username = foo
spring.shardingsphere.datasource.db1.pasword = foopass
spring.shardingsphere.datasource.db2.type = com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.db2.jdbc-url = jdbc:mysql://127.0.0.1:3306/db2?serverTimezone=UTC
spring.shardingsphere.datasource.db2.username = foo
spring.shardingsphere.datasource.db2.pasword = foopass
# sharding 설정
# id가 홀수이면 db1.t_order와 db1.t_order_item에 저장됨
# id가 짝수이면 db2.t_order와 db2.t_order_item에 저장됨
spring.shardingsphere.sharding.default-databases-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.default-databases-strategy.inline.algorithm-expression = db$->{id%2+1}
spring.shardingsphere.sharding.t_order.actual-data-nodes = db$->{1..2}.t_order
spring.shardingsphere.sharding.t_order.key-generator-column-name=id
spring.shardingsphere.sharding.t_order_item.actual-data-nodes = db$->{1..2}.t_order_item
spring.shardingsphere.sharding.t_order_item.key-generator-column-name=id
# 기타설정
spring.shardingsphere.sharding.t_order.key-generator.column = id
spring.shardingsphere.sharding.t_order.key-generator.type = SNOWFLAKE
spring.shardingsphere.props.sql.show = true

두개 DB인 db1와 d2를 설정한다. 각각 접속한 DB 정보를 입력한다. 그리고 샤딩에서 중요한 데이터 분리할 때 키를 어떤 기준으로 분리할지를 지정한다. 표현식이 ${...}와 $->{...}으로 사용할 수 있는데 ${...}은 스프링에서 사용하는 문법과 충돌할 수 있게 때문에 $->{...}을 권장한다.
default-databases-strategy에서 id기준으로 짝수이면 db1으로 홀수이면 db2로 분산한다. 설정된 기준에 따라 ShardingSphere가 알아서 DB에 분산 처리한다.

결론

Apache ShardingSphere을 사용하므로써 너무 쉽게 쌰딩을 사용할 수 있다. 이외에도 많은 기능이 있네요. 부족한 글이지만 여러분에게 도움되었으면 합니다. 즐프하세요. ospace.

참고

[1] https://shardingsphere.apache.org/
[2] shardingsphere spring boot configuration, https://shardingsphere.apache.org/document/4.1.0/en/manual/sharding-jdbc/configuration/config-spring-boot/

반응형