source

Spring Boot의 Primary/Secondary 페일오버 데이터 소스

manysource 2023. 8. 18. 22:47

Spring Boot의 Primary/Secondary 페일오버 데이터 소스

Spring Boot 앱이 있고 기본 및 보조 데이터 소스가 필요합니다.연결에 문제가 있을 때 다시 연결하는 방법에 대한 논리를 구현해야 합니다.Spring이 연결을 해주기 때문에, 문제가 생기면 다시 연결하라고 말할 수 없을 것 같습니다.

2개의 데이터 소스를 만드는 방법은 알고 있지만, 어느 것을 언제 사용할 것인지에 대한 논리를 처리하기에 가장 좋은 장소는 어디입니까?논리는 다음과 같이 작동해야 합니다.

  1. 기본에 연결
  2. 연결 문제가 있거나 리소스를 사용할 수 없거나 연결 시간 초과가 발생한 경우 기본 연결에 다시 연결해 보십시오.
  3. 기본 연결이 불가능한 경우 보조 연결을 시도합니다.
  4. 보조 연결이 불가능한 경우 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?

    }

}

SampleRowMapperSampleDTO 클래스는 매우 기본적이기 때문에 제외되었습니다.

는 여기에 링크 설명을 입력하여 DZone: https://dzone.com/articles/using-ha-jdbc-with-spring-boot 의 이 기사를 사용하여 이러한 종류의 메커니즘을 구현할 수 있었습니다.

HA-JDBC는 구성 가능하며 여러 가지 페일오버 전략이 있습니다.

이 경우 두 개의 서로 다른 데이터베이스에 대한 연결을 설정합니다. 기본 데이터베이스는 보조 데이터베이스로 백업되므로 최신 상태가 아닐 수 있습니다.

이 데이터베이스는 읽기 전용으로 사용되므로 트랜잭션에 대해 걱정할 필요가 없으므로 다음과 같이 설정합니다.

  1. 밸런서 팩토리: 단순 - 사용할 수 없는 경우가 아니면 항상 기본을 시도합니다.
  2. 기본 데이터베이스의 가중치는 2, 보조 데이터베이스의 가중치는 1로 설정되었습니다.밸런서 팩토리가 '단순'으로 설정되어 있으면 문제가 없는 한 드라이버가 기본 상태로 전환됩니다.
  3. 기본 동기화 전략:단순(읽기 전용이므로 걱정할 필요가 없습니다.
  4. 데이터베이스 메타데이터 캐시 팩토리: 단순
  5. 상태 관리자 공장: 단순

저는 현재 비밀번호 난독화 작업을 할 수 없었지만 언젠가 다시 시도할 것입니다.

또한 처음에는 로그인하는 데 문제가 있었지만 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