Использование Consul для управления конфигурацией Dynami c - PullRequest
0 голосов
/ 12 июля 2020

Я работаю над разработкой небольшого проекта, в котором мне нужно использовать Consul для управления конфигурацией приложения динамическим c способом, чтобы все мои компьютеры с приложениями могли получать конфигурацию одновременно без каких-либо проблема несоответствия. Мы уже используем Consul для обнаружения служб, поэтому я читал об этом больше, и похоже, что у них есть хранилище Key/Value, которое я могу использовать для управления своими конфигурациями.

Все наши конфигурации: json файл, поэтому мы создаем zip-файл со всеми нашими json файлами конфигурации в нем и сохраняем ссылку, откуда вы можете загрузить этот zip-файл с определенным ключом в Consul Key/Value store. И всем нашим машинам приложений необходимо загрузить этот zip-файл из этой ссылки (упомянутой в ключе в Consul) и сохранить его на диске на каждой машине приложения. Теперь мне нужно, чтобы все компьютеры с приложениями переключились на эту новую конфигурацию примерно в одно и то же время, чтобы избежать проблем с несогласованностью. configs, а затем переключитесь на новые конфигурации одновременно атомарно, чтобы избежать несогласованности (поскольку они принимают трафик c). Ниже приведены шаги, которые я придумал, но я не понимаю, как будет работать загрузка новых файлов в память вместе с переключением на новые конфигурации:

  1. Все 10 компьютеров уже запущены и работают с файлами конфигурации по умолчанию, как
  2. Какой-то внешний процесс обновит ключ в моем хранилище ключей / значений консула последней ссылкой на zip-файл.
  3. На всех 10 машинах есть часы. это key, поэтому, как только кто-то обновит value из key, часы будут запущены, а затем все эти 10 машин загрузят zip-файл на диск и распакуют его, чтобы получить все файлы конфигурации.
  4. (..)
  5. (..)
  6. (..)

Вот здесь я не понимаю, как должны работать оставшиеся шаги.

  • Как приложения должны загружать эти файлы конфигурации в память, а затем переключаться все одновременно?
  • Нужно ли мне использовать leadership election с консулом или чем-то еще, чтобы достичь чего-либо из этих вещей ?
  • Какой будет логи c, поскольку все 10 приложений уже работают с конфигурациями по умолчанию в памяти (которая также хранится на диске). Нужны ли нам два отдельных каталога: один со значением по умолчанию, а другой для новых конфигураций, а затем работать с этими двумя каталогами? ошибаюсь здесь) -
    {"path":"path-to-new-config", "machines":"ip1:ip2:ip3:ip4:ip5:ip6:ip7:ip8:ip9:ip10", ...}
    

    где path будет иметь новую ссылку на zip-файл, а machines может быть ключом здесь, где я могу получить список всех машин, поэтому теперь я могу указать IP-адрес каждой машины как только они успешно загрузили файл в этом ключе? И как только список ключей machines будет иметь размер 10, я могу сказать, что мы готовы к переключению? Если да, то как я могу атомарно обновить ключи машин в этом узле? Может этот лог c здесь не тот но я просто хотел что-то выкинуть. А также необходимо очистить список всех этих машин после переключения, поскольку для следующего обновления конфигурации мне нужно проделать подобное упражнение. машины динамически и в то же время избегают проблемы несогласованности? Может быть, мне нужен еще один узел как status, который может содержать подробную информацию о каждой конфигурации машины, когда она загружена, когда она переключилась и другие подробности?

1 Ответ

1 голос
/ 23 июля 2020

Я могу придумать несколько возможных решений, в зависимости от вашего сценария.

Самое простое решение - не хранить вашу конфигурацию в памяти и в файлах вообще, просто сохраните конфигурацию непосредственно в хранилище consul kv. И я не говорю об одном ключе, который отображается на весь json (я предполагаю, что ваш json большой, иначе вы бы его не заархивировали), а о извлечении меньших наборов ключей / значений из json (таким образом вам не нужно будет вытаскивать все это каждый раз, когда вы делаете запрос консулу). Если вы получаете конфигурацию напрямую от consul, ваша согласованность гарантирует соответствие консистентности . Я предполагаю, что вы беспокоитесь о производительности, если потеряете конфигурацию в памяти, это то, что вам нужно измерить. Однако если вы можете смириться с потерей производительности, это избавит вас от многих проблем.

Если производительность здесь является проблемой, можно использовать fsconsul . При этом вы все равно извлечете свой json в несколько наборов ключей / значений в consul, а затем fsconsul сопоставит это с файлами для ваших приложений.

Если это не указано в таблице, тогда вопрос в том, как вы готовы мириться с множеством несоответствий. Если вы можете выдержать несколько секунд несоответствий, лучше всего поставить TTL (время жизни) в конфигурацию в памяти. У вас по-прежнему будут часы на consul, но вы объедините их с удалением кеша в памяти каждые несколько секунд в качестве запасного варианта на случай, если часы по какой-то причине выйдут из строя (или остановятся). Это должно дать вам в худшем случае несколько несоответствий (в зависимости от значения, которое вы установили для своего TTL), но в обычном случае (я думаю) должно быть быстро.

Если это неприемлемо (загрузка zip-архива выполняется много времени, может быть?), вы можете go по указанному вами маршруту. Чтобы обновить значение атомарно, вы можете использовать их операцию cas (check-and-set) . Вы получите сообщение об ошибке, если обновление произошло в период между отправкой запроса и попыткой его применения консулом. Затем вам нужно вытащить список машин, снова применить ваши изменения и повторить попытку (пока не получится).

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

...