概念介绍
AMQP 当中有四个概念非常重要:虚拟主机( virtual host ),交换机( exchange ),队列(queue )和绑定( binding )。
虚拟主机( virtual host ):一个虚拟主机持有一组交换机、队列和绑定。为什么需要多个虚拟主机呢? RabbitMQ 当中,用户只能在虚拟主机的粒度进行权限控制。因此,如果需要禁止 A 组访问 B 组的交换机 / 队列 / 绑定,必须为 A 和 B 分别创建一个虚拟主机。每一个 RabbitMQ 服务器都有一个默认的虚拟主机 “/” 。
队列( Queue ):由消费者建立的,是 messages 的终点,可以理解成装消息的容器。消息一直存在队列里,直到有客户端或者称为 Consumer 消费者连接到这个队列并将 message 取走为止。队列可以有多个。
交换机( Exchange ):可以理解成具有路由表的路由程序。每个消息都有一个路由键( routing key ),就是一个简单的字符串。交换机中有一系列的绑定( binding ),即路由规则( routes )。交换机可以有多个。多个队列可以和同一个交换机绑定,同时多个交换机也可以和同一个队列绑定。(多对多的关系)
三种交换机:
Fanout Exchange (不处理路由键):一个发送到交换机上的消息都会被转发到与该交换机绑定的所有队列上。 Fanout 交换机发消息是最快的。
Direct Exchange (处理路由键):如果一个队列绑定到该交换机上,并且当前要求路由键为 X ,只有路由键是 X 的消息才会被这个队列转发。
Topic Exchange (将路由键和某模式进行匹配,可以理解成模糊处理):路由键的词由 “.”隔开,符号 “#” 表示匹配 0 个或多个词,符号 “” 表示匹配不多不少一个词。因此 “ audit.# ” 能够匹配到 “ audit.irs.corporate ” ,但是 “ audit. ” 只会匹配到 “ audit.irs ”
几个概念说明:
Broker:简单来说就是消息队列服务器实体。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
producer:消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
消息队列的使用过程大概如下:
客户端连接到消息队列服务器,打开一个channel。
客户端声明一个exchange,并设置相关属性。
客户端声明一个queue,并设置相关属性。
客户端使用routing key,在exchange和queue之间建立好绑定关系。
客户端投递消息到exchange。
exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。
高可用配置
配置文件:rabbitmq.config
[
# 集群(CLustering)监听地址配置。Port used for inter-node and CLI tool communition
{kernel, [
{inet_dist_use_interface, {192,168,102,15}},
{inet_dist_listen_min, 25672},
{inet_dist_listen_max, 25672}
]},
# rabbit的默认服务端口配置,监听AMQP connections
{rabbit, [
{tcp_listeners, [
{"192.168.102.15", 5672}
]},
# rabbitmq cluster,不能在cluster内处理network partitions,因而不推荐在wan中使用,仅用于lan。
#对跨网段的节点异常处理,autoheal指如果在出现问题的场景下,除了竞争胜出的网段之外,其他网段的节点都会重启rabbitmq服务。
{cluster_partition_handling, autoheal} ]},
# rabbitmq管理插件,可以访问http://192.168.102.15:15672 访问web页面,
# 在haproxy对该组件做了高可用
{rabbitmq_management, [
{listener, [
{ip, "192.168.102.15"},
{port, 15672}
]},
{load_definitions, "/etc/rabbitmq/definitions.json"}
]},
# rabbitmq集群化配置
{rabbitmq_clusterer, [{config, "/etc/rabbitmq/rabbitmq-clusterer.config"}]}].
% EOF
文件enabled_plugins
#enabled的插件
[rabbitmq_clusterer,rabbitmq_management].
文件rabbitmq-env.conf ,环境变量
# The node name should be unique per erlang-node-and-machine combination. To run multiple nodes, see the clustering guide.
RABBITMQ_NODENAME=rabbit
RABBITMQ_BOOT_MODULE=rabbit_clusterer
# Additional parameters for the erlcommand used when invoking the RabbitMQ Server
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-pa /usr/lib/rabbitmq/lib/rabbitmq_server-3.6/plugins/rabbitmq_clusterer-3.6.x.ez/rabbitmq_clusterer-3.6.x-667f92b0/ebin"
RABBITMQ_LOG_BASE=/var/log/kolla/rabbitmq
export ERL_EPMD_PORT=4369
文件rabbitmq-clusterer.config
[
# 这里的版本配置成了2,因为还有一个节点配成了1,不同相同
{version, 2},
{nodes, [
{'rabbit@controller01', disc}, {'rabbit@compute01', disc} ]},
{gospel,
{node, 'rabbit@controller01'}}
].
文件definitions.json
{
\# virtual host名称配置,和aparche的vhosts类似
"vhosts": [
{"name": "/"}
],
"users": [
{"name": "openstack", "password": "cYhhGc6Gj0XMmY1p4Spj83Ms7cafzYT4wdM6y6d9", "tags": "administrator"}
],
"permissions": [
{"user": "openstack", "vhost": "/", "configure": ".*", "write": ".*", "read": ".*"}
],
#queue 可以通过[ policy]对镜像功能进行控制。以下配置的意思通过建立policy来建立自动形成镜像队列
#该高可用集群配置部署是镜像模式,active/active的模式。
"policies":[
{"vhost": "/", "name": "ha-all", "pattern": ".*", "apply-to": "all", "definition": {"ha-mode":"all"}, "priority":0}
]
}