RabbitMQ的集群节点包括内存节点、磁盘节点。顾名思义内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘。如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是安全的放在磁盘。
普通模式:
对于queue来说,message data只存在于集群中的一个节点上,而message metadata则存在于集群中的所有节点。当message进入A节点的queue后,consumer从B节点拉去时,rabbitmq会临时在A、B之间进行消息传输,把A中的message data取出来发送给链接在B上的consumer。这样就存在A这个瓶颈,无论链接A还是B,出口总是在A。还有如果A节点故障后,在B节点无法取到A节点中还未消费的消息,如果做了消息持久化,则A节点恢复后,仍然可以被消费,但是如果没做消息持久化,即使A恢复了,消息也丢失了。
镜像模式:
该模式和集群模式的区别在于,message data会在镜像节点间主动同步,而不是在consumer取数据时临时拉取,当然由于在节点间主动同步数据,副作用也很明显,降低系统性能,一但大量消息进入,则同步的消息非常多。
1、实验环境
rabbitmq1 192.168.12.131 rabbitmq2 192.168.12.132 rabbitmq3 192.168.12.134
dis节点和ram节点的磁盘空间分配,根据实际占用情况
2、配置前先同步时间
[[email protected] ~]# ntpdate 192.168.12.176
3、修改hosts
[[email protected] ~]# cat /etc/hosts 192.168.12.131 rabbitmq1.com rabbitmq1 192.168.12.132 rabbitmq2.com rabbitmq2 192.168.12.134 rabbitmq3.com rabbitmq3
4、安装erlang
[[email protected] ~]# yum install erlang(先安装epel源)
5、安装RabbitMQ
[[email protected] ~]# wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.5.1/rabbitmq-server-3.5.1-1.noarch.rpm [[email protected] ~]# yum install rabbitmq-server-3.5.1-1.noarch.rpm [[email protected] ~]# /etc/init.d/rabbitmq-server start Starting rabbitmq-server: SUCCESS rabbitmq-server.
6、安装插件管理界面
[[email protected] ~]# chmod 777 /etc/rabbitmq/ [[email protected] ~]# rabbitmq-plugins enable rabbitmq_management The following plugins have been enabled: mochiweb webmachine rabbitmq_web_dispatch amqp_client rabbitmq_management_agent rabbitmq_management Applying plugin configuration to [email protected] started 6 plugins. [[email protected] rabbitmq]# service rabbitmq-server restart
然后就可以通过http://192.168.12.131:15672访问
通过http://192.168.12.131:15672/api/访问rabbitmq提供的API
注意:rabbitmq从3.3.0开始禁止guest/guest权限通过除localhost外的访问
我们可以添加一个管理员用户
7、集群配置(关闭防火墙和selinux)
有两种方式配置集群,命令行和配置文件形式(命令行配置优先于配置文件)
设置集群之前,确保两个节点之间能互相访问
[[email protected] rabbitmq]# rabbitmqctl status -n [email protected] Status of node [email protected] ... [{pid,14964}, {running_applications,[{rabbit,"RabbitMQ","3.5.1"}, ...
设置cookie
rabbitmq节点需要互相访问到的话,节点的cookie必须保持一致,cookie文件一般放在/var/lib/rabbitmq/.erlang.cookie
可以把其中一个节点的文件复制到其他节点即可。操作过程中,关闭节点服务器,完成后再打开。
rabbitmqctl stop_app rabbitmqctl stop scp
启动节点
[[email protected] rabbitmq]# rabbitmq-server -detached [[email protected] rabbitmq]# rabbitmq-server -detached [[email protected] rabbitmq]# rabbitmq-server -detached 分别在三台主机上执行rabbitmqctl start_app
检查节点状态(3个节点出现类似信息)
[[email protected] rabbitmq]# rabbitmqctl cluster_status Cluster status of node [email protected] ... [{nodes,[{disc,[[email protected]]}]}, {running_nodes,[[email protected]]}, {cluster_name,<<"[email protected]">>}, {partitions,[]}]
在节点2和节点3上执行如下操作:
[[email protected] rabbitmq]# rabbitmqctl stop_app Stopping node [email protected] ... [[email protected] rabbitmq]# rabbitmqctl join_cluster [email protected] Clustering node [email protected] with [email protected] ... [[email protected] rabbitmq]# rabbitmqctl start_app Starting node [email protected] ...
完成后3个节点都可以看到相同的cluster信息
[[email protected] rabbitmq]# rabbitmqctl cluster_status Cluster status of node [email protected] ... [{nodes,[{disc,[[email protected],[email protected],[email protected]]}]}, {running_nodes,[[email protected],[email protected],[email protected]]}, {cluster_name,<<"[email protected]">>}, {partitions,[]}]
到此为止,一个普通的集群配置完毕
节点操作
将一个节点退出集群:
[[email protected] rabbitmq]# rabbitmqctl stop_app Stopping node [email protected] ...done. [[email protected] rabbitmq]# rabbitmqctl reset Resetting node [email protected] ...done. [[email protected] rabbitmq]# rabbitmqctl start_app Starting node [email protected] ...done
更改节点模式(将disc改为ram)
[[email protected] rabbitmq]# rabbitmqctl stop_app Stopping node [email protected] ...done. [[email protected] rabbitmq]# rabbitmqctl change_cluster_node_type ram Turning [email protected]bbitmq3 into a ram node ... [[email protected] rabbitmq]# rabbitmqctl start_app Starting node [email protected] ...done.