들어가기
자바에서 샤딩용 라이브러리로 많이 사용하고 있는 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/
'3.구현 > Java or Kotlin' 카테고리의 다른 글
Kotlin 배우기3 - Generic (0) | 2023.11.16 |
---|---|
[Springboot] Spring boot WebFlux 사용하기 (2) | 2023.11.14 |
[spring boot] 다중 DB 사용하기: AbstractionRoutingDataSource 활용 (0) | 2023.10.31 |
[spring boot] 다중 DB 사용하기: 설정 활용 (2) | 2023.10.30 |
[spring boot] jackson대신에 gson으로 사용하기 (0) | 2023.10.27 |