• Русский
  • Управление определениями RabbitMQ

    Определения RabbitMQ описывают конфигурацию брокера, такую как виртуальные хосты, пользователи, разрешения, exchange, очереди, binding, политики, параметры runtime и операторские политики. Используйте определения для проверки, продвижения или начального заполнения topology и конфигурации безопасности между environments.

    Управление определениями не является полноценным механизмом backup и restore. Определения не содержат содержимое очередей, durable message stores, stream data, ресурсы Kubernetes, TLS private keys, хранимые вне RabbitMQ, или конфигурацию приложения.

    Применимые сценарии

    Используйте управление определениями, когда вам нужно:

    • Переносить проверенные определения topology и access-control между environments.
    • Инициализировать cluster disaster recovery теми же виртуальными хостами, пользователями, разрешениями, exchange, очередями, binding, политиками и параметрами runtime.
    • Хранить очищенную topology RabbitMQ как проверяемый конфигурационный артефакт.
    • Сравнивать текущую topology брокера с ожидаемой topology.

    Не используйте export и import определений для восстановления сообщений в очередях.

    Выберите область export

    Export определений может быть cluster-wide или scoped по виртуальному хосту:

    ОбластьВключаетКогда использовать
    Cluster-wide exportВиртуальные хосты, пользователи, разрешения, exchange, очереди, binding, политики, параметры runtime и связанные определения брокера.Вы готовите новое environment или DR cluster, которое должно содержать и topology, и определения access-control.
    Single-vhost exportОпределения, scoped к одному виртуальному хосту, такие как exchange, очереди, binding, политики и параметры.Пользователи, разрешения и целевой виртуальный хост уже существуют, и вам нужно только перенести topology для этого виртуального хоста.

    Точные ключи в экспортируемом файле зависят от версии RabbitMQ и области export. Всегда проверяйте сгенерированный JSON перед import.

    Экспорт определений

    Cluster-wide export

    Выполните cluster-wide export, когда вам нужны и topology, и определения access-control:

    rabbitmqadmin \
      --host <management-host> \
      --port 15672 \
      --username <admin-user> \
      --password <admin-password> \
      export rabbitmq-definitions.json

    Вы также можете выполнить export из RabbitMQ Pod:

    kubectl -n <namespace> exec <instance-name>-server-0 -- \
      rabbitmqctl export_definitions /tmp/rabbitmq-definitions.json

    Копируйте файл из Pod только если ваш operational process требует локальную копию:

    kubectl -n <namespace> cp \
      <instance-name>-server-0:/tmp/rabbitmq-definitions.json \
      ./rabbitmq-definitions.json

    Single-vhost export

    Используйте single-vhost export, когда целевой виртуальный хост, пользователи и разрешения уже управляются отдельно:

    rabbitmqadmin \
      --host <management-host> \
      --port 15672 \
      --username <admin-user> \
      --password <admin-password> \
      --vhost payments \
      export payments-topology.json

    В RabbitMQ 3.8.16 export с областью vhost содержит ключи topology, такие как exchange, очереди, binding, parameters и policies, но не включает users, permissions или записи virtual host. Проверяйте вывод в вашем environment, прежде чем полагаться на файл.

    Проверьте определения перед import

    Перед import определений в другой cluster проверьте файл на наличие:

    • URI upstream, параметров Shovel, параметров Federation или политик, специфичных для сайта.
    • Пользователей или разрешений, которых не должно быть в целевом environment.
    • Аргументов очередей, которые должны отличаться между environments, например TTL сообщений или limits длины очереди.
    • Параметров runtime, которые ссылаются на hostnames основного site.
    • Хэшей паролей и других чувствительных значений, которые необходимо защитить.

    Храните проверенные файлы в контролируемом location. Если вы коммитите определения в Git, сначала удалите значения, специфичные для environment, и secrets.

    Import определений

    Импортируйте проверенный файл в целевой RabbitMQ cluster:

    rabbitmqadmin \
      --host <target-management-host> \
      --port 15672 \
      --username <admin-user> \
      --password <admin-password> \
      import rabbitmq-definitions.json

    Если файл был экспортирован для одного виртуального хоста, укажите тот же целевой виртуальный хост при import:

    rabbitmqadmin \
      --host <target-management-host> \
      --port 15672 \
      --username <admin-user> \
      --password <admin-password> \
      --vhost payments \
      import payments-topology.json

    При import изнутри Pod сначала поместите файл в Pod и выполните:

    kubectl -n <namespace> exec <instance-name>-server-0 -- \
      rabbitmqctl import_definitions /tmp/rabbitmq-definitions.json

    Проверьте импортированные определения

    Проверьте topology:

    rabbitmqadmin \
      --host <target-management-host> \
      --port 15672 \
      --username <admin-user> \
      --password <admin-password> \
      --vhost payments \
      list exchanges name type durable
    
    rabbitmqadmin \
      --host <target-management-host> \
      --port 15672 \
      --username <admin-user> \
      --password <admin-password> \
      --vhost payments \
      list queues name durable policy arguments
    
    rabbitmqadmin \
      --host <target-management-host> \
      --port 15672 \
      --username <admin-user> \
      --password <admin-password> \
      --vhost payments \
      list bindings source_name destination_name routing_key

    Если вы импортировали cluster-wide definitions, также проверьте объекты access-control:

    rabbitmqadmin \
      --host <target-management-host> \
      --port 15672 \
      --username <admin-user> \
      --password <admin-password> \
      list vhosts name
    
    rabbitmqadmin \
      --host <target-management-host> \
      --port 15672 \
      --username <admin-user> \
      --password <admin-password> \
      list users name tags
    
    rabbitmqadmin \
      --host <target-management-host> \
      --port 15672 \
      --username <admin-user> \
      --password <admin-password> \
      list permissions user vhost configure write read

    Связанная информация