服務(wù)器主機(jī)名與IP列表:
mq136 172.28.2.136
mq137 172.28.2.137
mq164 172.28.2.164
mq165 172.28.2.165
在各節(jié)點(diǎn)服務(wù)器上作好hosts解析
cat >>/etc/hosts/<<EOF
mq136 172.28.2.136
mq137 172.28.2.137
mq164 172.28.2.164
mq165 172.28.2.165
EOF
一、簡介
RabbitMQ是流行的開源消息隊(duì)列系統(tǒng),用erlang語言開發(fā)。Erlang的分布式通訊安全策略,可以歸結(jié)為 All or None。。RabbitMQ是AMQP(高級消息隊(duì)列協(xié)議)的標(biāo)準(zhǔn)實(shí)現(xiàn)。RabbitMQ的結(jié)構(gòu)圖如下:
幾個概念說明:
Broker:簡單來說就是消息隊(duì)列服務(wù)器實(shí)體。
Exchange:消息交換機(jī),它指定消息按什么規(guī)則,路由到哪個隊(duì)列。
Queue:消息隊(duì)列載體,每個消息都會被投入到一個或多個隊(duì)列。
Binding:綁定,它的作用就是把exchange和queue按照路由規(guī)則綁定起來。
Routing Key:路由關(guān)鍵字,exchange根據(jù)這個關(guān)鍵字進(jìn)行消息投遞。
vhost:虛擬主機(jī),一個broker里可以開設(shè)多個vhost,用作不同用戶的權(quán)限分離。
producer:消息生產(chǎn)者,就是投遞消息的程序。
consumer:消息消費(fèi)者,就是接受消息的程序。
channel:消息通道,在客戶端的每個連接里,可建立多個channel,每個channel代表一個會話任務(wù)。
消息隊(duì)列的使用過程大概如下:
(1)客戶端連接到消息隊(duì)列服務(wù)器,打開一個channel。
(2)客戶端聲明一個exchange,并設(shè)置相關(guān)屬性。
(3)客戶端聲明一個queue,并設(shè)置相關(guān)屬性。
(4)客戶端使用routing key,在exchange和queue之間建立好綁定關(guān)系。
(5)客戶端投遞消息到exchange。
exchange接收到消息后,就根據(jù)消息的key和已經(jīng)設(shè)置的binding,進(jìn)行消息路由,將消息投遞到一個或多個隊(duì)列里。
exchange也有幾個類型,完全根據(jù)key進(jìn)行投遞的叫做Direct交換機(jī),例如,綁定時設(shè)置了routing key為”abc”,那么客戶端提交的消息,只有設(shè)置了key為”abc”的才會投遞到隊(duì)列。對key進(jìn)行模式匹配后進(jìn)行投遞的叫做Topic交換機(jī),符號”#”匹配一個或多個詞,符號”*”匹配正好一個詞。例如”abc.#”匹配”abc.def.ghi”,”abc.*”只匹配”abc.def”。還有一種不需要key的,叫做Fanout交換機(jī),它采取廣播模式,一個消息進(jìn)來時,投遞到與該交換機(jī)綁定的所有隊(duì)列。
RabbitMQ支持消息的持久化,也就是數(shù)據(jù)寫在磁盤上,為了數(shù)據(jù)安全考慮,我想大多數(shù)用戶都會選擇持久化。消息隊(duì)列持久化包括3個部分:
(1)exchange持久化,在聲明時指定durable => 1
(2)queue持久化,在聲明時指定durable => 1
(3)消息持久化,在投遞時指定delivery_mode => 2(1是非持久化)
如果exchange和queue都是持久化的,那么它們之間的binding也是持久化的。如果exchange和queue兩者之間有一個持久化,一個非持久化,就不允許建立綁定。
下面我們再了解下消息隊(duì)列RabbitMQ集群,由于RabbitMQ是用erlang開發(fā)的,RabbitMQ 完全依賴 Erlang 的Cluster,而Erlang集群非常方便,因此配置RabbitMQ集群變得非常簡單。
RabbitMQ的集群節(jié)點(diǎn)包括內(nèi)存節(jié)點(diǎn)、磁盤節(jié)點(diǎn)。顧名思義內(nèi)存節(jié)點(diǎn)就是將所有數(shù)據(jù)放在內(nèi)存,磁盤節(jié)點(diǎn)將數(shù)據(jù)放在磁盤。不過,如前文所述,如果在投遞消息時,打開了消息的持久化,那么即使是內(nèi)存節(jié)點(diǎn),數(shù)據(jù)還是安全的放在磁盤。
良好的設(shè)計(jì)架構(gòu)可以如下:在一個集群里,有3臺以上機(jī)器,其中1臺使用磁盤模式,其它使用內(nèi)存模式。其它幾臺為內(nèi)存模式的節(jié)點(diǎn),無疑速度更快,因此客戶端(consumer、producer)連接訪問它們。而磁盤模式的節(jié)點(diǎn),由于磁盤IO相對較慢,因此僅作數(shù)據(jù)備份使用。
二、各節(jié)點(diǎn)安裝rabbitmq
安裝非常簡單,只需幾步搞定:
1. 安裝epel源
rpm -ivh http:
wget -O /etc/yum.repos.d/epel-erlang.repo http:
2. 安裝erlang
yum install erlang xmlto git -y
rpm --import http:
3. 安裝rabbitmq
可以選擇用yum安裝,也可以選擇下載rpm包安裝,也可以用源碼編譯安裝!
下載地址: http://www./download.html
本文選擇rpm包安裝:
wget http:
rpm -ivh rabbitmq-server-2.8.6.noarch.rpm
4. 啟動各節(jié)點(diǎn)rabbitmq,并驗(yàn)證啟動情況
[root@mq136 ~]# rabbitmq-server --detached &
[root@mq136 ~]# ps aux |grep rabbitmq
rabbitmq 1394 0.0 0.0 10828 540 ? S Oct08 0:11 /usr/lib64/erlang/erts-5.8.5/bin/epmd -daemon
root 2483 0.0 0.0 103244 836 pts/1 S+ 17:40 0:00 grep rabbitmq
rabbitmq 5657 6.3 1.9 2224044 157200 ? Sl Oct08 959:17 /usr/lib64/erlang/erts-5.8.5/bin/beam.smp -W w -K true -A30 -P 1048576 -- -root /usr/lib64/erlang -progname erl -- -home /var/lib/rabbitmq -- -noshell -noinput -sname rabbit@mq136 -boot /var/lib/rabbitmq/mnesia/rabbit@mq136-plugins-expand/rabbit -kernel inet_default_connect_options [{nodelay,true}] -sasl errlog_type error -sasl sasl_error_logger false -rabbit error_logger {file,"/var/log/rabbitmq/rabbit@mq136.log"} -rabbit sasl_error_logger {file,"/var/log/rabbitmq/rabbit@mq136-sasl.log"} -os_mon start_cpu_sup false -os_mon start_disksup false -os_mon start_memsup false -mnesia dir"/var/lib/rabbitmq/mnesia/rabbit@mq136" -noshell -noinput
rabbitmq 5698 0.0 0.0 10788 520 ? Ss Oct08 0:00 inet_gethost 4
rabbitmq 5699 0.0 0.0 12892 692 ? S Oct08 0:00 inet_gethost 4
rabbitmq 11446 0.0 0.0 12892 680 ? S Oct13 0:00 inet_gethost 4
[root@mq136 ~]# lsof -i:5672
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
beam.smp 5657 rabbitmq 18u IPv4 5879364 0t0 TCP *:amqp (LISTEN)
三、集群配置
集群環(huán)境說明:
mq136作為磁盤節(jié)點(diǎn),其它所有節(jié)點(diǎn)都作為內(nèi)存節(jié)點(diǎn)!
1. 在各節(jié)點(diǎn)創(chuàng)建加入集群腳本
mq136:
cat >>/home/zjqui/scripts/cluster.sh<<EOF
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl cluster
rabbitmqctl start_app
EOF
mq137:
cat >>/home/zjqui/scripts/cluster.sh<<EOF
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl cluster rabbit@mq136
rabbitmqctl start_app
EOF
mq164:
cat >>/home/zjqui/scripts/cluster.sh<<EOF
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl cluster rabbit@mq136
rabbitmqctl start_app
EOF
mq165:
cat >>/home/zjqui/scripts/cluster.sh<<EOF
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl cluster rabbit@mq136
rabbitmqctl start_app
EOF
2. 各節(jié)點(diǎn)加入集群環(huán)境
[root@mq136 ~]# chmod +x /home/zjqui/scripts/cluster.sh
啟動腳本順序:先運(yùn)行mq136節(jié)點(diǎn)集群腳本,然后再運(yùn)行其它節(jié)點(diǎn)集群腳本:
[root@mq136 ~]# /home/zjqui/scripts/cluster.sh
各節(jié)點(diǎn)運(yùn)行成功后,查看集群整體狀態(tài):
[root@mq136 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq136 ...
[{nodes,[{disc,[rabbit@mq136]},
{ram,[rabbit@mq165,rabbit@mq164,rabbit@mq137]}]},
{running_nodes,[rabbit@mq164,rabbit@mq165,rabbit@mq137,rabbit@mq136]}]
...done.
可以看到mq136作為disc節(jié)點(diǎn),其它節(jié)點(diǎn)是ram節(jié)點(diǎn)!集群簡單配置到此完成??!