运行模式介绍
单一模式:即单机情况不做集群,就单独运行一个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