RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。
它是一个异步消息处理中心,史上最好的。对软件模块间的异步处理和解耦非常有帮助。
当然本笔记的主题不是如何使用,而是高可用。
安装rabbitmq
测试环境:
host1 192.168.30.1 (rabbitmq-server/master)
host2 192.168.30.2 (rabbitmq-server/slave)
host3 192.168.30.3 (rabbitmq-server/slave)
感谢系统部的周大帅整了一个本地yum仓库,使得安装非常简单快速,两条命令足矣。
$ yum install -y erlang
$ yum install -y rabbitmq-server
没有本地仓库怎么办?那就老老实实源码安装吧!-_-
或者还有周大帅第二个福利,整理好的rpm包附件下载吧。
继续,启动rabbitmq-server
$ systemctl enable rabbitmq-server
$ systemctl start rabbitmq-server
查看rabbitmq-server的状态
$ rabbitmqctl status
#输出太多,不贴了哈!
开启成功,默认端口5672
web管理工具
rabbitmqctl是rabbitmq自带的一个cli式的管理命令。尽管挺好用的,但是不够直观啊。
rabbitmq还自带了一个web管理工具rabbitmq_management,默认没有开启,需要手动开启。
$ rabbitmq-plugins enable rabbitmq_management
$ systemctl restart rabbitmq-server
用浏览器打开http://192.168.30.1:15672/,默认账号guest,密码guest
rabbitmq集群
- 修改3台主机的/etc/hosts
host1 192.168.30.1
host2 192.168.30.2
host3 192.168.30.3
- 关闭3个rabbitmq
$ rabbitmqctl stop
- detached
$ rabbitmqctl -detached
- 复制cookie
$ scp root@192.168.30.1:/var/lib/rabbitmq/.erlang.cookie /var/lib/rabbitmq/.erlang.cookie
$ chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
$ chmod 400 /var/lib/rabbitmq/.erlang.cookie
- join cluster
把host2, host3加入到host1的集群
$ rabbitmqctl cluster_status
Cluster status of node 'rabbit@host2' ...
[{nodes,[{disc,['rabbit@host2']}]},
{running_nodes,['rabbit@host2']},
{cluster_name,<<"rabbit@host2">>},
{partitions,[]}]
... done.
$ rabbitmqctl stop_app
# 可以是--ram或者--disc
$ rabbitmqctl join_cluster --ram rabbit@host1
# 后期也可以修改格式
$ rabbitmqctl change_cluster_node_type disc
- 在启动host2和host3的rabbitmq-server
$ rabbitmqctl change_cluster_node_type disc
$ rabbitmqctl start_app
- 查看cluster_status
$ rabbitmqctl cluster_status
Cluster status of node 'rabbit@host2' ...
[{nodes,[{disc,['rabbit@host1','rabbit@host2']}]},
{running_nodes,['rabbit@host1','rabbit@host2']},
{cluster_name,<<"rabbit@host1">>},
{partitions,[]}]
...done.
- 设置同步策略
$ rabbitmqctl set_policy my-ha-all "^" '{"ha-mode":"all"}'
ha-mode有三种:
至此,高可用配置完成。
如果应用支持配置多个rabbitmq,那么到这里可以结束了。
如果不支持多个rabbitmq,那么继续配置nginx代理。
nginx代理
- rabbitmq代理
host1增加nginx配置文件/etc/nginx/conf.d/rabbitmq_proxy.conf:
upstream rabbitmq-server {
server 192.168.30.1:5672 weight=1;
server 192.168.30.2:5672 weight=1;
server 192.168.30.3:5672 weight=1;
}
server {
listen 0.0.0.0:35672;
proxy_pass rabbitmq-server;
}
$ nginx -s reload
测试一下:
- 添加一个队列:testqueue
- 可以看到已经队列创建成功,此时它是属于rabbitmq-01(这里用了rabbitmq-01替代host01,下同)的
- 停掉rabbitmq-01的服务后,可以看到testqueue在rabbitmq-02上被激活
代理配置完成,应用中配置rabbitmq设置为nginx代理的ip和port即可。
- rabbitmq_management代理
host1增加nginx配置文件/etc/nginx/conf.d/rabbitmq_mgr_proxy.conf:
upstream rabbitmq-mgr-server{
server 192.168.30.1:15672 weight=1;
server 192.168.30.2:15672 weight=1;
server 192.168.30.3:15672 weight=1;
}
server {
listen 80;
server_name localhost;
location /rabbitmq_management {
proxy_pass http://rabbitmq-mgr-server;
}
}
$ nginx -s reload
用浏览器打开http://192.168.30.1/rabbitmq_management
done !