2009-08-07 5 views
1

Одна установка нашего продукта хранит его конфигурацию в наборе таблиц базы данных.Где Как хранить данные распределенной конфигурации

Ни одна из установок не знает о какой-либо другой установке.

Для клиентов всегда установлено множество копий нашего продукта в разных центрах обработки данных, которые географически далеко друг от друга. Это означает, что информация о конфигурации должна быть создана один раз, а затем экспортирована в другие системы. Затем некоторые из конфигураций изменяются в соответствии с местными условиями. например изменение IP-адресов и т. д. Это неуклюжий, подверженный ошибкам подход.

Теперь мы получаем запросы на возможность иметь более бесшовную стратегию для обмена глобальными данными, но при этом допускаем локальные модификации.

Если бы не бит локальных изменений, мы могли бы использовать функции репликации данных Oracle.

Из-за требований HA, имеющих всю конфигурацию в одной базе данных, это не вариант.

Неужели кто-нибудь еще столкнулся с этой проблемой, и вы когда-нибудь задумывались о хорошем программном решении для этого? Знаете ли вы о хороших документах, которые могли бы описать частичное или полное решение?

Мы основаны на nix и используем Oracle. Изменения должны быть скопированы на все узлы довольно быстро (секунда или 2).

ответ

2

Я не уверен, насколько это возможно для вас, чтобы изменить способ обработки вашей конфигурации, но мы реализовали нечто похожее на это, используя идею локальных переопределений. В частности, у вас есть две таблицы конфигурации, которые идентичны (назовите их CentralConfig и LocalConfig). CentralConfig поддерживается в центральном месте и реплицируется в ваши спутниковые местоположения, где он доступен только для чтения. LocalConfig можно настроить на локальном сайте. Ваша процедура, которая запрашивает данные конфигурации, сначала ищет данные в таблице LocalConfig, а если не найдена, извлекает ее из таблицы CentralConfig.

Например, если вы пытаетесь сделать это со значениями в таблице v $ параметров, вы можете запросить конфигурацию с помощью функции FIRST_VALUE в аналитике SQL:

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 $.

В нашей системе это на самом деле гораздо сложнее, чем это. В дополнение к «имени» для параметра, который вы просматриваете, у нас также есть столбец «контекст», который описывает контекст, который мы ищем. Например, у нас может быть параметр «timeout», который устанавливается централизованно, но даже локально мы имеем несколько компонентов, которые используют это значение. Все они могут быть одинаковыми, но мы также можем настроить их по-разному. Поэтому, когда инструмент просматривает значение «тайм-аут», он также ограничивает объем. В самой конфигурации, можно использовать подстановочные знаки, когда мы определяем, что мы хотим для применения, например:

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

Конфигурация выше говорит, для всех компонентов, использовать тайм-аут 30, но для Comp двигателей любого типа , используйте тайм-аут 5, однако для двигателей Comp A & B используйте 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, и я ограничиваю контекст. Он делает преобразование символов% и _ в chr (1) & chr (2), что сделает их сортировкой по алфавитно-цифровым символам в нисходящей сортировке. Таким образом, явно определенный «Comp Engine A» появится перед «Comp Engine%», который, в свою очередь, будет представлен до «%». В случаях, когда контексты определены одинаково, локальная конфигурация имеет приоритет над центральными; если вы хотите, чтобы местный всегда ковырялся в центре, даже в тех случаях, когда центральная область была охвачена более жестко, вы просто изменили бы позиции двух типов сортировки.

0

То, как мы это делаем, похоже на Стива. Сначала вам нужна служба централизованного конфигурирования, чтобы сохранить все настройки, которые вы хотите применить к распределенной среде. Каждый раз, когда вы хотите изменить конфигурацию, измените его в службе централизованного конфигурирования. На каждом рабочем хосте вы можете написать сценарий цикла для обновления конфигурации. Для более сложного решения вам необходимо настроить некоторую стратегию, чтобы избежать неправильной настройки пакета на всех серверах, что было бы катастрофой. Возможно, вам нужен простой замок или серый процесс выпуска.

Смежные вопросы