说明
无论安装那个版本的rabbitmq一定要确定好rabbimq对应的erlang版本范围,否则会出各种问题,rabbitmq这点很烦。
查询地址如下:
https://www.rabbitmq.com/which-erlang.html
按官方说明rabbitmq-3.7.17要求erlang版本范围:20.3.x~22.0.x之间
一、单机版RabbitMQ部署
1.1 安装依赖包
# 安装依赖包
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixODBC unixODBC-devel httpd python-simplejson
yum -y install epel-release # 之后再执行yum -y install #socat,有先后顺序
yum -y install socat
1.2 安装erlang环境
#安装Erlang Solutions仓库到你的系统, 如果不设置,yum安装的erlang版本通常太低
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.17/rabbitmq-server-3.7.17-1.el7.noarch.rpm
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
yum install -y erlang
1.3 安装rabbitmq
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.17/rabbitmq-server-3.7.17-1.el7.noarch.rpm
rpm -ivh rabbitmq-server-3.6.12-1.el6.noarch.rpm
#配置文件
cp /usr/share/doc/rabbitmq-server-3.6.12/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
# 开启UI控制台访问
rabbitmq-plugins enable rabbitmq_management
1.4、用户管理和权限配置
默认用户guest/guest具有最高权限的,一般不用于直接登录,通过下面配置管理员账号和密码(注意复杂度)
1)添加管理员账号:
rabbitmqctl add_user rabbitadmin xxxxxpasword
2) 分配用户标签为管理员
rabbitmqctl set_user_tags rabbitadmin administrator
3) 授予文件目录权限
rabbitmqctl set_permissions -p "/" rabbitadmin ".*" ".*" ".*"
4)创建和赋角色完成后查看并确认
rabbitmqctl list_users
5)登录rabbitmq管理界面(切记:访问之前检查防火墙问题)
浏览器输入地址:http://服务器IP地址:15672/
二,集群环境安装
根据上面教程完成单机版部署后,可以按照相同完成2台slave环境的安装。注:我只用一台salve
2.1 Erlang Cookie(认证)
Erlang Cookie 是保证不同节点可以相互通信的密钥,要保证集群中的不同节点相互通信必须共享相同的 ErlangCookie。具体的目录存放在/var/lib/rabbitmq/.erlang.cookie。
选择任意一个节点为Master(这里选择A为Master),也就是说我们需要把A的Cookie文件同步到B节点上去,进入/var/lib/rabbitmq目录下
scp .erlang.cookie root@xxxxxxx:/var/lib/rabbitmq/
## 必须保证文件的所有者是rabbitmq
chown -R rabbitmq:rabbitmq .erlang.cookie
## 关闭所有节点,为后面集群启动准备
rabbitmqctl stop
2.2 启动集群
# 每个节点执行,后续启动集群使用此命令即可
rabbitmq-server -detached
# 在slave节点执行
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@server-mysql1
rabbitmqctl start_app
# 在任一节点查看集群状态
rabbitmqctl cluster_status
Cluster status of node rabbit@server-mysql1 ...
[{nodes,[{disc,['rabbit@server-mysql1','rabbit@server-mysql2']}]},
{running_nodes,['rabbit@server-mysql2','rabbit@server-mysql1']},
{cluster_name,<<"rabbit@server-mysql1">>},
{partitions,[]},
{alarms,[{'rabbit@server-mysql2',[]},{'rabbit@server-mysql1',[]}]}]
## 登录ui端
可以看到overview里已经可以看到集群的所有节点
注1:节点类型
rabbitmqctl join_cluster {clusternode} [--ram]
--ram 表示作为RAM节点结合到该集群中。
该命令指令本节结合到指定的集群中,在结合之前,该节点需要reset,所以在使用时,需要格外注意。为了成功运行本命令,必须要停止RabbitMQ应用,例如 stop_app
集群节点有两种类型: disc 和 RAM。disc类型,复制数据在RAM和disc上,在节点失效的情况下,提供了冗余保证,也能从一些全局事件中恢复,例如所有节点失效。RAM类型,只复制数据在RAM上,主要表现在伸缩性上,特别是在管理资源(例如:增加删除队列,交换器,或者绑定)上表现突出。
# 一个集群必须至少含有一个disc节点,当通常都多余一个。通过该命令时,默认是设置为disc节点,如果需创建RAM节点,需要指定参数 --ram
# 执行此命令之后,在该节点上启动的RabbitMQ应用,在该节点挂掉之后,会尝试连接节点所在集群中的其他节点。
# 为了离开集群,可以 reset 该节点,也可以使用命令 forget_cluster_node 远程删除节点
链接:https://www.jianshu.com/p/93bd59bc4068
2.3 配置镜像队列
任意节点执行
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态一致。
- 普通模式:默认的集群模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于 Queue 来说,消息实体只存在于其中一个节点 rabbit01(或者 rabbit02),rabbit01 和 rabbit02 两个节点仅有相同的元数据,即队列的结构。当消息进入 rabbit01 节点的 Queue 后,consumer 从 rabbit02 节点消费时,RabbitMQ 会临时在 rabbit01、rabbit02 间进行消息传输,把 A 中的消息实体取出并经过 B 发送给 consumer。所以 consumer 应尽量连接每一个节点,从中取消息。
- 镜像模式:将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现 RabbitMQ 的 HA 高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在 consumer 消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
2.3 集群运维操作
# 查看集群状态
rabbitmqctl cluster_status
# 移除节点
rabbitmqctl forget_cluster_node rabbit@hostanme
# 修改集群名称
rabbitmqctl set_cluster_name rabbitmq_cluster
参考
https://blog.csdn.net/u012374672/article/details/100872198
https://www.cnblogs.com/operationhome/p/10483840.html
https://www.cnblogs.com/xishuai/p/centos-rabbitmq-cluster-and-haproxy.html