rabbitmq簡介
rabbitmq是一個開源的amqp實現,服務器端用erlang語言編寫,支持多種客戶端,如:python、ruby、.net、java、jms、c、php、actionscript、xmpp、stomp等,支持ajax。用于在分布式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。
amqp,即advanced message queuing protocol,高級消息隊列協議,是應用層協議的一個開放標準,為面向消息的中間件設計。消息中間件主要用于組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。
amqp的主要特征是面向消息、隊列、路由(包括點對點和發布/訂閱)、可靠性、安全。
注意事項
centos 7.x 關閉firewall
1
|
$ systemctl stop firewalld.service # 停止firewall |
不想關閉防火墻,就開放15672端口,設置之后可以通過網頁方式管理mq
安裝安裝iptables防火墻
1
|
yum install iptables-services |
添加配置
1
2
|
iptables -i input -p tcp --dport 5672 -j accept iptables -i input -p tcp --dport 15672 -j accept |
保存配置
1
|
service iptables save |
重啟
1
|
systemctl restart iptables.service |
設置開機自啟動
1
|
systemctl enable iptables.service |
安裝
安裝 erlang
rabbitmq 安裝需要依賴 erlang 環境
1
2
3
|
$ cd /usr/local/src $ wget http: //www .rabbitmq.com /releases/erlang/erlang-19 .0.4-1.el7.centos.x86_64.rpm $ yum install erlang-19.0.4-1.el7.centos.x86_64.rpm |
安裝 rabbitmq
1
2
3
|
$ cd /usr/local/src $ wget http: //www .rabbitmq.com /releases/rabbitmq-server/v3 .6.10 /rabbitmq-server-3 .6.10-1.el7.noarch.rpm $ yum install rabbitmq-server-3.6.10-1.el7.noarch.rpm |
啟動服務
1
|
$ service rabbitmq-server start |
服務狀態
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
$ service rabbitmq-server status redirecting to /bin/systemctl status rabbitmq-server.service ● rabbitmq-server.service - rabbitmq broker loaded: loaded ( /usr/lib/systemd/system/rabbitmq-server .service; disabled; vendor preset: disabled) active: active (running) since 一 2018-03-05 21:42:10 cst; 15s ago main pid: 2493 (beam.smp) status: "initialized" cgroup: /system .slice /rabbitmq-server .service ├─2493 /usr/lib64/erlang/erts-8 .0.3 /bin/beam .smp -w w -a 64 -p 1048576 -t 5000000 -stbt db -zdbbl 32000 -k true -- -root /usr/lib64/erlang -progname erl -- -home /var/l ... ├─2634 /usr/lib64/erlang/erts-8 .0.3 /bin/epmd -daemon ├─2750 erl_child_setup 1024 ├─2760 inet_gethost 4 └─2761 inet_gethost 4 3月 05 21:42:07 master01 rabbitmq-server[2493]: rabbitmq 3.6.10. copyright (c) 2007-2017 pivotal software, inc. 3月 05 21:42:07 master01 rabbitmq-server[2493]: ## ## licensed under the mpl. see http://www.rabbitmq.com/ 3月 05 21:42:07 master01 rabbitmq-server[2493]: ## ## 3月 05 21:42:07 master01 rabbitmq-server[2493]: ########## logs: /var/log/rabbitmq/[email protected] 3月 05 21:42:07 master01 rabbitmq-server[2493]: ###### ## /var/log/rabbitmq/[email protected] 3月 05 21:42:07 master01 rabbitmq-server[2493]: ########## 3月 05 21:42:07 master01 rabbitmq-server[2493]: starting broker... 3月 05 21:42:10 master01 rabbitmq-server[2493]: systemd unit for activation check: "rabbitmq-server.service" 3月 05 21:42:10 master01 systemd[1]: started rabbitmq broker. 3月 05 21:42:10 master01 rabbitmq-server[2493]: completed with 0 plugins. |
查看日志
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
$ less /var/log/rabbitmq/rabbit \@master01.log =info report==== 5-mar-2018::21:42:07 === starting rabbitmq 3.6.10 on erlang 19.0.4 copyright (c) 2007-2017 pivotal software, inc. licensed under the mpl. see http: //www .rabbitmq.com/ =info report==== 5-mar-2018::21:42:07 === node : rabbit@master01 home dir : /var/lib/rabbitmq config file (s) : /etc/rabbitmq/rabbitmq .config (not found) cookie hash : +9losjmr5x /9geguoed28a == log : /var/log/rabbitmq/rabbit @master01.log sasl log : /var/log/rabbitmq/rabbit @master01-sasl.log database dir : /var/lib/rabbitmq/mnesia/rabbit @master01 =info report==== 5-mar-2018::21:42:09 === memory limit set to 732mb of 1831mb total. =info report==== 5-mar-2018::21:42:09 === enabling free disk space monitoring =info report==== 5-mar-2018::21:42:09 === disk free limit set to 50mb =info report==== 5-mar-2018::21:42:09 === limiting to approx 924 file handles (829 sockets) =info report==== 5-mar-2018::21:42:09 === fhc read buffering: off =info report==== 5-mar-2018::21:42:07 === starting rabbitmq 3.6.10 on erlang 19.0.4 copyright (c) 2007-2017 pivotal software, inc. licensed under the mpl. see http: //www .rabbitmq.com/ =info report==== 5-mar-2018::21:42:07 === node : rabbit@master01 home dir : /var/lib/rabbitmq config file (s) : /etc/rabbitmq/rabbitmq .config (not found) cookie hash : +9losjmr5x /9geguoed28a == log : /var/log/rabbitmq/rabbit @master01.log sasl log : /var/log/rabbitmq/rabbit @master01-sasl.log database dir : /var/lib/rabbitmq/mnesia/rabbit @master01 =info report==== 5-mar-2018::21:42:09 === memory limit set to 732mb of 1831mb total. =info report==== 5-mar-2018::21:42:09 === enabling free disk space monitoring =info report==== 5-mar-2018::21:42:09 === disk free limit set to 50mb =info report==== 5-mar-2018::21:42:09 === limiting to approx 924 file handles (829 sockets) =info report==== 5-mar-2018::21:42:09 === fhc read buffering: off fhc write buffering: on =info report==== 5-mar-2018::21:42:09 === database directory at /var/lib/rabbitmq/mnesia/rabbit @master01 is empty. initialising from scratch... =info report==== 5-mar-2018::21:42:09 === waiting for mnesia tables for 30000 ms, 9 retries left =info report==== 5-mar-2018::21:42:09 === waiting for mnesia tables for 30000 ms, 9 retries left |
這里顯示的是沒有找到配置文件,我們可以自己創建這個文件
1
|
config file (s) : /etc/rabbitmq/rabbitmq .config (not found) |
創建rabbitmq.config
1
2
|
$ cd /etc/rabbitmq/ $ vim rabbitmq.config |
編輯內容如下:
1
|
[{rabbit, [{loopback_users, []}]}]. |
這里的意思是開放使用,rabbitmq默認創建的用戶guest,密碼也是guest,這個用戶默認只能是本機訪問,localhost或者127.0.0.1,從外部訪問需要添加上面的配置。
保存配置后重啟服務
1
|
$ service rabbitmq-server restart |
開啟管理ui
1
|
$ /sbin/rabbitmq-plugins enable rabbitmq_management |
重啟服務
1
|
$ service rabbitmq-server restart |
訪問管理ui
通過 http://ip:15672 使用guest, guest 進行登陸了.
授權操作
添加用戶
處于安全的考慮,guest這個默認的用戶只能通過http://localhost:15672 來登錄,其他的ip無法直接使用這個賬號。 這對于服務器上沒有安裝桌面的情況是無法管理維護的,除非通過在前面添加一層代理向外提供服務,這個又有些麻煩了,這里通過配置文件來實現這個功能
命令格式
1
2
3
|
rabbitmqctl add_user <username> <newpassword> $ rabbitmqctl add_user zhdya 123456 creating user "zhdya" |
刪除用戶
1
2
3
|
rabbitmqctl delete_user <username> $ rabbitmqctl delete_user admin_test deleting user "admin_test" |
修改密碼
1
2
3
|
rabbitmqctl change_password <username> <newpassword> $ rabbitmqctl change_password zhdya 123456 changing password for user "zhdya" |
用戶授權
1
|
rabbitmqctl set_permissions [-pvhostpath] {user} {conf} {write} { read } |
該命令使用戶zhdya /(可以訪問虛擬主機) 中所有資源的配置、寫、讀權限以便管理其中的資源
1
2
|
$ rabbitmqctl set_permissions -p "/" zhdya ".*" ".*" ".*" setting permissions for user "zhdya" in vhost "/" |
查看用戶授權
1
2
3
4
5
|
rabbitmqctl list_permissions [-p vhostpath] $ rabbitmqctl list_permissions -p / listing permissions in vhost "/" guest .* .* .* zhdya .* .* .* |
查看當前用戶列表
可以看到添加用戶成功了,但不是administrator角色
1
2
3
4
|
$ rabbitmqctl list_users listing users guest [administrator] zhdya [] |
添加角色
這里我們也將ymq用戶設置為administrator角色
命令格式
1
2
3
|
rabbitmqctl set_user_tags <username> <tag> $ rabbitmqctl set_user_tags zhdya administrator setting tags for user "zhdya" to [administrator] |
再次查看權限
1
2
3
4
|
$ rabbitmqctl list_users listing users guest [administrator] zhdya [administrator] |
清除權限信息
1
2
3
|
rabbitmqctl clear_permissions [-p vhostpath] ymq rabbitmqctl clear_permissions -p / zhdya clearing permissions for user "zhdya" in vhost "/" |
官方文檔
安裝:
訪問控制:
網絡:
配置:
集群:
命令:
web 界面
添加用戶
鼠標點擊,劃紅線的角色,選擇一種
rabbitmq的用戶角色分類:
none、management、policymaker、monitoring、administrator
rabbitmq各類角色描述:
none
不能訪問 management plugin
management
用戶可以通過amqp做的任何事外加:
列出自己可以通過amqp登入的virtual hosts
查看自己的virtual hosts中的queues, exchanges 和 bindings
查看和關閉自己的channels 和 connections
查看有關自己的virtual hosts的“全局”的統計信息,包含其他用戶在這些virtual hosts中的活動。
policymaker
management可以做的任何事外加:
查看、創建和刪除自己的virtual hosts所屬的policies和parameters
monitoring
management可以做的任何事外加:
列出所有virtual hosts,包括他們不能登錄的virtual hosts
查看其他用戶的connections和channels
查看節點級別的數據如clustering和memory使用情況
查看真正的關于所有virtual hosts的全局的統計信息
administrator
policymaker和monitoring可以做的任何事外加:
創建和刪除virtual hosts
查看、創建和刪除users
查看創建和刪除permissions
關閉其他用戶的connections
設置權限
該用戶無權訪問任何虛擬主機
點擊 用戶名 set permission
設置可以訪問虛擬主機 中所有資源的配置、寫、讀權限以便管理其中的資源
至此rabbitmq單機服務已經完全搭建完畢,下面來操作單機多實例:
rabbitmq 單機多實例
其實在操作前我在網上看到了很多這種方案,多數為如下:
1
2
3
|
rabbitmq_node_port=5672 rabbitmq_nodename=rabbit1 rabbitmq-server -detached rabbitmq_node_port=5673 rabbitmq_nodename=rabbit2 rabbitmq-server -detached rabbitmq_node_port=5674 rabbitmq_nodename=rabbit3 rabbitmq-server -detached |
不過我覺得對于新人來說過于簡陋和不負責任!!!
第一個節點
下面指定了特定hostname啟動的,當然你也可以指定 為localhost。
1
2
3
4
|
[root@master01 sbin] # vim /etc/hosts #127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 127.0.0.1 master01 |
啟動第一個節點
1
|
rabbitmq_node_port=5672 rabbitmq_nodename=rabbit@master01 . /rabbitmq-server |
第二個節點
1
2
|
[root@master01 sbin] # rabbitmq_node_port=5673 rabbitmq_nodename=rabbit1@master01 rabbitmq-server -detached warning: pid file not written; -detached was passed. |
你可能發現不了什么,假如你去掉-detached 你會發現,最后你得到了一個這樣的錯誤信息:崩潰了的信息。。。
1
|
crash dump is being written to: erl_crash.dump... done |
往上翻信息或者查看日志,你會看到這樣的提示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
boot failed =========== error description: {could_not_start,rabbitmq_mqtt, {{ shutdown , {failed_to_start_child, 'rabbit_mqtt_listener_sup_:::1883' , { shutdown , {failed_to_start_child, {ranch_listener_sup,{acceptor,{0,0,0,0,0,0,0,0},1883}}, { shutdown , {failed_to_start_child,ranch_acceptors_sup, {listen_error, {acceptor,{0,0,0,0,0,0,0,0},1883}, eaddrinuse}}}}}}}, {rabbit_mqtt,start,[normal,[]]}}} |
啟動第二個節點
1
2
|
[root@master01 sbin] # rabbitmq_node_port=5673 rabbitmq_server_start_args="-rabbitmq_management listener [{port,15673}] -rabbitmq_stomp tcp_listeners [61614] -rabbitmq_mqtt tcp_listeners [1884]" rabbitmq_nodename=rabbit1 ./rabbitmq-server -detached warning: pid file not written; -detached was passed. |
查看端口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[root@master01 sbin] # !net netstat -lntp active internet connections (only servers) proto recv-q send-q local address foreign address state pid /program name tcp 0 0 0.0.0.0:4369 0.0.0.0:* listen 3779 /epmd tcp 0 0 0.0.0.0:22 0.0.0.0:* listen 1348 /sshd tcp 0 0 0.0.0.0:15672 0.0.0.0:* listen 3598 /beam .smp tcp 0 0 0.0.0.0:15673 0.0.0.0:* listen 5679 /beam .smp tcp 0 0 127.0.0.1:25 0.0.0.0:* listen 2065 /master tcp 0 0 0.0.0.0:25672 0.0.0.0:* listen 3598 /beam .smp tcp 0 0 0.0.0.0:25673 0.0.0.0:* listen 5679 /beam .smp tcp6 0 0 :::3306 :::* listen 1418 /mysqld tcp6 0 0 :::4369 :::* listen 3779 /epmd tcp6 0 0 :::22 :::* listen 1348 /sshd tcp6 0 0 ::1:25 :::* listen 2065 /master tcp6 0 0 :::5672 :::* listen 3598 /beam .smp tcp6 0 0 :::5673 :::* listen 5679 /beam .smp |
查看rabbit1的狀態:
1
2
|
cd /sbin/ . /rabbitmqctl status -n rabbit1 |
第三個節點
1
2
|
[root@master01 sbin] # rabbitmq_node_port=5674 rabbitmq_nodename=rabbit2@master01 rabbitmq-server -detached warning: pid file not written; -detached was passed. |
啟動第三個節點
1
2
|
[root@master01 sbin] # rabbitmq_node_port=5674 rabbitmq_server_start_args="-rabbitmq_management listener [{port,15674}] -rabbitmq_stomp tcp_listeners [61615] -rabbitmq_mqtt tcp_listeners [1885]" rabbitmq_nodename=rabbit2 ./rabbitmq-server -detached warning: pid file not written; -detached was passed. |
查看rabbit2的狀態:
1
2
|
cd /sbin/ . /rabbitmqctl status -n rabbit2 |
查看啟動狀態:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[root@master01 sbin] # !net netstat -lntp active internet connections (only servers) proto recv-q send-q local address foreign address state pid /program name tcp 0 0 0.0.0.0:25674 0.0.0.0:* listen 6759 /beam .smp tcp 0 0 0.0.0.0:4369 0.0.0.0:* listen 3779 /epmd tcp 0 0 0.0.0.0:22 0.0.0.0:* listen 1348 /sshd tcp 0 0 0.0.0.0:15672 0.0.0.0:* listen 3598 /beam .smp tcp 0 0 0.0.0.0:15673 0.0.0.0:* listen 5679 /beam .smp tcp 0 0 127.0.0.1:25 0.0.0.0:* listen 2065 /master tcp 0 0 0.0.0.0:15674 0.0.0.0:* listen 6759 /beam .smp tcp 0 0 0.0.0.0:25672 0.0.0.0:* listen 3598 /beam .smp tcp 0 0 0.0.0.0:25673 0.0.0.0:* listen 5679 /beam .smp tcp6 0 0 :::5674 :::* listen 6759 /beam .smp tcp6 0 0 :::3306 :::* listen 1418 /mysqld tcp6 0 0 :::4369 :::* listen 3779 /epmd tcp6 0 0 :::22 :::* listen 1348 /sshd tcp6 0 0 ::1:25 :::* listen 2065 /master tcp6 0 0 :::5672 :::* listen 3598 /beam .smp tcp6 0 0 :::5673 :::* listen 5679 /beam .smp |
這樣的話你可以通過:http://192.168.161.161:15672/#/,http://192.168.161.161:15673/#/ ,http://192.168.161.161:15674/#/ 訪問web查看相關節點是否真的存在。下面就是如何實現集群操作了。
集群操作
把節點rabbit1 加入 rabbit中
1.停止第二個節點的應用程序
1
|
. /rabbitmqctl -n rabbit1@master01 stop_app |
2.重新設置第二個節點的元數據和狀態為清空狀態。
1
|
. /rabbitmqctl -n rabbit1@master01 reset |
3.加入第一節點
1
|
. /rabbitmqctl -n rabbit1@master01 join_cluster rabbit@localhost |
4.重新啟動第二節點
1
|
. /rabbitmqctl -n rabbit1@master01 start_app |
現在再次登陸web界面你可以到web端看到集群已經存在了!!!
把節點rabbit2 加入 rabbit中
同如上步驟的1234:其中注意點是,如果你需要設置第三個集群節點為內存模式,而非磁盤模式,可以參考當前版本的命令提示,在最后加上 –ram 參數
添加第三節點的完整命令
1
2
3
4
|
. /rabbitmqctl -n rabbit2@master01 stop_app . /rabbitmqctl -n rabbit2@master01 reset . /rabbitmqctl -n rabbit2@master01 join_cluster rabbit@master01 . /rabbitmqctl -n rabbit2@master01 start_app |
注意:如上第三步,如果你要設置第三個集群節點為內存模式,而非磁盤模式,那就需要 --ram
1
|
. /rabbitmqctl -n rabbit2@master01 join_cluster rabbit@master01 -- ram |
查看集群狀態
1
2
3
4
5
6
7
8
9
10
11
12
|
. /rabbitmqctl cluster_status -n rabbit@localhost [root@master01 sbin] # ./rabbitmqctl cluster_status -n rabbit@localhost cluster status of node rabbit@localhost [{nodes,[{disc,[ 'rabbit1@master01' , 'rabbit2@master01' , rabbit@localhost]}]}, {running_nodes,[ 'rabbit2@master01' , 'rabbit1@master01' , rabbit@localhost]}, {cluster_name,<< "rabbit@master01" >>}, {partitions,[]}, {alarms,[{ 'rabbit2@master01' ,[]}, { 'rabbit1@master01' ,[]}, {rabbit@localhost,[]}]}] |
到web端看下效果吧!!!
至此,集群搭建完畢。
遇到的問題:
rabbitmq在安裝后可能會出現無法啟動,如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
applying plugin configuration to rabbit@192... failed. * could not contact node rabbit@192. changes will take effect at broker restart. * options: --online - fail if broker cannot be contacted. --offline - do not try to contact broker. error: unable to connect to node rabbit@192: nodedown diagnostics =========== attempted to contact: [rabbit@192] rabbit@192: * unable to connect to epmd (port 4369) on 192: badarg (unknown posix error) current node details: - node name: 'rabbitmq-cli-97@192' - home dir : /var/lib/rabbitmq - cookie hash : rb2cnggdqm+k5+jq1wj6vg== error: unable to connect to node rabbit@192: nodedown |
解決辦法
1
|
vi /etc/rabbitmq/rabbitmq-env .conf |
在文件中寫入“nodename=rabbit@localhost”
,保存。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:http://www.okay686.cn/968.html