[高可用]Ubuntu搭建高可用的RabbitMQ(1)

题记

在OpenStack环境下,如果采用Ubuntu操作系统,默认使用的消息队列为RabbitMQ,如果考虑到OpenStack的高可用性,关于RabbitMQ的高可用性也需要进行了解,本篇就针对RabbitMQ的集群和高可用性搭建进行实践。

测试环境

三台机器组成RabbitMQ集群,三台机器都采用Ubuntu14.04.
[高可用]Ubuntu搭建高可用的RabbitMQ(1)_第1张图片
需要注意:三台机器都需要在/etc/hosts里面输入相关的IP和机器名对应关系

root@mq1:~# cat /etc/hosts
127.0.0.1       localhost
#10.0.0.11      controller
192.168.13.41   mq1
192.168.13.92   mq2
192.168.13.93   mq3
# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

关于RabbitMQ的节点类型

node 的类型分为磁盘(disk) node 或者是内存(RAM) node 两种。(注:磁盘间可以相互替换,配置语法或者状态消息通常使用磁盘 node 进行存储) 内存 node 只在内存中保存状态信息(除了 queue 内容的特殊情况,即如果将 queue 的属性设置为 persistent 或者出现要存放的数据量太大不适合放在内存中的情况时,queue 中的内容会被存放到磁盘上)。 磁盘 node 同时在内存和磁盘上保存状态信息;而内存 node 不像磁盘 node 那样必须在磁盘上保存信息,故内存 node 具有更高效的性能。然而,并不是说 因为 queue 数据 总是保存在 disk 上, 所以只有资源管理(例如,增加/删除 quque 、exchange 或者 vhost) 才能够对性能提高产生影响, 还要考虑 publishing 和 consuming 速度的影响。 因为状态信息会在 cluster 包含的所有 node 中是可以进行复制,所以在一个 cluster 中只配置一个磁盘 node 便足够安全存储 cluster 的状态信息(但并不是说建议一定要这样做)。

简单的说:RAM就是存储在内存中,DISK存储在硬盘中,在集群环境下,至少要有一台节点是存储在硬盘中,这样才能保证集群的消息信息不被丢失。

部署步骤

以下操作分别在三个节点中进行

1、安装软件

sudo apt-get install rabbitmq-server

2、设置erlang cookie
Erlang node 使用 cookie 值来确定 node 间是否允许相互通信 - 两个 node 能够相互通信的前提是他们必须拥有相同的 cookie 值。cookie 的值就是一串由字母和数字构成的字符串,其长度随便。最简单的方式就是让某一个 node 创建该 cookie 文件,然后收到将其拷贝到 cluster 中的所有其他 node 上。
查看mq1节点的cookie,然后所有节点都执行该cookie值即可。
a:停止RabbitMQ服务
b:其他节点mq2和mq3更新cookie

echo 'XVMFWWQNSBEDNBDXMQZT' >  /var/lib/rabbitmq/.erlang.cookie

3、启动服务
4、设置RabbitMQ管理插件,启用Web浏览

sudo rabbitmq-plugins enable rabbitmq_management

5、关闭APP

sudo rabbitmqctl stop_app

6、重设

sudo rabbitmqctl reset

7、重启服务
8、查看mq1的集群状态

root@mq1:~# rabbitmqctl cluster_status
Cluster status of node rabbit@mq1 ...
[{nodes,[{disc,[rabbit@mq1]}]},{running_nodes,[rabbit@mq1]},{partitions,[]}]
...done.

9、节点2和节点3重复1-6工作,不同的是,我希望节点mq2采用RAM类型,节点mq3采用DISK类型。

我们也可以查看8,mq1默认的集群状态为DISK(disc),接下来,将mq2和mq3节点加入到mq1的集群环境中。

添加mq2节点(注意,添加集群节点的–RAM参数)

root@mq2:~# service rabbitmq-server stop
 * Stopping message broker rabbitmq-server
root@mq2:~# echo 'XVMFWWQNSBEDNBDXMQZT' >  /var/lib/rabbitmq/.erlang.cookie
root@mq2:~# service rabbitmq-server start
 * Starting message broker rabbitmq-server
root@mq2:~# rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
  mochiweb
  webmachine
  rabbitmq_web_dispatch
  amqp_client
  rabbitmq_management_agent
  rabbitmq_management
Plugin configuration has changed. Restart RabbitMQ for changes to take effect.
root@mq2:~# rabbitmqctl stop_app
Stopping node rabbit@mq2 ...
...done.
root@mq2:~# rabbitmqctl reset
Resetting node rabbit@mq2 ...
...done.
root@mq2:~# rabbitmqctl join_cluster --ram rabbit@mq1
Clustering node rabbit@mq2 with rabbit@mq1 ...
...done.
root@mq2:~# rabbitmqctl start_app
Starting node rabbit@mq2 ...
...done.
root@mq2:~# service rabbitmq-server restart
 * Restarting message broker rabbitmq-server                             [ OK ]

查看mq1集群状态

root@mq1:~# rabbitmqctl cluster_status
Cluster status of node rabbit@mq1 ...
[{nodes,[{disc,[rabbit@mq1]},{ram,[rabbit@mq2]}]},
 {running_nodes,[rabbit@mq2,rabbit@mq1]},
 {partitions,[]}]
...done.

添加mq3节点

root@mq3:~# echo 'XVMFWWQNSBEDNBDXMQZT' >  /var/lib/rabbitmq/.erlang.cookie
root@mq3:~# cat  /var/lib/rabbitmq/.erlang.cookie
XVMFWWQNSBEDNBDXMQZT
root@mq3:~# chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
root@mq3:~# chmod 400 /var/
backups/ crash/   local/   log/     opt/     spool/
cache/   lib/     lock/    mail/    run/     tmp/
root@mq3:~# chmod 400 /var/lib/rabbitmq/.erlang.cookie
root@mq3:~# service rabbitmq-server start
 * Starting message broker rabbitmq-server                               [ OK ]
root@mq3:~# rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
  mochiweb
  webmachine
  rabbitmq_web_dispatch
  amqp_client
  rabbitmq_management_agent
  rabbitmq_management
Plugin configuration has changed. Restart RabbitMQ for changes to take effect.
root@mq3:~# rabbitmqctl stop_app
Stopping node rabbit@mq3 ...
...done.
root@mq3:~# rabbitmqctl reset
Resetting node rabbit@mq3 ...
...done.
root@mq3:~# rabbitmqctl join_cluster rabbit@mq1
Clustering node rabbit@mq3 with rabbit@mq1 ...
...done.
root@mq3:~# service rabbitmq-server restart
 * Restarting message broker rabbitmq-server                             [ OK ]

查看mq1集群状态

root@mq1:~# rabbitmqctl cluster_status
Cluster status of node rabbit@mq1 ...
[{nodes,[{disc,[rabbit@mq1,rabbit@mq3]},{ram,[rabbit@mq2]}]},
 {running_nodes,[rabbit@mq3,rabbit@mq2,rabbit@mq1]},
 {partitions,[]}]
...done.

当然,我们还可以对已有的集群状态的节点类型进行修改,例如将mq3原有的DISK类型修改为RAM类型

root@mq3:~# rabbitmqctl stop_app
Stopping node rabbit@mq3 ...
...done.
root@mq3:~# rabbitmqctl change_cluster_node_type ram
Turning rabbit@mq3 into a ram node ...
...done.
root@mq3:~# rabbitmqctl start_app
Starting node rabbit@mq3 ...
...done.

修改完毕之后,再次查看集群状态

root@mq1:~# rabbitmqctl cluster_status
Cluster status of node rabbit@mq1 ...
[{nodes,[{disc,[rabbit@mq1]},{ram,[rabbit@mq3,rabbit@mq2]}]},
 {running_nodes,[rabbit@mq3,rabbit@mq2,rabbit@mq1]},
 {partitions,[]}]
...done.

我们可以看到,mq3已经从原来的DISK模式更改为RAM模式。

你可能感兴趣的:(云平台,Openstack,操作系统,Ubuntu,消息队列,RabbitMQ,性能优化,HA)