Spring Boot의 Primary/Secondary 페일오버 데이터 소스
Spring Boot 앱이 있고 기본 및 보조 데이터 소스가 필요합니다.연결에 문제가 있을 때 다시 연결하는 방법에 대한 논리를 구현해야 합니다.Spring이 연결을 해주기 때문에, 문제가 생기면 다시 연결하라고 말할 수 없을 것 같습니다.
2개의 데이터 소스를 만드는 방법은 알고 있지만, 어느 것을 언제 사용할 것인지에 대한 논리를 처리하기에 가장 좋은 장소는 어디입니까?논리는 다음과 같이 작동해야 합니다.
- 기본에 연결
- 연결 문제가 있거나 리소스를 사용할 수 없거나 연결 시간 초과가 발생한 경우 기본 연결에 다시 연결해 보십시오.
- 기본 연결이 불가능한 경우 보조 연결을 시도합니다.
- 보조 연결이 불가능한 경우 X분 동안 2단계와 3단계를 계속 재시도하십시오.
스프링 서비스 내에서 이 문제를 처리하는 것이 최선입니까?이 논리만 다루는 다른 서비스를 사용하고 다른 서비스는 이를 사용해야 합니까?DB의 "스프링웨이"에 연결하지 않고 "일반적인 오래된 자바 방식"을 사용하는 것이 더 나을까요?
다음은 서비스가 기본 서비스에만 연결되는 예입니다.
데이터 소스 구성
package com.helloworld.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import oracle.jdbc.pool.OracleDataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
import java.sql.SQLException;
@Configuration
public class DatasourcesConfig {
@Primary
@Bean(name = "primaryDataSource")
DataSource primaryDataSource() throws SQLException {
OracleDataSource dataSource = new OracleDataSource();
dataSource.setUser("user");
dataSource.setPassword("pass");
dataSource.setURL("jdbc:oracle:thin:@(...primary connection...)");
return dataSource;
}
@Bean(name = "secondaryDataSource")
DataSource secondaryDataSource() throws SQLException {
OracleDataSource dataSource = new OracleDataSource();
dataSource.setUser("user");
dataSource.setPassword("pass");
dataSource.setURL("jdbc:oracle:thin:@(...secondary connection...)");
return dataSource;
}
@Bean(name = "jdbcPrimary")
@Autowired
public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource ds) {
return new JdbcTemplate(ds);
}
@Bean(name = "jdbcSecondary")
@Autowired
public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource ds) {
return new JdbcTemplate(ds);
}
}
서비스 예제
package com.helloworld.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class ExampleService {
@Autowired
@Qualifier("jdbcPrimary")
private JdbcTemplate jdbcTemplatePrimary;
@Autowired
@Qualifier("jdbcSecondary")
private JdbcTemplate jdbcTemplateSecondary;
public SampleDTO getData(String a, String b){
final String sql = "select a, b from TABLE_A where a=? and b=?";
// Only checking Primary
return jdbcTemplatePrimary.queryForObject(sql,
new Object[]{a,b},
new SampleRowMapper());
// Is this the best place to catch exceptions and connect to Secondary?
}
}
SampleRowMapper 및 SampleDTO 클래스는 매우 기본적이기 때문에 제외되었습니다.
저는 여기에 링크 설명을 입력하여 DZone: https://dzone.com/articles/using-ha-jdbc-with-spring-boot 의 이 기사를 사용하여 이러한 종류의 메커니즘을 구현할 수 있었습니다.
HA-JDBC는 구성 가능하며 여러 가지 페일오버 전략이 있습니다.
이 경우 두 개의 서로 다른 데이터베이스에 대한 연결을 설정합니다. 기본 데이터베이스는 보조 데이터베이스로 백업되므로 최신 상태가 아닐 수 있습니다.
이 데이터베이스는 읽기 전용으로 사용되므로 트랜잭션에 대해 걱정할 필요가 없으므로 다음과 같이 설정합니다.
- 밸런서 팩토리: 단순 - 사용할 수 없는 경우가 아니면 항상 기본을 시도합니다.
- 기본 데이터베이스의 가중치는 2, 보조 데이터베이스의 가중치는 1로 설정되었습니다.밸런서 팩토리가 '단순'으로 설정되어 있으면 문제가 없는 한 드라이버가 기본 상태로 전환됩니다.
- 기본 동기화 전략:단순(읽기 전용이므로 걱정할 필요가 없습니다.
- 데이터베이스 메타데이터 캐시 팩토리: 단순
- 상태 관리자 공장: 단순
저는 현재 비밀번호 난독화 작업을 할 수 없었지만 언젠가 다시 시도할 것입니다.
또한 처음에는 로그인하는 데 문제가 있었지만 ha-jdbc 드라이버에 사용자 이름/암호가 필요하다는 것을 인식했습니다.
위의 예제는 Java가 아닌 Groovy로 작성되었습니다.
회로 차단기 패턴을 사용할 수 있다고 생각합니다. 1차 데이터 소스에 장애가 발생하면 회로 차단기 폴백 방식이 실행되고 2차 데이터 소스를 사용합니다.폴백 방법에서는 실패 상태를 다시 시도할 수 있습니다.하이스트릭스는 회로 차단기 패턴에 적합한 옵션입니다. 사용할 수 있습니다.희망이 도움이 됩니다:)
스프링 회로 차단기 impl; https://spring.io/guides/gs/circuit-breaker/
언급URL : https://stackoverflow.com/questions/45800582/primary-secondary-failover-datasource-in-spring-boot
'source' 카테고리의 다른 글
sqlldr을 사용하여 원격 DB에 데이터 로드 (0) | 2023.08.23 |
---|---|
오라클 SQL 개발자 도구를 사용하여 테이블의 필드에 null 값을 설정하는 방법은 무엇입니까? (0) | 2023.08.18 |
GCC를 사용하여 C 및 C++ 파일을 함께 컴파일 (0) | 2023.08.18 |
URL에서 파일이 있는지 확인하는 방법 (0) | 2023.08.18 |
jdiv 내의 요소만 직렬화하기 위한 쿼리 (0) | 2023.08.18 |