RabbitMQ学习之集群部署

RabbitMQ学习之集群部署

1         部署架构

   我们先搭建一个普通集群模式,在这个模式基础上再配置镜像模式实现高可用,Rabbit集群前增加一个反向代理,生产者、消费者通过反向代理访问RabbitMQ集群。

架构图如下:

 

 

    设计架构可以如下:在一个集群里,有4台机器,其中1台使用磁盘模式,另2台使用内存模式。2台内存模式的节点,无疑速度更快,因此客户端(consumer、producer)

连接访问它们。而磁盘模式的节点,由于磁盘IO相对较慢,因此仅作数据备份使用,另外一台作为反向代理。

2         部署安装

2.1     修改主机名和hosts文件

4台机器如下(通过/etc/sysconfig/network修改主机名):

[root@xuegod61 ~]# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.10.61   xuegod61.cn    xuegod61

192.168.10.62   xuegod62.cn    xuegod62

192.168.10.63   xuegod63.cn    xuegod63

192.168.10.64   xuegod64.cn    xuegod64

[root@xuegod61 ~]# scp /etc/hosts root@192.168.10.62:/etc/

[root@xuegod61 ~]# scp /etc/hosts root@192.168.10.63:/etc/

[root@xuegod61 ~]# scp /etc/hosts root@192.168.10.64:/etc/

xuegod61做负载均衡,xuegod62,63,64作为rabbitMQ,将上面的Rabbit主机解析都加入到每个Rabbit主机的/etc/hosts中

2.2     在rabbit机器上部署RabbitMq

2.2.1      安装Erlang

    RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
    AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

 关于rabbitmq的介绍参考:http://www.ostest.cn/archives/497http://lynnkong.iteye.com/blog/1699684

Rabbitmq 是用 erlang 语言写的,所以我们需要安装 Erlang

2.2.1.1  安装erlang依赖的基本环境 

yum -y install make gcc gcc-c++  kernel-devel m4 ncurses-devel openssl openssl-devel xmlto zip unzip

2.2.1.2  下载安装Erlang

从Erlang的官网 http://www.erlang.org/download.html 下载最新的erlang安装包, 这里下载的是http://www.erlang.org/download/otp_src_17.3.tar.gz

 tar xvzf otp_src_17.3.tar.gz

cd otp_src_17.3

./configure

make

make install

2.3     安装python  和simplejson

安装python

yum  install  -y  python  

下载安装simplejson,下载http://download.openpkg.org/components/cache/python-json/

wget http://download.openpkg.org/components/cache/python-json/simplejson-2.2.1.tar.gz

# tar xzvf simplejson-2.2.1.tar.gz

# cd simplejson-2.2.1

# python setup.py install

2.4     安装启动rabbitmq

2.4.1      下载安装rabbitmq

下载http://www.rabbitmq.com/releases/rabbitmq-server/v3.4.1/

# wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.4.1/rabbitmq-server-3.4.1.tar.gz

# tar xf  rabbitmq-server-3.4.1.tar.gz  -C /usr/local/src/

# mkdir /usr/local/rabbitmq

# cd /usr/local/src/rabbitmq-server-3.4.1/

#make

#make TARGET_DIR=/usr/local/rabbitmq/ SBIN_DIR=/usr/local/rabbitmq/sbin  MAN_DIR=/usr/local/rabbitmq/man DOC_INSTALL_DIR=/usr/local/rabbitmq/doc install

2.4.2      启动、关闭rabbitmq

启动 nohup /usr/local/rabbitmq/sbin/rabbitmq-server –detached &

关闭 /usr/local/rabbitmq/sbin/rabbitmqctl stop  &rabbitmqctl命令参考:http://www.rabbitmq.com/man/rabbitmqctl.1.man.html

查看启动端口:lsof -i:5672

启动出错原因:

(1)主机名不同导致,需修改主机名称( /etc/sysconfig/network)及解析(/etc/hosts)

(2)默认端口被占用5672,关闭被占用端口重新启动

2.4.3      安装web插件

mkdir /etc/rabbitmq

/usr/local/rabbitmq/sbin/rabbitmq-plugins enable rabbitmq_management  #启用

/usr/local/rabbitmq/sbin/rabbitmq-plugins disable rabbitmq_management #禁用

查看插件列表:/usr/local/rabbitmq/sbin/rabbitmq-plugins list

2.4.4      查看服务状态

/usr/local/rabbitmq/sbin/rabbitmqctl status

2.4.5      登录web控制台

查看开启端口:

 netstat -atn |grep 15672
 netstat -atn |grep 55672

端口存在,就可以用默认账号guest,guest登陆http://localhost:15672或55672,如果此时你从端口15672或55672登陆不了,请关闭防火墙,再次登陆,

 

 

出于安全的考虑,guest这个默认的用户只能通过http://localhost:15672 来登录,不能使用IP地址登录,也就是不能远程访问,这对于服务器上没有安装桌面的情况是无法管理维护的。要解决这个问题增加用户。

请运行如下的命令,增加用户admin,密码admin即可。

/usr/local/rabbitmq/sbin/rabbitmqctl add_user admin admin

/usr/local/rabbitmq/sbin/rabbitmqctl list_users

/usr/local/rabbitmq/sbin/rabbitmqctl set_user_tags admin administrator

2.5     配置

主要参考官方文档:http://www.rabbitmq.com/configure.html
一般情况下,RabbitMQ的默认配置就足够了。如果希望特殊设置的话,有两个途径:
一个是环境变量的配置文件 rabbitmq-env.conf ;
一个是配置信息的配置文件 rabbitmq.config;
注意,这两个文件默认是没有的,如果需要必须自己创建。

rabbitmq-env.conf
这个文件的位置是确定和不能改变的,位于:/etc/rabbitmq目录下(这个目录需要自己创建)。
文件的内容包括了RabbitMQ的一些环境变量,常用的有:
#RABBITMQ_NODE_PORT=    //端口号
#HOSTNAME=
RABBITMQ_NODENAME=mq
RABBITMQ_CONFIG_FILE=        //配置文件的路径
RABBITMQ_MNESIA_BASE=/rabbitmq/data        //需要使用的MNESIA数据库的路径
RABBITMQ_LOG_BASE=/rabbitmq/log        //log的路径
RABBITMQ_PLUGINS_DIR=/rabbitmq/plugins    //插件的路径
具体的列表见:http://www.rabbitmq.com/configure.html#define-environment-variables
rabbitmq.config
这是一个标准的erlang配置文件。它必须符合erlang配置文件的标准。
它既有默认的目录,也可以在rabbitmq-env.conf文件中配置。
文件的内容详见:http://www.rabbitmq.com/configure.html#config-items

3         设置每个节点Cookie

关闭所有rabbit服务,将xuegod62 节点的/root/.erlang.cookie内容复制到其他两台机器。

[root@xuegod62 ~]# scp .erlang.cookie 192.168.10.64:/root/

[root@xuegod62 ~]# scp .erlang.cookie 192.168.10.63:/root/

#chmod 777  /root/.erlang.cookie 

复制内容
#chmod 400 /root/.erlang.cookie 

保持文件权限一致。

 

4         使用detached参数独立运行启动服务

nohup /usr/local/rabbitmq/sbin/rabbitmq-server –detached &

查看节点下的集群:/usr/local/rabbitmq/sbin/rabbitmqctl cluster_status

Cluster status of node 'rabbit@m-zhutianwei-a' ...
[{nodes,[{disc,['rabbit@m-zhutianwei-a']}]},
 {running_nodes,['rabbit@m-zhutianwei-a']},
 {cluster_name,<<"rabbit@M-zhutianwei-A">>},
 {partitions,[]}]

5         将xuegod63、xuegod64作为内存节点与xuegod62连接起来

执行如下命令:

/usr/local/rabbitmq/sbin/rabbitmqctl stop_app
/usr/local/rabbitmq/sbin/rabbitmqctl join_cluster --ram rabbit@xuegod62(注意:这里不能带.cn)

/usr/local/rabbitmq/sbin/rabbitmqctl start_app

上述命令先停掉rabbitmq应用,然后调用cluster命令,将xuegod63或xuegod64连接到,使两者成为一个集群,最后重启rabbitmq应用。在这个cluster命令下,xuegod63、xuegod64是内存节点,xuegod62是磁盘节点(RabbitMQ启动后,默认是磁盘节点)。
如果要使xuegod63或xuegod64在集群里也是磁盘节点,join_cluster 命令去掉--ram参数即可
#/usr/local/rabbitmq/sbin/rabbitmqctl join_cluster rabbit@queue   
只要在节点列表里包含了自己,它就成为一个磁盘节点。在RabbitMQ集群里,必须至少有一个磁盘节点存在。

6         运行cluster_status命令查看集群状态

/usr/local/rabbitmq/sbin/rabbitmqctl cluster_status

 

 

7         测试

往任意一台集群节点里写入消息队列,会复制到另一个节点上,我们看到两个节点的消息队列数一致。

Listing queues ...
helloword       1

这样RabbitMQ集群就正常工作了。这种模式更适合非持久化队列,只有该队列是非持久的,客户端才能重新连接到集群里的其他节点,并重新创建队列。假如该队列是持久化的,那么唯一办法是将故障节点恢复起来。  

上面配置RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制,虽然该模式解决一部分节点压力,但队列节点宕机直接导致该队列无法使用,只能等待重启,所以要想在队列节点宕机或故障也能正常使用,就要复制队列内容到集群里的每个节点,需要创建镜像队列。下一节我们看看如何镜像模式来解决复制的问题,从而提高可用性 。

 

posted @ 2017-09-26 22:46  北极之光的博客  阅读(31)  评论(0编辑  收藏  举报