[关闭]
@cdmonkey 2016-06-28T03:29:07.000000Z 字数 6863 阅读 1413

RabbitMQ

MQ


rabbitmq_logo_strap.png-7.1kB
http://www.rabbitmq.com

http://note.youdao.com/share/web/file.html?id=f6aa7ec5ce69fea14c679c17fbc75624&type=note

http://www.iyunv.com/thread-23885-1-1.html

一、Install

  1. [root@Node-A5 ~]# yum install -y rabbitmq-server
  2. [root@Node-A5 ~]# /usr/lib/rabbitmq/bin/rabbitmq-plugins list
  3. [ ] amqp_client 3.1.5
  4. [ ] cowboy 0.5.0-rmq3.1.5-git4b93c2d
  5. [ ] eldap 3.1.5-gite309de4
  6. [ ] mochiweb 2.7.0-rmq3.1.5-git680dba8
  7. [ ] rabbitmq_amqp1_0 3.1.5
  8. [ ] rabbitmq_auth_backend_ldap 3.1.5
  9. [ ] rabbitmq_auth_mechanism_ssl 3.1.5
  10. [ ] rabbitmq_consistent_hash_exchange 3.1.5
  11. [ ] rabbitmq_federation 3.1.5
  12. [ ] rabbitmq_federation_management 3.1.5
  13. [ ] rabbitmq_jsonrpc 3.1.5
  14. [ ] rabbitmq_jsonrpc_channel 3.1.5
  15. ...
  1. # Install the management GUI plugin:
  2. [root@Node-A5 ~]# /usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management
  3. The following plugins have been enabled:
  4. mochiweb
  5. webmachine
  6. rabbitmq_web_dispatch
  7. amqp_client
  8. rabbitmq_management_agent
  9. rabbitmq_management
  10. Plugin configuration has changed. Restart RabbitMQ for changes to take effect.
  1. # Start the service:
  2. [root@Node-A5 ~]# /etc/init.d/rabbitmq-server start
  3. Starting rabbitmq-server: SUCCESS
  4. rabbitmq-server.
  5. # Check
  6. [root@Node-A5 ~]# lsof -i:55672
  7. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  8. beam 7044 rabbitmq 16u IPv4 32446 0t0 TCP *:55672 (LISTEN)
  9. -----------------
  10. # Start the service on boot:
  11. [root@Node-A5 ~]# chkconfig rabbitmq-server on
  12. [root@Node-A5 ~]# chkconfig --list|grep rabbit
  13. rabbitmq-server 0:off 1:off 2:on 3:on 4:on 5:on 6:off
  14. -----------------
  15. # Check the status:
  16. [root@Node-A5 ~]# rabbitmqctl status

Add Virtual Host

  1. # rabbitmqctl add_vhost <vhostname>
  2. [root@Node-A5 ~]# rabbitmqctl add_vhost test
  3. Creating vhost "test" ...
  4. ...done.
  5. # List all virtual host:
  6. [root@Node-A5 ~]# rabbitmqctl list_vhosts
  7. Listing vhosts ...
  8. /
  9. test
  10. ...done.

Permission control

  1. # Add an user:
  2. # rabbitmqctl add_user <username> <password>
  3. [root@Node-A5 ~]# rabbitmqctl add_user cdmonkey 123456
  4. Creating user "cdmonkey" ...
  5. ...done.
  6. # Modify the password:
  7. # rabbitmqctl change_password <username> <newpassword>
  1. #绑定权限,并且具备读写的权限:
  2. [root@Node-A5 ~]# rabbitmqctl set_permissions -p test cdmonkey ".*" ".*" ".*"
  3. Setting permissions for user "cdmonkey" in vhost "test" ...
  4. ...done.

至此,我们为指定用户于指定虚拟主机上授权成功。

  1. # List all message queue:
  2. [root@Node-A5 ~]# rabbitmqctl list_queues -p test
  3. Listing queues ...
  4. ...
  5. ...done.

二、Cluster

http://www.cnblogs.com/flat_peach/archive/2013/04/07/3004008.html

1.

首选需要确保集群内所有节点的hosts的文件设定正确,能够“ping”自身及集群内任意其他节点。此外还确保集群节点间的时间是同步的。

  1. 172.16.1.25 Node-A5
  2. 172.16.1.26 Node-A6
  3. 172.16.1.27 Node-A7

同时需要注意,集群是依赖于“erlang”的集群来进行工作的,所以必须先创建它的集群场景。Erlang的集群中各节点的结合是通过一个magic cookie来实施的,该文件存放于:

  1. [root@Node-A5 ~]# ll /var/lib/rabbitmq/.erlang.cookie
  2. -r-------- 1 rabbitmq rabbitmq 20 Jan 27 00:00 /var/lib/rabbitmq/.erlang.cookie
  3. [root@Node-A5 ~]# cat /var/lib/rabbitmq/.erlang.cookie
  4. TBBKNXDWJTTXKIZTYLSA

可以将其中一个节点上的.erlang.cookie值复制下来保存到其他节点上(该文件是节点间进行通信时使用的密钥,所有的节点必须确保一致)。当然也可使用scp的方法将该文件推送至其他节点内的相同位置,且操作中请留意该文件的权限以及属主属组不应产生变化。操作完毕后重启服务:

  1. # 这里请注意重启的操作步骤。这步很关键,尤其增加节点停止节点后再次启动遇到无法启动都可参照这个顺序。
  2. # Stop the service:
  3. [root@Node-A5 ~]# rabbitmqctl stop
  4. Stopping and halting node 'rabbit@Node-A5' ...
  5. ...done.
  6. # Start the service:
  7. [root@Node-A5 ~]# rabbitmq-server -detached
  8. Warning: PID file not written; -detached was passed.

注意:如果是于rabbitmq服务运行时修改的.erlang.cookie文件,那么就无法正常的停止服务(正常情况应该是先修改该文件,再启动服务),需要将相关进程强行的杀掉,然后再正常的后台启动服务:

  1. [root@Node-A7 ~]# kill -9 ...
  2. [root@Node-A7 ~]# rabbitmq-server -detached

2. Create Cluster

https://www.zybuluo.com/zhaikun/note/253376
http://88250.b3log.org/rabbitmq-clustering-ha
http://www.cnblogs.com/me-sa/archive/2012/11/12/2766700.html
http://www.cnblogs.com/flat_peach/archive/2013/04/07/3004008.html

001.png-10.6kB

Disk node

我们将Node-A5Node-A7两个节点与Node-A5(主节点)组成集群:

  1. # Node-A5
  2. # 以下的三个指令也可以不执行,而直接于其他的节点上执行相关的指令,但前提是得保证该主节点的服务是正常启动的。
  3. [root@Node-A5 ~]# rabbitmqctl stop_app # Stop the application
  4. Stopping node 'rabbit@Node-A5' ...
  5. ...done.
  6. [root@Node-A5 ~]# rabbitmqctl reset # Empty all message queues
  7. [root@Node-A5 ~]# rabbitmqctl start_app # Start the application

注意:执行指令时必须小心,特别是关闭应用的指令为stop_app,如果执行的是stop指令,则整个节点都会关闭,后续的操作就错了。

分别于两外两个节点执行下列的指令:

  1. # Node-A6:
  2. [root@Node-A6 ~]# rabbitmqctl stop_app
  3. Stopping node 'rabbit@Node-A6' ...
  4. ...done.
  5. [root@Node-A6 ~]# rabbitmqctl reset
  6. [root@Node-A6 ~]# rabbitmqctl join_cluster rabbit@Node-A5
  7. Clustering node 'rabbit@Node-A6' with 'rabbit@Node-A5' ...
  8. ...done.
  9. [root@Node-A6 ~]# rabbitmqctl start_app
  10. -----------------
  11. # Node-A7:
  12. [root@Node-A7 ~]# rabbitmqctl stop_app
  13. [root@Node-A7 ~]# rabbitmqctl reset
  14. [root@Node-A7 ~]# rabbitmqctl join_cluster rabbit@Node-A5
  15. [root@Node-A7 ~]# rabbitmqctl start_app
  16. # 能够看到,和主节点的配置脚本的唯一区别是多了第三行的加入集群指令。

操作完成后,上面两个节点间也会自动的创建连接。我们可以于任意的节点上查看集群的状态信息:

  1. # 因为我们创建集群时并未指定内存节点,因而所有的节点默认都是硬盘节点:
  2. [root@Node-A6 ~]# rabbitmqctl cluster_status
  3. Cluster status of node 'rabbit@Node-A6' ...
  4. [{nodes,[{disc,['rabbit@Node-A5','rabbit@Node-A6','rabbit@Node-A7']}]},
  5. {running_nodes,['rabbit@Node-A5','rabbit@Node-A7','rabbit@Node-A6']},
  6. {partitions,[]}]
  7. ...done.

RAM node

002.png-11.4kB

目前三个节点都是硬盘节点,我们可将Node-A6Node-A7两个节设定为“RAM”节点(需要保留至少一个硬盘节点用以保存状态信息):

  1. # Node-A6:
  2. [root@Node-A6 ~]# rabbitmqctl stop_app
  3. [root@Node-A6 ~]# rabbitmqctl reset
  4. [root@Node-A6 ~]# rabbitmqctl join_cluster --ram rabbit@Node-A5
  5. Clustering node 'rabbit@Node-A6' with 'rabbit@Node-A5' ...
  6. ...done.
  7. [root@Node-A6 ~]# rabbitmqctl start_app
  8. # Node-A7:
  9. [root@Node-A7 ~]# rabbitmqctl stop_app
  10. [root@Node-A7 ~]# rabbitmqctl reset
  11. [root@Node-A7 ~]# rabbitmqctl join_cluster --ram rabbit@Node-A5
  12. [root@Node-A7 ~]# rabbitmqctl start_app
  13. -----------------
  14. # Check the status of cluster:
  15. [root@Node-A7 ~]# rabbitmqctl cluster_status
  16. Cluster status of node 'rabbit@Node-A7' ...
  17. [{nodes,[{disc,['rabbit@Node-A5']},{ram,['rabbit@Node-A7','rabbit@Node-A6']}]},
  18. {running_nodes,['rabbit@Node-A6','rabbit@Node-A5','rabbit@Node-A7']},
  19. {partitions,[]}]
  20. ...done.

目前创建的为默认的普通集群,要确保高可用还需要创建镜像集群(创建镜像集群的前提是先要创建普通集群)。

3. Mirror Cluster

使用镜像功能,需要使用RabbitMQ的策略来实现,策略是用来控制及修改群集范围的某个虚拟主机队列行为和交换机行为的。
http://www.rabbitmq.com/ha.html
http://www.cnblogs.com/DanielChow/p/3373518.html

  1. # Create mirror cluster:
  2. [root@Node-A5 ~]# rabbitmqctl set_policy ha-allqueue "^" '{"ha-mode":"all"}'
  3. Setting policy "ha-allqueue" for pattern "^" to "{\"ha-mode\":\"all\"}" ...
  4. ...done.

4. Exit Cluster

  1. # 我们能够使用下列指令将Node-A7节点从集群中退出:
  2. [root@Node-A7 ~]# rabbitmqctl stop_app
  3. [root@Node-A7 ~]# rabbitmqctl reset
  4. [root@Node-A7 ~]# rabbitmqctl start_app

5. Web Access

注意:从版本3.3.0开始就不允许使用“guest”权限通过除localhost以外的远端进行访问。想开启该权限,需要修改主设定文件中的相关内容:

  1. # 首次编辑配置文件时需要手动进行创建:
  2. [root@Node-A5 ~]# vim /etc/rabbitmq/rabbitmq.config
  3. [{rabbit, [{loopback_users, []}]}].
  4. # 修改完配置文件后需要重启服务:
  5. [root@Node-A5 ~]# rabbitmqctl stop
  6. [root@Node-A5 ~]# rabbitmq-server -detached

一般情况下,RabbitMQ其默认的设定就足够了。如果需要进行特别设定的话,有两个方法(下面所列的两个文件默认是没有的,如有需要必须手动进行创建):

rabbitmq-env.conf

该文件为“env”变量的设定文件,存放地点是确定和不能改变的,位于:/etc/rabbitmq目录下(该目录有可能也需要自行创建)。具体的设定内容请见:
http://www.rabbitmq.com/configure.html#define-environment-variables

rabbitmq.config

该文件是一个标准的erlang设定文件,因而它必须符合erlang设定文件的标准。该文件有其默认的目录,也可于上面的变量设定文件中进行设定。文件的内容请见:
http://www.rabbitmq.com/configure.html#config-items

Configure File Syntax

  1. # 需要注意配置文件的语法格式,比较的坑,而且其注释符号是两个百分号:%%
  2. [
  3. {rabbit,[{loopback_users, []}]},
  4. {rabbit,[{tcp_listeners,[5672]},
  5. {cluster_partition_handling, ignore}]}
  6. ].

三、Exchange

  1. # Check the exchange info:
  2. [root@Node-A5 ~]# rabbitmqctl list_exchanges
  3. Listing exchanges ...
  4. direct
  5. amq.direct direct
  6. amq.fanout fanout
  7. amq.headers headers
  8. amq.match headers
  9. amq.rabbitmq.log topic
  10. amq.rabbitmq.trace topic
  11. amq.topic topic
  12. ...done.
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注