2009-08-07 3 views
1

우리 제품의 단일 설치는 구성을 데이터베이스 테이블 집합에 저장합니다.여기서 분산 된 구성 데이터를 저장하는 방법

다른 설치에 대해서는 '설치'에 대한 설치가 없습니다.

지리적으로 멀리 떨어져있는 다른 데이터 센터에 여러 제품 사본을 설치하는 것이 일반적이었습니다. 즉, 구성 정보를 한 번 만들고 다른 시스템으로 내 보내야합니다. 일부 구성은 로컬 조건에 맞게 수정됩니다. 예 : 변경 IP 주소, 등등. 이것은 clunky, 오류가 발생하기 쉬운 접근 방식입니다.

우리는 이제 글로벌 데이터 공유를위한보다 원활한 전략을 가질 수 있지만 여전히 로컬 수정을 허용 할 수있는 기능에 대한 요청을 받고 있습니다.

로컬 수정 비트가 아닌 경우 Oracle의 데이터 복제 기능을 사용할 수 있습니다.

HA 요구 사항으로 인해 하나의 데이터베이스에서 모든 구성을 수행 할 수 없습니다.

다른 누구도이 문제가 발생하여 이것을 위해 좋은 프로그래밍 솔루션을 알아 냈습니까? 부분 또는 전체 솔루션을 설명하는 좋은 논문을 알고 계십니까?

우리는 * nix 기반이며 Oracle을 사용합니다. 변경 사항은 모든 노드에 매우 신속하게 복제되어야합니다 (1 초 또는 2 초).

답변

2

구성을 처리하는 방법을 변경하는 것이 가능한지 잘 모르겠지만 로컬 재정의 개념을 사용하여 이와 비슷한 것을 구현했습니다. 특히, 두 개의 구성 테이블이 동일합니다 (CentralConfig 및 LocalConfig라고 함). CentralConfig는 중앙 위치에서 유지 관리되며 위성 위치로 복제되어 읽기 전용입니다. LocalConfig는 로컬 사이트에서 설정할 수 있습니다. 구성 데이터를 쿼리하는 프로 시저는 먼저 LocalConfig 테이블의 데이터를 찾고 찾지 못한 경우 CentralConfig 테이블에서 검색합니다. 당신은 브이 $ 매개 변수 테이블의 값으로이 작업을 수행하려고 한 경우

예를 들어, SQL 분석에 FIRST_VALUE 기능을 사용하여 구성을 조회 할 수있다 :

SELECT DISTINCT 
     NAME 
     , FIRST_VALUE(VALUE) OVER(PARTITION BY NAME 
            ORDER BY localsort 
           ) VALUE 
    FROM (SELECT t.* 
       , 0 localsort 
      FROM local_parameter t 
      UNION 
      SELECT t.* 
       , 1 localsort 
      FROM v$parameter t 
     ) 
ORDER BY NAME; 

localsort 열을 노동 조합에 local_parameter 값이 v $ 매개 변수 값보다 우선되도록해야합니다.

Google 시스템에서는 사실 이보다 훨씬 더 정교합니다. 찾고있는 매개 변수의 "이름"외에도 찾고있는 컨텍스트를 설명하는 "컨텍스트"열도 있습니다. 예를 들어, 우리는 매개 변수 "timeout"을 중앙 집중식으로 설정할 수 있지만, 심지어 로컬에서는이 값을 사용하는 여러 구성 요소가 있습니다. 그들은 모두 같을 수 있지만, 우리는 그것들을 다르게 설정하기를 원할 수도 있습니다. 따라서 도구가 "제한 시간"값을 조회하면 범위에 따라 제한됩니다. 하지만 모든 종류의 컴포지션 엔진,

CONTEXT  NAME VALUE 
------------- ------- ----- 
Comp Engine A timeout 15 
Comp Engine B timeout 10 
Comp Engine % timeout  5 
%    timeout 30 

이 구성은 위라고는, 모든 구성 요소에 대해, (30)의 타임 아웃을 사용하는 우리는, 우리가 범위에 대한 원하는 것을 정의 할 때 구성 자체에서, 우리는 와일드 카드를 사용할 수있다 , Compress Engines A & B의 경우 제한 시간 5를 사용하십시오. 각각 15 & 10을 사용하십시오.마지막 두 구성은 CentralConfig 유지 될 수 있지만, 다른 두 LocalConfig 유지 될 수 있으며, 이러한 설정은이 방법으로 해결하는 것입니다 : 것을 제외하고 내가 그 번역을 삽입하고있어,

SELECT DISTINCT 
     NAME 
     , FIRST_VALUE(VALUE) OVER(PARTITION BY NAME 
            ORDER BY (TRANSLATE(Context 
                 , '%_' 
                 , CHR(1) || CHR(2) 
              ) DESC 
              , localsort 
           ) VALUE 
    FROM (SELECT t.* 
       , 0 localsort 
      FROM LocalConfig t 
      WHERE 'Comp Engine A' LIKE Context 
      UNION 
      SELECT t.* 
       , 1 localsort 
      FROM CentralConfig t 
      WHERE 'Comp Engine A' LIKE Context 
     ) 
ORDER BY NAME; 

그것은 기본적으로 같은 쿼리를 표현식을 내 localsort 전에 사용하고 Context를 제한하고 있습니다. 그 일은 % 및 _ 문자를 chr (1) & chr (2)로 변환하여 내림차순 정렬에서 영숫자 문자 뒤에 정렬하게합니다. 이런 식으로 명시 적으로 정의 된 "Comp Engine A"는 "Comp Engine %"앞에 올 것이고 "%"앞에옵니다. 컨텍스트가 동일하게 정의 된 경우 로컬 구성이 중앙 컨텍스트보다 우선합니다. 지역 중심이 항상 중앙에서 최우선 순위를 차지하기를 원한다면 중앙 집중도가 더 엄격한 경우에도 두 가지 정렬 조건의 위치를 ​​반대로 바꾸면됩니다.

0

우리가하는 방식은 스티브와 비슷합니다. 먼저 분산 환경에 적용하려는 모든 구성을 저장하기 위해 중앙 구성 서비스가 필요합니다. 구성을 수정할 때마다 중앙 구성 서비스에서 수정하십시오. 각 프로덕션 호스트에서 루프 스크립트를 작성하여 구성을 업데이트 할 수 있습니다. 보다 정교한 솔루션을 사용하려면 모든 서버에 잘못 구성된 일괄 처리가 발생하지 않도록 전략을 설정해야합니다. 어쩌면 당신은 간단한 자물쇠 또는 회색 릴리스 프로세스가 필요합니다.