概念介紹
AMQP 當中有四個概念非常重要:虛擬主機( virtual host )衩椒,交換機( exchange )骂维,隊列(queue )和綁定( binding )惹资。
虛擬主機( virtual host ):一個虛擬主機持有一組交換機、隊列和綁定航闺。為什么需要多個虛擬主機呢布轿? RabbitMQ 當中,用戶只能在虛擬主機的粒度進行權(quán)限控制来颤。因此,如果需要禁止 A 組訪問 B 組的交換機 / 隊列 / 綁定稠肘,必須為 A 和 B 分別創(chuàng)建一個虛擬主機福铅。每一個 RabbitMQ 服務(wù)器都有一個默認的虛擬主機 “/” 。
隊列( Queue ):由消費者建立的项阴,是 messages 的終點滑黔,可以理解成裝消息的容器笆包。消息一直存在隊列里,直到有客戶端或者稱為 Consumer 消費者連接到這個隊列并將 message 取走為止略荡。隊列可以有多個庵佣。
交換機( Exchange ):可以理解成具有路由表的路由程序。每個消息都有一個路由鍵( routing key )汛兜,就是一個簡單的字符串巴粪。交換機中有一系列的綁定( binding ),即路由規(guī)則( routes )粥谬。交換機可以有多個肛根。多個隊列可以和同一個交換機綁定,同時多個交換機也可以和同一個隊列綁定漏策。(多對多的關(guān)系)
三種交換機:
Fanout Exchange (不處理路由鍵):一個發(fā)送到交換機上的消息都會被轉(zhuǎn)發(fā)到與該交換機綁定的所有隊列上派哲。 Fanout 交換機發(fā)消息是最快的。
Direct Exchange (處理路由鍵):如果一個隊列綁定到該交換機上掺喻,并且當前要求路由鍵為 X 芭届,只有路由鍵是 X 的消息才會被這個隊列轉(zhuǎn)發(fā)。
Topic Exchange (將路由鍵和某模式進行匹配感耙,可以理解成模糊處理):路由鍵的詞由 “.”隔開褂乍,符號 “#” 表示匹配 0 個或多個詞,符號 “” 表示匹配不多不少一個詞抑月。因此 “ audit.# ” 能夠匹配到 “ audit.irs.corporate ” 树叽,但是 “ audit. ” 只會匹配到 “ audit.irs ”
幾個概念說明:
Broker:簡單來說就是消息隊列服務(wù)器實體。
Exchange:消息交換機谦絮,它指定消息按什么規(guī)則题诵,路由到哪個隊列。
Queue:消息隊列載體层皱,每個消息都會被投入到一個或多個隊列性锭。
Binding:綁定,它的作用就是把exchange和queue按照路由規(guī)則綁定起來叫胖。
Routing Key:路由關(guān)鍵字草冈,exchange根據(jù)這個關(guān)鍵字進行消息投遞。
vhost:虛擬主機瓮增,一個broker里可以開設(shè)多個vhost怎棱,用作不同用戶的權(quán)限分離。
producer:消息生產(chǎn)者绷跑,就是投遞消息的程序拳恋。
consumer:消息消費者,就是接受消息的程序砸捏。
channel:消息通道谬运,在客戶端的每個連接里隙赁,可建立多個channel,每個channel代表一個會話任務(wù)梆暖。
消息隊列的使用過程大概如下:
客戶端連接到消息隊列服務(wù)器伞访,打開一個channel。
客戶端聲明一個exchange轰驳,并設(shè)置相關(guān)屬性厚掷。
客戶端聲明一個queue,并設(shè)置相關(guān)屬性滑废。
客戶端使用routing key蝗肪,在exchange和queue之間建立好綁定關(guān)系。
客戶端投遞消息到exchange蠕趁。
exchange接收到消息后薛闪,就根據(jù)消息的key和已經(jīng)設(shè)置的binding,進行消息路由俺陋,將消息投遞到一個或多個隊列里豁延。
高可用配置
配置文件:rabbitmq.config
[
# 集群(CLustering)監(jiān)聽地址配置。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的默認服務(wù)端口配置腊状,監(jiān)聽AMQP connections
{rabbit, [
{tcp_listeners, [
{"192.168.102.15", 5672}
]},
# rabbitmq cluster诱咏,不能在cluster內(nèi)處理network partitions,因而不推薦在wan中使用缴挖,僅用于lan袋狞。
#對跨網(wǎng)段的節(jié)點異常處理,autoheal指如果在出現(xiàn)問題的場景下映屋,除了競爭勝出的網(wǎng)段之外苟鸯,其他網(wǎng)段的節(jié)點都會重啟rabbitmq服務(wù)。
{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 ,環(huán)境變量
# 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瘫析,因為還有一個節(jié)點配成了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}
]
}