介绍
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。本版本为3.6.1
Erlang安装
rabbitMQ需要erlang语言的支持,因此需要先安装erlang语言
命令:sudo apt-get install erlang
测试:启动erl
,能否进入
erl
Erlang R16B03 (erts-5.10.4) [source] [64-bit] [smp:8:8] [async-threads:10] [kernel-poll:false]
Eshell V5.10.4 (abort with ^G)
1>
可以看出来erlang的版本为5.10.4
RabbitMQ安装
-
鼠标操作模式: 在rabbitMQ官网中下载相应的ubuntu安装包deb,下载后双击即可安装完毕
-
命令操作模式:
-
下载:
wget --no-check-certificate http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.2/rabbitmq-server_3.6.2-1_all.deb
-
安装:
sudo dpkg -i rabbitmq-server_3.6.2-1_all.deb
-
如果遇到问题,修复依赖关系:
sudo apt-get install -f -y
,然后再尝试
RabbitMQ集群
集群IP与名称
- 192.168.1.157 作为集群的内存节点
- 192.168.1.158 作为集群的磁盘节点
- 192.168.1.159 作为集群的内存节点
- 192.168.1.78 作为反向代理(Haproxy)
集群中有两种节点:
-
内存节点:只保存状态到内存(一个例外的情况是:持久的queue的持久内容将被保存到disk)
-
磁盘节点:保存状态到内存和磁盘。 内存节点虽然不写入磁盘,但是它执行比磁盘节点要好。集群中,只需要一个磁盘节点来保存状态 就足够了 如果集群中只有内存节点,那么不能停止它们,否则所有的状态,消息等都会丢失。
对hostname和hosts的操作
对157,158,159进行操作,以192.168.1.158为例子:
- 记住IP:
cat /etc/hostname
cat /etc/hostname
<<'COMMENT'
administrator158
COMMENT
- 命令:
vim /etc/hosts
修改为:
cat /etc/hosts
<<'COMMENT'
127.0.0.1 localhost
127.0.1.1 administrator158
192.168.1.157 administrator157
192.168.1.158 administrator158
192.168.1.159 administrator159
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
COMMENT
修改完后,重启电脑。
请注意RabbitMQ集群节点必须在同一个网段里,如果是跨广域网效果就差。
设置节点的Cookie
以192.168.1.158为例:
- 查看erlang的cookie:
cat /var/lib/rabbitmq/.erlang.cookie
内容:
cat /var/lib/rabbitmq/.erlang.cookie
<<'COMMENT'
AZPRQAAHZQUNBRRDXNLX
COMMENT
-
将这个Cookie放到157,159上,例如在157上进行操作:
-
查看修改
.erlang.cookie
权限
ll /var/lib/rabbitmq/.erlang.cookie
<<'COMMENT'
-r-------- 1 rabbitmq rabbitmq 20 10月 28 00:00 /var/lib/rabbitmq/.erlang.cookie
COMMENT
chmod 777 /var/lib/rabbitmq/.erlang.cookie
ll /var/lib/rabbitmq/.erlang.cookie
<<'COMMENT'
-rwxrwxrwx 1 rabbitmq rabbitmq 20 10月 28 00:00 /var/lib/rabbitmq/.erlang.cookie*
COMMENT
- 修改Cookie
vim /var/lib/rabbitmq/.erlang.cookie
cat /var/lib/rabbitmq/.erlang.cookie
<<'COMMENT'
AZPRQAAHZQUNBRRDXNLX
COMMENT
或者,可以通过sftp进行文件传输,一定要确保Cookie相同,例如读写(400),用户(rabbitmq),用户组权限(rabbitmq)。
chgrp rabbitmq /var/lib/rabbitmq/.erlang.cookie
chown rabbitmq /var/lib/rabbitmq/.erlang.cookie
- 再次修改
.erlang.cookie
权限
chmod 400 /var/lib/rabbitmq/.erlang.cookie
ll /var/lib/rabbitmq/.erlang.cookie
<<'COMMENT'
-r-------- 1 rabbitmq rabbitmq 21 10月 28 15:20 /var/lib/rabbitmq/.erlang.cookie
COMMENT
- RabbitMQ重启
以下操作在192.168.1.159上操作
rabbitmqctl stop
<<'COMMENT'
Stopping and halting node rabbit@administrator159 ...
COMMENT
此命令让service rabbitmq-server status
为dead
sudo service rabbitmq-server start
<<'COMMENT'
* Starting message broker rabbitmq-server
* message broker already running
...done.
COMMENT
链接nodes
在192.168.1.159上操作:
rabbitmqctl stop_app
<<'COMMENT'
Stopping node rabbit@administrator159 ...
COMMENT
rabbitmqctl reset
<<'COMMENT'
Resetting node rabbit@administrator159 ...
COMMENT
rabbitmqctl join_cluster --ram rabbit@administrator158
<<'COMMENT'
Clustering node rabbit@administrator159 with rabbit@administrator158 ...
COMMENT
rabbitmqctl start_app
<<'COMMENT'
Starting node rabbit@administrator159 ...
COMMENT
rabbitmqctl cluster_status
<<'COMMENT'
Cluster status of node rabbit@administrator159 ...
[{nodes,[{disc,[rabbit@administrator158]},
{ram,[rabbit@administrator159,rabbit@administrator157]}]},
{running_nodes,[rabbit@administrator158,rabbit@administrator157,
rabbit@administrator159]},
{cluster_name,<<"rabbit@administrator158">>},
{partitions,[]},
{alarms,[{rabbit@administrator158,[]},
{rabbit@administrator157,[]},
{rabbit@administrator159,[]}]}]
COMMENT
可以看到disc为administrator158,而ram为157和159
如果要使administrator159在集群里也是磁盘节点,join_cluster 命令去掉–ram参数即可。只要在节点列表里包含了自己,它就成为一个磁盘节点。在RabbitMQ集群里,必须至少有一个磁盘节点存在。
注意系统中的防火墙服务问题
- 队列消息一致:
rabbitmqctl list_queues -p hrsystem
<<'COMMENT'
Listing queues ...
COMMENT
-p参数为vhost名称
- 重启RabbitMQ:
sudo service rabbitmq-server reload
同样在192.168.1.157上做相同的事情,而192.168.1.158就不用做了。重启158以后,发现user被消除掉了,这时候重复RabbitMQ设置中的添加用户,及配置用户权限与角色的操作
- 登录浏览器
192.168.1.158:15672
或其他两个均可
RabbitMQ设置
- 添加用户:
sudo rabbitmqctl add_user chenjian chenjian
- 添加虚拟队列:
sudo rabbitmqctl add_vhost chenjian
- 添加后台管理插件:
sudo rabbitmq-plugins enable rabbitmq_management
显示:
sudo rabbitmq-plugins enable rabbitmq_management
<<'COMMENT'
The following plugins have been enabled:
mochiweb
webmachine
rabbitmq_web_dispatch
amqp_client
rabbitmq_management_agent
rabbitmq_management
Applying plugin configuration to rabbit@administrator159... started 6 plugins.
COMMENT
- 添加用户权限:
rabbitmqctl set_permissions -p chenjian chenjian ".*" ".*" ".*"
或者sudo rabbitmqctl set_permissions -p chenjian chenjian ConfP WriteP ReadP
结果:
Setting permissions for user "chenjian" in vhost "chenjian" ...
- 修改用户角色:
sudo rabbitmqctl set_user_tags chenjian administrator
结果:
Setting tags for user "chenjian" to [administrator] ...
- 设置高可用策略
为了使用HAProxy做负载均衡,必须将整个RabbitMQ集群的状态设置为镜像模式,具体方式是通过以下命令,注意策略的设置也是在3.x版本中添加的功能,2.x版本是没有的。
命令: sudo rabbitmqctl set_policy -p chenjian ha-allqueue "^" '{"ha-mode":"all"}'
sudo rabbitmqctl set_policy -p chenjian ha-allqueue "^" '{"ha-mode":"all"}'
Setting policy "ha-allqueue" for pattern "^" to "{\"ha-mode\":\"all\"}" with priority "0" ...
在浏览器中输入192.168.1.159:15672
便可进入rabbitmq界面。
HaProxy反向代理
haproxy安装
IP: 192.168.1.78
操作系统:ubuntu14.04
命令: sudo apt-get install haproxy
作用:负载均衡器会监听5672端口,轮询我们的两个内存节点192.168.1.157、192.168.1.159的5672端口,192.168.1.158为磁盘节点,只做备份不提供给生产者、消费者使用,当然如果我们服务器资源充足情况也可以配置多个磁盘节点 ,这样磁盘节点除了故障也不会影响,除非同时出故障
修改haproxy配置内容
命令: sudo vim /etc/haproxy/haproxy.cfg
- 修改默认
option httplog
为option tcplog
defaults
log global
mode tcp
option tcplog
option dontlognull
- 添加haproxy的web端:
添加:
listen admin_stat
bind 0.0.0.0:8888
mode http
# 刷新时间段
stats refresh 10s
# 192.168.1.78:8888/rabbitmq_stats
stats uri /rabbitmq_stats
stats realm Haproxy\ Statistics
# 登录的账户密码
stats auth admin:admin
# 是否隐藏haproxy的版本
# stats hide-version
- 配置末尾添加:
listen rabbitmq_cluster *:5672
mode tcp
balance roundrobin
server rqslave1 192.168.1.157:5672 check inter 2000 rise 2 fall 3
server rqslave2 192.168.1.159:5672 check inter 2000 rise 2 fall 3
server rqmaster 192.168.1.158:5672 check inter 2000 rise 2 fall 3
在ubuntu16.04中,配置末尾添加:*
listen rabbitmq_cluster
bind *:5672
mode tcp
balance roundrobin
server rqslave1 192.168.1.157:5672 check inter 2000 rise 2 fall 3
server rqslave2 192.168.1.159:5672 check inter 2000 rise 2 fall 3
server rqmaster 192.168.1.158:5672 check inter 2000 rise 2 fall 3
启动haproxy服务
-
haproxy -f /etc/haproxy/haproxy.cfg -D
-
service haproxy start
查看haproxy的监听:
netstat -nl| grep 5672
<<'COMMENT'
tcp 0 0 0.0.0.0:5672 0.0.0.0:* LISTEN
COMMENT
或者可以登录http://192.168.1.78:8888/rabbitmq_stats
python程序中填写
CELERY_BROKER_USER = "chenjian"
CELERY_BROKER_PASSWORD = "chenjian"
CELERY_BROKER_HOST = "192.168.1.78"
CELERY_BROKER_PORT = 5672
CELERY_BROKER_VHOST = "chenjian"
BROKER_URL = "amqp://%s:%s@%s:%s/%s" % (CELERY_BROKER_USER,
CELERY_BROKER_PASSWORD, CELERY_BROKER_HOST,
CELERY_BROKER_PORT, CELERY_BROKER_VHOST)
参考博文
- rabbitmq的web管理界面无法使用guest用户登录
- Rabbitmq集群高可用测试
- Rabbitmq cluster setup with HAproxy
- RabbitMQ Clustering on Ubuntu 14.04
- RabblitMQ Cluster + HAProxy(负载均衡)
- 为OpenStack搭建高可用RabbitMQ集群
- rabbitmq集群+haproxy 相关 安装与配置和注意事项
本作品由陈健采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。