22

我想默认为我的所有队列定义镜像。我目前必须在节点启动后使用:rabbitmqctl

rabbitmqctl set_policy ha-all "" '{"ha-mode":"all"}'

如果我的一个节点发生故障,我必须记住在重新启动时重新执行该代码。

有没有办法自动配置我的节点以使用镜像队列?

4

5 回答 5

26

策略可以在定义文件中指定,可以从您的配置文件中引用。

我如何设置特定策略的示例(不确定是否可以在策略中指定 ha):

/etc/rabbitmq/rabbitmq.config

[
{rabbit,
    [{vm_memory_high_watermark, 0.8}]
},
{rabbitmq_management,
    [{listener, [{port, 15672}]},
     {load_definitions, "/etc/rabbitmq/rabbitmq_definitions.json"},
     {http_log_dir, "/var/log/rabbitmq/management_http.log"}]
}
].

/etc/rabbitmq/rabbitmq_definitions.json

{       "users":[
            {"name":"rabbot","password_hash":"Cvse5iGOg20UqUq7Za9D1tatOJnMVDru4GHtxqc02g7zj5ur","tags":""},
            {"name":"rabnet","password_hash":"CqqG2fwvH6xz64NpibGJx2M7ZCyFnR1BQBM+C0KH2qRPmVxF","tags":"administrator"}],
    "vhosts":[
            {"name":"/"}],
    "permissions":[
            {"user":"viabot","vhost":"VIA","configure":".*","write":".*","read":".*"},
            {"user":"vianet","vhost":"VIA","configure":".*","write":".*","read":".*"}],
    "parameters":[],
    "policies":[
            {"vhost":"VIA","name":"DLX","pattern":".*","apply-to":"queues","definition":{"dead-letter-exchange":"dead_letter"},"priority":0}
            ],
    "queues":[
            {"name":"store_to_es","vhost":"VIA","durable":true,"auto_delete":false,"arguments":{}},
            {"name":"store_to_mongodb","vhost":"VIA","durable":true,"auto_delete":false,"arguments":{}}
            ],
    "exchanges":[
            {"name":"data_incoming","vhost":"VIA","type":"fanout","durable":true,"auto_delete":false,"internal":false,"arguments":{}},
            {"name":"sms_incoming","vhost":"VIA","type":"fanout","durable":true,"auto_delete":false,"internal":false,"arguments":{}}
            ],
    "bindings":[
            {"source":"data_incoming","vhost":"VIA","destination":"store_to_es","destination_type":"queue","routing_key":"","arguments":{}},
            {"source":"sms_incoming","vhost":"VIA","destination":"store_to_mongodb","destination_type":"queue","routing_key":"","arguments":{}}
    ]
}

我正在共享此配置文件和定义文件,因为无法从 RabbitMQ 网站找出它。

注意:此配置适用于在 Ubuntu 14.04 上运行的 RabbitMQ 3.6.1  

于 2016-04-29T06:22:13.543 回答
13

要为IvanD 的答案添加更多详细信息,我就是这样做的。

首先:(sudo nano /etc/rabbitmq/rabbitmq.config此命令可能因您的操作系统而异)

[
  {rabbit,
    [
        {default_vhost,<<"/">>},
        {default_user,<<"someuser">>},
        {default_pass,<<"somepassword">>},
        {default_permissions, [<<".*">>, <<".*">>, <<".*">>]},
        {default_user_tags, [administrator]}
    ]
  },
  {rabbitmq_management,
    [{listener, [{port, 15672}]},
        {load_definitions, "/etc/rabbitmq/rabbitmq_definitions.json"},
        {http_log_dir, "/var/log/rabbitmq/management_http.log"}]
  }
].

然后创建额外的 json:(sudo nano /etc/rabbitmq/rabbitmq_definitions.json此命令可能因您的操作系统而异)。其内容:

{
  "vhosts":[
        {"name":"/"}
  ],
  "policies":[
        {"vhost":"/","name":"ha","pattern":"", "definition":{"ha-mode":"all","ha-sync-mode":"automatic","ha-sync-batch-size":5}}
  ]
}

重要提示:ha-sync-batch-size 仅在 3.6.0 以上的 RabbitMQ 版本中受支持!https://www.rabbitmq.com/ha.html#sync-batch-size 如果您的 Rabbit 比这更老,请从rabbitmq_definitions.json.

我正在使用 Ubuntu 14.04 Trusty 和 RabbitMQ v.3.6.2。

于 2016-06-28T08:54:21.440 回答
9

是的,您可以在加载时使用定义导入直接在重新启动时加载策略、队列、交换、绑定、用户等等

  1. 预先配置你的兔子

    转到http://localhost:15672Admin -> Policies 页面并创建您需要的新策略:

    制定新政策

    您还可以预先配置队列和其他东西。

  2. 转储定义

    curl -s -H "Accept:application/json" -u guest:guest http://localhost:15672/api/definitions > definitions.json

    您还可以使用 Web 界面转储您的定义。打开概览选项卡,向下滚动:

    下载定义

    (!!!) Alter definitions.json,以便仅在重新启动时保留您需要的东西。

    将有您的政策部分,保留它:

    ...
    "policies": [
      {
        "vhost": "/",
        "name": "ha-all",
        "pattern": "",
        "apply-to": "all",
        "definition": {
          "ha-mode": "all"
        },
        "priority": 0
      }
    ]
    ...
    
  3. 重新启动时加载定义

    把它放在definitions.json你的兔子附近,并将这条线添加到rabbit.conf. 无需使用旧格式:

    management.load_definitions = /path/to/definitions.json
    

为了在重启后加载一些东西,请使用cli tools


向@IvanD 致敬,因为我的答案与他自己的答案几乎相同,但揭示了详细的步骤和新的配置格式用法。评论空间不够。

于 2020-08-20T09:43:19.993 回答
2

无法在rabbitmq.config文件中设置策略。一种解决方法是使用 init 脚本启动 rmq 并将rabbitmqctl命令放入其中,以便在 rmq 启动或重新启动时运行它。

于 2015-07-30T17:01:03.967 回答
1

最后我发现了一些有用的东西:不需要 configMap 或 rabbitmq.config 文件。在下面

containers:
...
...
...

    lifecycle:
              postStart:
                exec:
                  command: ["/bin/sh","-c","rabbitmq-plugins --offline enable rabbitmq_management;until rabbitmqctl node_health_check; do  sleep 5;done;rabbitmqctl set_policy ha-all \".\" '{\"ha-mode\":\"all\", \"ha-sync-mode\":\"automatic\"}' --apply-to all --priority 0;"]
于 2020-02-25T17:08:09.903 回答