MariaDB의 이중화 구성 방법에는 크게 2가지가 있다.
각각의 MariaDB 이중화 구성 방법의 특징과 장단점은 다음과 같습니다.
속도가 빠르고 구성이 간단하여 관리 부담 측면에서 어려움이 없는 Master-Slave 방법으로 택함.
※ 특이사항
아래 동작은 Windows 기준 MariaDB Command Prompt 로 수행한다.
1. Master와 Slave 서버 cmd - Mysql root 계정 접속
mysql -u root -p
-- 패스워드입력
enter password
2. Master와 Slave 서버 DB 설정
Master와 Slave 서버를 각각 설정한다.
1) 동일한 이름의 database 생성
create database dbName;
2) 동일한 이름의 복제 user 계정 생성 및 권한 부여
grant replication slave on *.* to 'repl_user'@'%' identified by 'password';
flush privileges;
create user 'repl_user'@'%' identified by ‘password';
3. Master 서버의 이중화 설정
4. Slave 서버의 이중화 설정
5. Slave 서버에서 Master 서버 정보 지정 및 연결
change master to master_host='xxx.xxx.xxx.xxx',master_user='repl_user',master_password='password!',master_port=3306,master_log_file='mysql-bin.000004',master_log_pos=342;
stop slave;
reset slave;
6. Slave 서버에서 이중화 시작
<연결 성공>
Slave_IO_State : Waiting for master to send event
Slave_IO_Running : Yes
Slave_SQL_Running: Yes
7. Master 서버와 Slave 서버에서 이중화 확인
이러한 방법으로 마리아DB의 이중화 구성을 설정하면 Master 서버에서 변경된 데이터가 Slave 서버로 자동으로 복제되어, 데이터의 가용성과 신뢰성을 높일 수 있다.
`spring.datasource.url` 프로퍼티를 사용하여 한 번에 이중화 DB에 연결하는 방법이 있다. 이 방법은 Spring Boot에서 지원하는 기능 중 하나인 **RoutingDataSource**를 사용하여 구현된다.
`RoutingDataSource`는 실제 데이터베이스 연결을 관리하는 여러 개의 `DataSource`를 가지고 있으며, 각 `DataSource`에 대한 연결을 알맞게 분배하여 사용한다. 이를 통해 다수의 데이터베이스에 대한 연결을 투명하게 처리할 수 있다.
아래는 `RoutingDataSource`를 사용하여 `spring.datasource.url` 프로퍼티를 통해 이중화 DB에 연결하는 예시다.
@Configuration
public class DataSourceConfig {
@Bean
@Primary
public DataSource dataSource() {
DriverManagerDataSource dataSource1 = new DriverManagerDataSource();
dataSource1.setDriverClassName("com.mysql.jdbc.Driver");
dataSource1.setUrl("jdbc:mysql://db1.example.com:3306/mydatabase");
dataSource1.setUsername("user1");
dataSource1.setPassword("password1");
DriverManagerDataSource dataSource2 = new DriverManagerDataSource();
dataSource2.setDriverClassName("com.mysql.jdbc.Driver");
dataSource2.setUrl("jdbc:mysql://db2.example.com:3306/mydatabase");
dataSource2.setUsername("user2");
dataSource2.setPassword("password2");
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("dataSource1", dataSource1);
targetDataSources.put("dataSource2", dataSource2);
RoutingDataSource routingDataSource = new RoutingDataSource();
routingDataSource.setTargetDataSources(targetDataSources);
routingDataSource.setDefaultTargetDataSource(dataSource1);
return routingDataSource;
}
@Bean
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(dataSource());
}
}
위의 예시에서 `RoutingDataSource` 객체를 생성하고, `setTargetDataSources()` 메서드를 사용하여 각 데이터베이스에 대한 `DataSource`를 설정한다. `setDefaultTargetDataSource()` 메서드를 사용하여 기본적으로 사용할 `DataSource`를 설정한다.
그리고 `JdbcTemplate`를 생성할 때 `dataSource()` 메서드를 사용하여 `RoutingDataSource` 객체를 전달하면 된다. 이렇게 구성하면 `JdbcTemplate`는 내부적으로 `RoutingDataSource`를 사용하여 이중화 DB에 연결한다.
Spring Boot에서 MariaDB 이중화를 구성하는 방법에 관한 소개이다
xmlCopy code
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>${mariadb.version}</version>
</dependency>
여기서 ${mariadb.version}은 사용하려는 MariaDB 버전에 따라 변경된다.
xmlCopy code
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>${mariadb.version}</version>
</dependency>
여기서 [host1], [host2], [database], [username], [password]는 각각 사용자가 지정해야 하는 값.
2. replication 설정MariaDB의 이중화 기능을 사용하려면 마스터-슬레이브 복제 구성이 필요하다. 이를 위해 다음과 같은 구성을 추가한다.
propertiesCopy code
# 마스터 구성
spring.datasource.master.url=jdbc:mariadb://[master_host]/[database]
spring.datasource.master.username=[username]
spring.datasource.master.password=[password]
spring.datasource.master.driver-class-name=org.mariadb.jdbc.Driver
# 슬레이브 구성
spring.datasource.slave.url=jdbc:mariadb://[slave_host]/[database]
spring.datasource.slave.username=[username]
spring.datasource.slave.password=[password]
spring.datasource.slave.driver-class-name=org.mariadb.jdbc.Driver
# 읽기 전용 인 경우 슬레이브에만 쓰도록 설정
spring.datasource.tomcat.initial-size=5
spring.datasource.tomcat.max-active=15
spring.datasource.tomcat.max-idle=10
spring.datasource.tomcat.min-idle=5
spring.datasource.tomcat.default-auto-commit=false
spring.datasource.tomcat.test-while-idle=true
spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.validation-query=SELECT 1
# MariaDB 이중화 설정
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb:replication://[master_host],[slave_host]/[database]?useSSL=false
spring.datasource.replication=true
spring.datasource.read-only=true
spring.datasource.validation-query=SELECT 1
spring.datasource.validation-interval=10000
spring.datasource.test-on-borrow=true
spring.datasource.test-while-idle=true
spring.datasource.test-on-return=false
spring.datasource.time-between-eviction-runs-millis=30000
spring.datasource.min-evictable-idle-time-millis=60000
spring.datasource.remove-abandoned=true
spring.datasource.remove-abandoned-timeout=60
spring.datasource.log-abandoned=true
굳이 tomcat 라이브러리를 쓰지않고 단순히 properties만 변경하여 쓰는 방법도 있다.
spring.datasource.driverClassName=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb:loadbalance://[master_host]/,[slave_host]/[database]?autoReconnect=true&failoverDelay=5000&allowMultiQueries=true
spring.datasource.maximum-pool-size = 4
spring.datasource.username=[username]
spring.datasource.password=[password]
이 외에도, master.url / slave.url 등 다양한 방법이 있으니 본인 프로젝트 환경에 맞는 방법을 구성하여서 사용하면 될 듯하다.