对于linux系统版本、rabbitMq及相关依赖版本如下:
名称 | 版本要求 |
---|---|
centos系统 | 7.0以上 |
rabbitmq | 3.7.7~3.7.14 |
erlang | 20.3.x~21.3.x |
socat | 1.7.3.x |
rabbitMq及相关依赖的rpm包下载地址如下:
该部署文档使用的版本如下:
rabbitMq:3.7.9
erlang:21.3.6
socat:1.7.3.2
将rpm包上传至$HOME目录,按照顺序分别执行以下命令
#安装erlang依赖
rpm -ivh erlang-21.3.6-1.el7.x86_64.rpm
#安装socat依赖
rpm -ivh socat-1.7.3.2-2.el7.x86_64.rpm
#安装rabbitmq
rpm -ivh rabbitmq-server-3.7.9-1.el7.noarch.rpm
【注意】:部分服务器在执行第一个rpm的时候可能会出现error:Failed dependencies:libcrypto.so.10() …的错误,解决方法如下三种,
1.升级openssl,安装离线文件中的openssl-libs-1.0.2k-19.el7.x86_64.rpm包,然后重新安装上面报错的rpm包即可,执行命令如下
rpm -ivh openssl-libs-1.0.2k-19.el7.x86_64.rpm --force
2.安装rpm包的时候添加–force(强制)和–nodeps(不查找依赖关系)参数即可,如下
rpm -ivh erlang-21.3.6-1.el7.x86_64.rpm --force --nodeps
3.使用yum安装libcrypto*后,再重新安装rpm包命令如下
yum install libcrypto*
#查看状态
systemctl status rabbitmq-server
#启动服务
systemctl start rabbitmq-server
#停止服务
systemctl stop rabbitmq-server
#重启服务
systemctl restart rabbitmq-server
#添加开机启动RabbitMQ服务
chkconfig rabbitmq-server on
RabbitMQ自带了web管理界面,只需要启动插件便可以使用,命令如下:
rabbitmq-plugins enable rabbitmq_management
然后通过浏览器访问 http://localhost:15672 (默认用户:guest,密码:guest)
由于RabbitMQ默认的账号用户名和密码都是guest。为了安全起见,我们需要删掉默认用户,并添加新用户,此处用户名、密码以【admin、admin123】为例,命令如下:
# 1.删除guest用户
rabbitmqctl delete_user guest
# 2.添加admin用户
rabbitmqctl add_user admin admin123
# 3.将admin添加至administrator
rabbitmqctl set_user_tags robot administrator
# 4.赋予用户默认vhost的全部操作权限
rabbitmqctl set_permissions -p / robot ".*" ".*" ".*"
# 5.查看当前所有用户
rabbitmqctl list_users
# 6.查看admin用户的权限
rabbitmqctl list_user_permissions admin
rabbitmq服务的主程序使用的默认端口为5672,如果有需要修改,则按如下步骤操作
查找配置文件位置:
find / -name rabbitmq.config*
# /usr/share/doc/rabbitmq-server-3.7.10/rabbitmq.config.example
拷贝配置文件到 /etc/rabbitmq
目录下:
cp /usr/share/doc/rabbitmq-server-3.7.10/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
修改配置文件:
#修改控制台端口号
{rabbitmq_management, [{listener, [{port, 8888}]}]}
#修改mq服务端口号
{rabbit, [{tcp_listeners, [5673]}]}
RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。消息队列通过rabbitmq HA镜像队列进行消息队列实体复制。
普通模式下,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。
镜像模式下,将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
准备至少两台机器,我这里分别为:192.168.24.100,192.168.24.101,设置主机名分别为:mem-100,mem-101。
【注意】如果主机名为localhost,请修改主机名,命令如下
hostnamectl set-hostname mem-100
配置hosts文件内容(两台台机器上都需要配置,内容一样就可以,前面是IP,后面是各个主机的主机名)
命令:
vi /etc/hosts
在hosts文件末尾添加一下内容:
192.168.24.100 mem-100
192.168.24.101 mem-101
修改完成后保证两台主机能够相互ping通,如下图:
【注意】如果无法ping通,请确保两台服务器防火墙关闭,命令如下
systemctl stop firewalld
两台服务器分别安装rabbitmq并启动,具体可参考单机部署
#启动服务
systemctl start rabbitmq-server
#启用web插件
rabbitmq-plugins enable rabbitmq_management
请在主节点主机上添加用户,参考2.4部分内容
Rabbitmq的集群是依附于erlang的集群来工作的,所以必须先构建起erlang的集群景象。Erlang的集群中各节点是经由过程一个magic cookie来实现的,这个cookie存放在$HOME中或者在/var/lib/rabbitmq/.erlang.cookie中,文件是400的权限。所以必须保证各节点cookie一致,不然节点之间就无法通信。(此处的cookie存放在/var/lib/rabbitmq/.erlang.cookie中)
此处将mem-100设为主节点,使用scp的方式将mem-100节点的.erlang.cookie的值复制到mem-101节点中,命令如下:
scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/.erlang.cookie
查看.erlang.cookie中的值,保证mem-100和mem-101的cookie值一样,命令如下:
cat /var/lib/rabbitmq/.erlang.cookie
重启子节点的rabbitmq,使新的.erlang.cookie生效
#重启服务
systemctl restart rabbitmq-server
此处已mem-100作为主节点,在主节点mem-100服务器上查看集群状态,命令:
rabbitmqctl cluster_status
从上面的结果{cluster_name,<<“rabbit@mem-100”>>},可以看出来,集群的名称叫rabbit@mem-100
在子节点mem-101主机上做如下操作,将该节点添加到集群(rabbit@mem-100)中,命令:
# 1.rabbitmqctl stop是停止应用和集群节点,rabbitmqctl stop_app是只停应用,不停集群节点
rabbitmqctl stop_app
rabbitmqctl reset
# 2.添加集群节点
rabbitmqctl join_cluster rabbit@mem-100
# 3.再启动应用
rabbitmqctl start_app
此时在主节点mem-100主机上查看集群状态如下:
【注意】如果在添加集群节点的时候报错,可能的原因如下:
在主节点mem-100主机上执行命令:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
参数意思为:
ha-all:为策略名称。
:为匹配符,只有一个代表匹配所有,^zlh为匹配名称为zlh的exchanges或者queue。
ha-mode:为匹配类型,他分为3种模式:all-所有(所有的queue),exctly-部分(需配置ha-params参数,此参数为int类型比如3,众多集群中的随机3台机器),nodes-指定(需配置ha-params参数,此参数为数组类型比如[“rabbit@mem-100”,“rabbit@mem-101”]这样指定为mem-100与mem-101这2台机器。)。