本文介紹RabbitMQ安裝方法
RabbitMQ安裝
1 安裝erlang
下載下傳位址:http://www.erlang.org/downloads
部落客這裡采用的是otp_src_19.1.tar.gz (200MB+)
[root@hidden util]# tar zxvf otp_src_19.1.tar.gz
[root@hidden util]# cd otp_src_19.1
[root@hidden otp_src_19.1]# ./configure --prefix=/opt/erlang
[root@hidden otp_src_19.1]# make
[root@hidden otp_src_19.1]# make install
修改/etc/profile檔案,添加下面的環境變量:
ERLANG_HOME=/opt/erlang
export PATH=$PATH:$ERLANG_HOME/bin
export ERLANG_HOME
最後執行source /etc/profile讓檔案生效。
2 安裝simpleJson
下載下傳位址:https://pypi.python.org/pypi/simplejson/
部落客這裡采用的是simplejson-3.10.0.tar.gz
[root@hidden util]# tar zxvf simplejson-3.10.0.tar.gz
[root@hidden util]# cd simplejson-3.10.0
[root@hidden simplejson-3.10.0]# python setup.py install
3 安裝rabbitmq
下載下傳位址:http://www.rabbitmq.com/releases/rabbitmq-server/
部落客這裡用的版本就有很多了,比如2.7.0, 3.4.0, 3.4.1, 3.4.2, 3.4.3, 3.5.7, 3.6.0等等,不過都是用的rabbitmq-server-generic-unix-..*.tar.gz的版本。
這裡以3.5.7舉例:
[root@hidden util]# tar zvxf rabbitmq-server-generic-unix-3.5.7.tar.gz -C /opt
[root@hidden util]# cd /opt
[root@hidden util]# mv rabbitmq_server-3.5.7 rabbitmq
export PATH=$PATH:/opt/rabbitmq/sbin
運作:rabbitmq-server -detached
之後運作rabbitmqctl status檢視rabbitmq是否正常啟動:
[root@zhuzhonghua2-fqawb rabbitmq]# rabbitmqctl status
Status of node 'rabbit@zhuzhonghua2-fqawb' ...
[{pid,25020},
{running_applications,
[{rabbitmq_management,"RabbitMQ Management Console","3.5.7"},
{rabbitmq_management_agent,"RabbitMQ Management Agent","3.5.7"},
{rabbit,"RabbitMQ","3.5.7"},
{mnesia,"MNESIA CXC 138 12","4.14.1"},
{rabbitmq_web_dispatch,"RabbitMQ Web Dispatcher","3.5.7"},
{webmachine,"webmachine","1.10.3-rmq3.5.7-gite9359c7"},
{mochiweb,"MochiMedia Web Server","2.7.0-rmq3.5.7-git680dba8"},
{os_mon,"CPO CXC 138 46","2.4.1"},
{amqp_client,"RabbitMQ AMQP Client","3.5.7"},
{inets,"INETS CXC 138 49","6.3.3"},
{xmerl,"XML parser","1.3.12"},
{sasl,"SASL CXC 138 11","3.0.1"},
{stdlib,"ERTS CXC 138 10","3.1"},
{kernel,"ERTS CXC 138 10","5.1"}]},
{os,{unix,linux}},
{erlang_version,
"Erlang/OTP 19 [erts-8.1] [source] [64-bit] [smp:4:4] [async-threads:64] [hipe] [kernel-poll:true]\n"},
{memory,
[{total,60110136},
{connection_readers,0},
{connection_writers,0},
{connection_channels,0},
{connection_other,5664},
{queue_procs,1028160},
{queue_slave_procs,1576056},
{plugins,8008840},
{other_proc,6115560},
{mnesia,197760},
{mgmt_db,14219256},
{msg_index,58288},
{other_ets,1181200},
{binary,633896},
{code,17650127},
{atom,711593},
{other_system,8723736}]},
{alarms,[]},
{listeners,[{clustering,25672,"::"},{amqp,5672,"::"}]},
{vm_memory_high_watermark,0.4},
{vm_memory_limit,3301929779},
{disk_free_limit,50000000},
{disk_free,35754786816},
{file_descriptors,
[{total_limit,924},{total_used,6},{sockets_limit,829},{sockets_used,1}]},
{processes,[{limit,1048576},{used,195}]},
{run_queue,0},
{uptime,139660}]
RabbitMQ叢集搭建方法
這裡展示的是多機叢集的部署,如果機器受限,可以選擇單機叢集部署,詳細可以參考《RabbitMQ單機多執行個體配置》。
這裡選用三台主機,主機名分别是hidden1, hidden2, hidden3
1 在這三台機器中安裝rabbitmq-server, 參考上面。
2 讀取其中一個節點的cookie, 并複制到其他節點(節點之間通過cookie确定互相是否可通信)。
cookie存放在/var/lib/rabbitmq/.erlang.cookie或者$HOME/.erlang.cookie中。
3 逐個啟動節點 rabbitmq-server -detached
4 檢視各節點的狀态: rabbitmqctl status, rabbitmqctl cluster_status
5 配置各節點的hosts檔案( vim /etc/hosts)
xxx.xxx.xxx.xxx hidden1
xxx.xxx.xxx.xxx hidden2
xxx.xxx.xxx.xxx hidden3
6 建立叢集
以hidden1為主節點,在hidden2上:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@hidden1
rabbitmqctl start_app
hidden3上的操作與hidden2的雷同。
最後通過rabbitmqctl cluster_status檢視叢集的狀态資訊:
[{nodes,[{disc,[rabbit@hidden1,'rabbit@hidden2','rabbit@hidden3']}]},
{running_nodes,[rabbit@hidden1,'rabbit@hidden2','rabbit@hidden3']},
{cluster_name,<<"rabbit@hidden1">>},
{partitions,[]}]
7 在通路web(http://xxx.xxx.xxx.xxx:15672)時, 如果在Overview中的Nodes部分看到“Node statistics not available”的資訊,說明在該節點上web管理插件還未啟用。直接運作rabbitmq-plugins enable rabbitmq_management即可。
rabbitmq搭建叢集踩坑記
三台節點啟動之後,想要使用s146作為叢集主節點,在s151上将該節點加入s146叢集時,報如下錯誤。
[root@s151 rabbitmq]# rabbitmqctl join_cluster rabbit@s146
Clustering node rabbit@s151 with rabbit@s146 ...
Error: unable to connect to nodes [rabbit@s146]: nodedown
DIAGNOSTICS
===========
attempted to contact: [rabbit@s146]
rabbit@s146:
* connected to epmd (port 4369) on s146
* epmd reports node 'rabbit' running on port 25672
* TCP connection succeeded but Erlang distribution failed
* suggestion: hostname mismatch?
* suggestion: is the cookie set correctly?
* suggestion: is the Erlang distribution using TLS?
current node details:
- node name: 'rabbitmq-cli-30368@s151'
- home dir: /root
- cookie hash: X8M4gNn7BBuuU5WV1cHdhw==
我在網上看到了很多人都碰到了這個錯誤,錯誤提示中也說了三種解決方案。
suggestion: hostname mismatch?
hostname配置是否正确,對于hostname的配置可以參考https://my.oschina.net/mingshashan/blog/741988
suggestion: is the cookie set correctly?
.erlang.cookie設定是否正确,.erlang.cookie檔案裡面的字元串相當于一個密鑰一樣,一個節點想要加入某個叢集,必須要和這個機器中的所有節點的.erlang.cookie内容一樣,是以通常将主節點的.erlang.cookie檔案分發給其它節點即可,關鍵是這個節點可能出現在兩個位置/var/lib/rabbitmq/.erlang.cookie或者$HOME/.erlang.cookie。這樣一來如何确定自己的.erlang.cookie檔案在哪兒呢?這個要看rabbitmq的日志檔案,如下所示:
=INFO REPORT==== 9-Apr-2018::14:57:21 ===
node : rabbit@s151
home dir : /root
config file(s) : /opt/rabbitmq/sbin/../etc/rabbitmq/rabbitmq.config (not found)
cookie hash : HfR3DHABJqfPDV+hBgdzXQ==
log : /opt/rabbitmq/sbin/../var/log/rabbitmq/[email protected]
sasl log : /opt/rabbitmq/sbin/../var/log/rabbitmq/[email protected]
database dir : /opt/rabbitmq/sbin/../var/lib/rabbitmq/mnesia/rabbit@s151
其中的home dir就是你的.erlang.cookie檔案存放的目錄,而這個cookie hash就是.erlang.cookie裡面的值hash轉換得到的,你可以比較cookie hash的值是不是一緻來判斷你的.erlang.cookie是否一緻。我之前一直以為我的.erlang.cookie檔案在/var/lib/rabbitmq/下,是以屢次操作都失敗了,看了日志後發現節點的cookie hash不一緻,才發現原來一直将.erlang.cookie這個檔案的位置搞錯了,是以看日志很重要。
suggestion: is the Erlang distribution using TLS?
這種情況目前好像還沒碰到過。
參考: https://blog.csdn.net/u013256816/article/details/53524766
https://blog.csdn.net/u012062455/article/details/79867080