RabbitMQ集群配置

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、配置前先同步时间

[root@rabbitmq1 ~]# ntpdate 192.168.12.176

 

3、修改hosts

[root@rabbitmq1 ~]# 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

[root@rabbitmq3 ~]# yum install erlang(先安装epel源)


5、安装RabbitMQ

[root@rabbitmq1 ~]# wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.5.1/rabbitmq-server-3.5.1-1.noarch.rpm
[root@rabbitmq1 ~]# yum install rabbitmq-server-3.5.1-1.noarch.rpm

[root@rabbitmq3 ~]# /etc/init.d/rabbitmq-server start
Starting rabbitmq-server: SUCCESS
rabbitmq-server.


6、安装插件管理界面

[root@rabbitmq1 ~]# chmod 777 /etc/rabbitmq/
[root@rabbitmq1 ~]# 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 rabbit@rabbitmq1... started 6 plugins.

[root@rabbitmq1 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)

有两种方式配置集群,命令行和配置文件形式(命令行配置优先于配置文件)

设置集群之前,确保两个节点之间能互相访问

[root@rabbitmq1 rabbitmq]# rabbitmqctl status -n rabbit@rabbitmq2
Status of node rabbit@rabbitmq2 ...
[{pid,14964},
 {running_applications,[{rabbit,"RabbitMQ","3.5.1"},
...

设置cookie

rabbitmq节点需要互相访问到的话,节点的cookie必须保持一致,cookie文件一般放在/var/lib/rabbitmq/.erlang.cookie

可以把其中一个节点的文件复制到其他节点即可。操作过程中,关闭节点服务器,完成后再打开。

rabbitmqctl stop_app     rabbitmqctl stop     scp

启动节点

[root@rabbitmq1 rabbitmq]# rabbitmq-server -detached
[root@rabbitmq2 rabbitmq]# rabbitmq-server -detached
[root@rabbitmq3 rabbitmq]# rabbitmq-server -detached
分别在三台主机上执行rabbitmqctl start_app

检查节点状态(3个节点出现类似信息)

[root@rabbitmq1 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq1 ...
[{nodes,[{disc,[rabbit@rabbitmq1]}]},
 {running_nodes,[rabbit@rabbitmq1]},
 {cluster_name,<<"[email protected]">>},
 {partitions,[]}]

在节点2和节点3上执行如下操作:

[root@rabbitmq2 rabbitmq]# rabbitmqctl stop_app
Stopping node rabbit@rabbitmq2 ...

[root@rabbitmq2 rabbitmq]# rabbitmqctl join_cluster rabbit@rabbitmq1
Clustering node rabbit@rabbitmq2 with rabbit@rabbitmq1 ...

[root@rabbitmq2 rabbitmq]# rabbitmqctl start_app
Starting node rabbit@rabbitmq2 ...

完成后3个节点都可以看到相同的cluster信息

[root@rabbitmq3 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq3 ...
[{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]}]},
 {running_nodes,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]},
 {cluster_name,<<"[email protected]">>},
 {partitions,[]}]

到此为止,一个普通的集群配置完毕


节点操作

将一个节点退出集群:

[root@rabbitmq3 rabbitmq]# rabbitmqctl stop_app
Stopping node rabbit@rabbitmq3 ...done.

[root@rabbitmq3 rabbitmq]# rabbitmqctl reset
Resetting node rabbit@rabbitmq3 ...done.

[root@rabbitmq3 rabbitmq]# rabbitmqctl start_app
Starting node rabbit@rabbitmq3 ...done

更改节点模式(将disc改为ram)

[root@rabbitmq3 rabbitmq]# rabbitmqctl stop_app
Stopping node rabbit@rabbitmq3 ...done.

[root@rabbitmq3 rabbitmq]# rabbitmqctl change_cluster_node_type ram
Turning rabbit@rabbitmq3 into a ram node ...

[root@rabbitmq3 rabbitmq]# rabbitmqctl start_app
Starting node rabbit@rabbitmq3 ...done.


你可能感兴趣的:(rabbitmq)