rabbitmq 简单应用

运行模式介绍

单一模式:即单机情况不做集群,就单独运行一个rabbitmq而已。

普通模式:默认模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。如果做了消息持久化,那么得等rabbit01节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。

镜像模式:把需要的队列做成镜像队列,存在与多个节点属于RabbitMQ的HA方案。该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。

安装rabbitmq

http://www.rabbitmq.com/install-rpm.html

https://github.com/rabbitmq/erlang-rpm

rabbitmq 与erlang的依赖关系

RabbitMQ Minimum required Erlang/OTP Maximum supported Erlang/OTP
3.7.7 19.3.6.4 21.0.x
3.7.6 3.7.5 3.7.4 3.7.3 3.7.2 3.7.1 3.7.0 19.3 20.3.x
3.6.16 3.6.15 19.3 20.3.x
3.6.14 3.6.13 3.6.12 3.6.11 R16B03 20.1.x
3.6.10 3.6.9 3.6.8 3.6.7 3.6.6 3.6.5 3.6.4 R16B03 19.3.x
3.6.3 3.6.2 3.6.1 3.6.0 R16B03 18.3.x
3.5.x R14B04 17.5.x
3.4.x R13B03 16B03

本次安装erlang版本为21.0.x,rabbitmq的版本为3.7.7

安装erlang,使用一个支持rabbimq但删除删除多余模块的erlang rpm包安装

# cat /etc/yum.repos.d/erlang.repo 
[rabbitmq-erlang]
name=rabbitmq-erlang
baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/21/el/7
gpgcheck=1
gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
repo_gpgcheck=0
enabled=1

# yum install erlang -y
# rpm -qa|grep erlang
erlang-21.0.3-1.el7.centos.x86_64

下载rabbimq 安装包

# wget https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.7/rabbitmq-server-3.7.7-1.el7.noarch.rpm
# rpm -ivh rabbitmq-server-3.7.7-1.el7.noarch.rpm

rabbitmq的数据目录和日志目录分别为 /var/lib/rabbitmq /var/log/rabbitmq ,使用docker 运行rabbitmq数据持久化要将他们挂载到宿主机

启动rabbitmq

rabbitmq在第一次启动的时候会进行初始化创建一个guest用户,密码也是guest,并给其一个administrator的tags

systemctl start rabbitmq-server

查看状态

rabbitmqctl status

停止服务

rabbitmqctl stop_app

启动服务

rabbitmqctl start_app

启动web管理插件

rabbitmq-plugins enable rabbitmq_management

创建一个用户,并设置为administrator权限

rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator

查询全部用户

rabbitmqctl list_users

对用户进行授权命令:rabbitmqctl set_permissions [-p vhostpath] username regexp regexp regexp

对用户pan授予对全部host的全部权限:

rabbitmqctl  set_permissions  -p  /  pan  '.*'  '.*'  '.*'

列出用户权限命令:rabbitmqctl list_user_permissions username

使用rabbitmqctl change_password username newpassword 进行密码修改

删除用户命令: rabbitmqctl delete_user username

列出用户权限命令:rabbitmqctl list_user_permissions username

创建普通集群

hostname ip
rabb-1 192.168.226.42
rabb-2 192.168.226.43

先确保.erlang.cookie文件在集群内的每个机器一致,.erlang.cookie 在$HOME 或者/var/lib/rabbitmq下面,保证其权限为 600

在rabb-1上面操作
首先停止服务

rabbitmqctl stop_app

加入集群

rabbitmqctl join_cluster --ram rabbit@rabb-2
--ram 和 --disc 的区别介绍 https://www.cnblogs.com/me-sa/archive/2012/11/12/rabbitmq_ram_or_disk_node.html

启动服务

rabbitmqctl start_app

这个时候就发现在rabb-1上面的配置全部消失,在次创建用户,登陆网页查看吧

这个时候集群处在普通模式,下面我们将创建镜像高可用模式集群

镜像高可用模式集群

镜像集群其实通过普通集群开启策略来实现的
在普通集群开启如下策略:

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
ha-all:为策略名称。

^:为匹配符,只有一个^代表匹配所有,^zlh为匹配名称为zlh的exchanges或者queue。

ha-mode:为匹配类型,他分为3种模式:all-所有(所有的queue),exctly-部分(需配置ha-params参数,此参数为int类型比如3,众多集群中的随机3台机器),nodes-指定(需配置ha-params参数,此参数为数组类型比如["3rabbit@F","rabbit@G"]这样指定为F与G这2台机器。)。

查看集群状态:

# rabbitmqctl cluster_status
Cluster status of node rabbit@rabb-1 ...
[{nodes,[{disc,['rabbit@rabb-2']},{ram,['rabbit@rabb-1']}]},
 {running_nodes,['rabbit@rabb-2','rabbit@rabb-1']},
 {cluster_name,<<"rabbit@rabb-1">>},
 {partitions,[]},
 {alarms,[{'rabbit@rabb-2',[]},{'rabbit@rabb-1',[]}]}]

nodename 设置

linux环境下如果没有指定rabbitmq的nodename将使用默认值 rabbit@$HOSTNAME

可以在启动前设置环境变量 RABBITMQ_NODENAME 来指定rabbitmq的nodename

修改web端口

编辑文件/etc/rabbitmq/rabbitmq.config如下,将web端口修改为16672

cat /etc/rabbitmq/rabbitmq.config
[{rabbit, [{loopback_users, []}, {cluster_partition_handling, ignore}]}, {kernel, [{net_ticktime, 120}]}, {rabbitmq_management, [{listener, [{port, 16672}]}]}].

修改rabbimq的服务端口RABBITMQ_NODE_PORT和用于节点和CLI工具连接的端口

服务端口RABBITMQ_NODE_PORT 默认为5672,可以在启动rabbitmq前使用 自定义环境变量 RABBITMQ_NODE_PORT 来修改

RABBITMQ_DIST_PORT 默认为 服务端口+20000 ,可以在启动rabbitmq前使用 自定义环境变量 RABBITMQ_DIST_PORT 来修改

erlang 集群端口ERL_EPMD_PORT 修改

erlang 集群端口默认为4369 , ,可以在启动rabbitmq前使用 自定义环境变量 "ERL_EPMD_PORT 来修改

参考文档

https://www.cnblogs.com/knowledgesea/p/6535766.html

https://www.cnblogs.com/huangxincheng/p/6113891.html

https://www.cnblogs.com/wangiqngpei557/p/6158094.html

https://www.cnblogs.com/flat_peach/archive/2013/04/07/3004008.html

https://www.cnblogs.com/zhen-rh/p/6884297.html
原文地址:https://www.cnblogs.com/panjunbai/p/9412823.html