rabbitmq version: 3.7.15

常用操作

  1. sbin/rabbitmq-server 启动
  2. sbin/rabbitmq-server -detached 后台启动
  3. sbin/rabbitmqctl shutdown/stop 关闭/停止server
  4. sbin/rabbitmqctl status 检查server状态
  5. sbin/rabbitmq-plugins enable rabbitmq_management 开启控制台

端口

  1. server启动后默认监听5672
  2. 控制台默认监听15672

构建集群

构建集群的方式

  1. config文件中声明节点信息
  2. 使用DNS发现
  3. 使用AWS实例发现(通过插件)
  4. 使用kubernetes发现(通过插件)
  5. 使用consul发现(通过插件)
  6. 使用etcd发现(通过插件)
  7. 手动执行rabbitmqctl

节点名称

  • 节点名称是节点的身份识别证明.两部分组成: prefix & hostname.例如 [email protected]prefixrabbit ,hostnamenode1.messaging.svc.local.

  • 集群中名称必须 唯一. 如果使用同一个hostname 那么prefix要保持不一致

  • 集群中,节点通过节点名称互相进行识别和通信.所以hostname必须能解析.CLI Tools也要使用节点名称.

单机集群构建

单机运行多节点需要保证:

  • 不同节点名称 RABBITMQ_NODENAME
  • 不同存储路径 RABBITMQ_DIST_PORT
  • 不同日志路径 RABBITMQ_LOG_BASE
  • 不同端口,包括插件使用的 RABBITMQ_NODE_PORT

rabbitmqctl 构建集群

1
2
3
4
5
6
7
RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit rabbitmq-server -detached
RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=hare rabbitmq-server -detached
# 重置正在运行的节点
rabbitmqctl -n hare stop_app
# 加入集群
rabbitmqctl -n hare join_cluster [email protected]`hostname -s`
rabbitmqctl -n hare start_app

每个节点若配置有其他的插件.那么每个节点插件监听的端口不能冲突,例如添加控制台

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 首先开启控制台插件
./rabbitmq-plugins enable  rabbitmq_management
RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15672}]" RABBITMQ_NODENAME=rabbit ./rabbitmq-server -detached
RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=hare ./rabbitmq-server -detached

# 加入rabbit节点生成集群
rabbitmqctl -n hare stop_app
# 加入集群
rabbitmqctl -n hare join_cluster [email protected]`hostname -s`
rabbitmqctl -n hare start_app

以上就建了带控制台的两个节点.

遇到的问题

  1. 添加节点进集群时,报错
1
2
3
4
5
./rabbitmqctl -n rabbit2 join_cluster [email protected]`hostname -s`

Clustering node [email protected] with [email protected]
Error:
{:inconsistent_cluster, 'Node [email protected] thinks it\'s clustered 	with node [email protected], but [email protected] disagrees'}

集群残留的cluster信息导致认证失败.删除${RABBIT_MQ_HOME}/var/lib/rabbitmq/mnesia文件夹.再reset节点

  1. 建集群报错
1
2
3
Clustering node [email protected] with [email protected]
Error:
{:corrupt_or_missing_cluster_files, {:error, :enoent}, {:error, :enoent}}

同上

  1. 启动第三个节点时爆端口占用,该端口是第一个节点的控制台端口15672.没有解决
1
2019-09-05 15:35:42.749 [error] <0.555.0> Failed to start Ranch listener rabbit_web_dispatch_sup_15672 in ranch_tcp:listen([{cacerts,'...'},{key,'...'},{cert,'...'},{port,15672}]) for reason eaddrinuse (address already in use)

使用案例

Topic Exchange

topic类型的exchange ,routing key 是按一定规则来的,通过.连接,类似于正则.有两种符号:

  • * 代表一个单词
  • # 代表0或多个单词

如果 单单只有#号, 那么topic exchange就像fanout exchange,如果没有使用*#,那就是direct exchange了.

参考

  1. docker hub rabbit mq 镜像