生產環境:html
CentOS 6.3 x86_64node
服務器主機名與IP列表:git
mq136 172.28.2.136
mq137 172.28.2.137
mq164 172.28.2.164
mq165 172.28.2.165
shell
在各節點服務器上做好hosts解析安全
cat >>/etc/hosts/<<EOF 服務器
mq136 172.28.2.136 架構
mq137 172.28.2.137 app
mq164 172.28.2.164 分佈式
mq165 172.28.2.165 ide
EOF
1、簡介
RabbitMQ是流行的開源消息隊列系統,用erlang語言開發。Erlang的分佈式通信安全策略,能夠歸結爲 All or None。。RabbitMQ是AMQP(高級消息隊列協議)的標準實現。RabbitMQ的結構圖以下:
幾個概念說明:
Broker:簡單來講就是消息隊列服務器實體。
Exchange:消息交換機,它指定消息按什麼規則,路由到哪一個隊列。
Queue:消息隊列載體,每一個消息都會被投入到一個或多個隊列。
Binding:綁定,它的做用就是把exchange和queue按照路由規則綁定起來。
Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。
vhost:虛擬主機,一個broker裏能夠開設多個vhost,用做不一樣用戶的權限分離。
producer:消息生產者,就是投遞消息的程序。
consumer:消息消費者,就是接受消息的程序。
channel:消息通道,在客戶端的每一個鏈接裏,可創建多個channel,每一個channel表明一個會話任務。
消息隊列的使用過程大概以下:
(1)客戶端鏈接到消息隊列服務器,打開一個channel。
(2)客戶端聲明一個exchange,並設置相關屬性。
(3)客戶端聲明一個queue,並設置相關屬性。
(4)客戶端使用routing key,在exchange和queue之間創建好綁定關係。
(5)客戶端投遞消息到exchange。
exchange接收到消息後,就根據消息的key和已經設置的binding,進行消息路由,將消息投遞到一個或多個隊列裏。
exchange也有幾個類型,徹底根據key進行投遞的叫作Direct交換機,例如,綁定時設置了routing key爲」abc」,那麼客戶端提交的消息,只有設置了key爲」abc」的纔會投遞到隊列。對key進行模式匹配後進行投遞的叫作Topic交換機,符號」#」匹配一個或多個詞,符號」*」匹配正好一個詞。例如」abc.#」匹配」abc.def.ghi」,」abc.*」只匹配」abc.def」。還有一種不須要key的,叫作Fanout交換機,它採起廣播模式,一個消息進來時,投遞到與該交換機綁定的全部隊列。
RabbitMQ支持消息的持久化,也就是數據寫在磁盤上,爲了數據安全考慮,我想大多數用戶都會選擇持久化。消息隊列持久化包括3個部分:
(1)exchange持久化,在聲明時指定durable => 1
(2)queue持久化,在聲明時指定durable => 1
(3)消息持久化,在投遞時指定delivery_mode => 2(1是非持久化)
若是exchange和queue都是持久化的,那麼它們之間的binding也是持久化的。若是exchange和queue二者之間有一個持久化,一個非持久化,就不容許創建綁定。
下面咱們再瞭解下消息隊列RabbitMQ集羣,因爲RabbitMQ是用erlang開發的,RabbitMQ 徹底依賴 Erlang 的 Cluster,而Erlang集羣很是方便,所以配置RabbitMQ集羣變得很是簡單。
RabbitMQ的集羣節點包括內存節點、磁盤節點。顧名思義內存節點就是將全部數據放在內存,磁盤節點將數據放在磁盤。不過,如前文所述,若是在投遞消息時,打開了消息的持久化,那麼即便是內存節點,數據仍是安全的放在磁盤。
良好的設計架構能夠以下:在一個集羣裏,有3臺以上機器,其中1臺使用磁盤模式,其它使用內存模式。其它幾臺爲內存模式的節點,無疑速度更快,所以客戶端(consumer、producer)鏈接訪問它們。而磁盤模式的節點,因爲磁盤IO相對較慢,所以僅做數據備份使用。
2、各節點安裝rabbitmq
安裝很是簡單,只需幾步搞定:
1. 安裝epel源
rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-7.noarch.rpm
wget -O /etc/yum.repos.d/epel-erlang.repo http://repos.fedorapeople.org/repos/peter/erlang/epel-erlang.repo
2. 安裝erlang
yum install erlang xmlto git -y
rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc
3. 安裝rabbitmq
能夠選擇用yum安裝,也能夠選擇下載rpm包安裝,也能夠用源碼編譯安裝!
下載地址: http://www.rabbitmq.com/download.html
本文選擇rpm包安裝:
wget http://www.rabbitmq.com/releases/rabbitmq-server/v2.8.6/rabbitmq-server-2.8.6.noarch.rpm
rpm -ivh rabbitmq-server-2.8.6.noarch.rpm
4. 啓動各節點rabbitmq,並驗證啓動狀況
[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)
3、集羣配置
集羣環境說明:
mq136做爲磁盤節點,其它全部節點都做爲內存節點!
1. 在各節點建立加入集羣腳本
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. 各節點加入集羣環境
[root@mq136 ~]# chmod +x /home/zjqui/scripts/cluster.sh
啓動腳本順序:先運行mq136節點集羣腳本,而後再運行其它節點集羣腳本:
[root@mq136 ~]# /home/zjqui/scripts/cluster.sh
各節點運行成功後,查看集羣總體狀態:
[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節點,其它節點是ram節點!集羣簡單配置到此完成!!