Вопрос

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

Ни одна из установок «не знает» ни о какой другой установке.

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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;

Это в основном тот же запрос, за исключением того, что я вставляю это переводить выражение перед местным дором, и я ограничиваю контекст. Что он делает, так это преобразование символов % и _ в CHR (1) и CHR (2), что заставит их сортировать после буквенно -цифровых символов в нисходящем виде. Таким образом, явно определенная «Comp Engine A» будет представлен до «Comp Engine %», который, в свою очередь, будет до этого « %». В тех случаях, когда контексты определяются одинаково, локальная конфигурация имеет приоритет над центральными; Если бы вы хотели, чтобы местные жители всегда были центральными, даже в тех случаях, когда Централ был более тесно, вы просто изменили бы позиции двух сортов.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top