[toc]
Rebbitmq介绍
消息中间件rabbitmq,一般以集群方式部署,主要提供消息的接受和发送,实现各微服务之间的消息异步。
rabbitmq是依据erlang的分布式特性(RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookie以获得认证)来实现的,所以部署rabbitmq分布式集群时要先安装erlang,并把其中一个服务的cookie复制到另外的节点。
rabbitmq集群中,各个rabbitmq为对等节点,即每个节点均提供给客户端连接,进行消息的接收和发送。节点分为内存节点和磁盘节点,一般的,均应建立为磁盘节点,为了防止机器重启后的消息消失;
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消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
实验环境
- 软硬件信息:
- CentOS Linux release 7.3.1611 (Core)
- rabbitmq-server-generic-unix-3.7.8.tar.xz
- otp_src_20.0.tar.gz
- 服务器IP:
- 10.241.0.10
- 10.241.0.11
- 10.241.0.12
- /etc/hosts(所有节点)
- 10.241.0.10 node1
- 10.241.0.11 node2
- 10.241.0.12 node3
安装
安装依赖工具(所有节点)
yum -y install make gcc glibc-devel m4 ncurses-devel autoconf openssl-devel
yum -y install unixODBC unixODBC-devel
安装erlang(所有节点)
[root@node1 ~]# wget http://erlang.org/download/otp_src_20.0.tar.gz
[root@node1 ~]# tar -xvf otp_src_20.0.tar.gz
[root@node1 ~]# cd otp_src_20.0
[root@node1 ~]# ./configure --prefix=/usr/local/erlang --enable-hipe --enable-threads --enable-smp-support --enable-kernel-poll --without-javac
*********************************************************************
********************** APPLICATIONS DISABLED **********************
*********************************************************************
jinterface : Java compiler disabled by user
*********************************************************************
*********************************************************************
********************** APPLICATIONS INFORMATION *******************
*********************************************************************
wx : wxWidgets not found, wx will NOT be usable
*********************************************************************
*********************************************************************
********************** DOCUMENTATION INFORMATION ******************
*********************************************************************
documentation :
fop is missing.
Using fakefop to generate placeholder PDF files.
*********************************************************************
[root@node1 ~]# make -j`lscpu | grep ^CPU\(s\):|awk '{print $2}'`
[root@node1 ~]# make install
[root@node1 ~]# ln -s /usr/local/erlang/bin/erl /usr/local/bin/
#测试
[root@node2 otp_src_20.0]# erl
Erlang/OTP 20 [erts-9.0] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.0 (abort with ^G)
1>
安装rabbitmq(所有节点)
[root@node1 ~]# wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.8/rabbitmq-server-generic-unix-3.7.8.tar.xz
[root@node1 ~]# tar -xvf rabbitmq-server-generic-unix-3.7.8.tar.xz -C /usr/local
[root@node1 local]# cd /usr/local
[root@node1 local]# mv rabbitmq_server-3.7.8 rabbitmq
#新建配置文件
[root@node1 rabbitmq]# mkdir -p /data/rabbitmq
[root@node1 rabbitmq]# vim rabbitmq-env.conf
RABBITMQ_NODENAME=node1
RABBITMQ_NODE_IP_ADDRESS=10.241.0.10
RABBITMQ_NODE_PORT=5672
LOG_BASE=/data/rabbitmq
MNESIA_BASE=/data/rabbitmq/mnesia
#创建软连接
[root@node1 rabbitmq]# ln -s /usr/local/rabbitmq/sbin/* /usr/local/bin/
前台启动命令: ./rabbitmq-server
后台启动命令: ./rabbitmq-server -detached
停止服务命令:./rabbitmqctl stop
#导入rabbitmq的管理界面
[root@node1 local]# cd rabbitmq
[root@node1 rabbitmq]# sbin/rabbitmq-plugins enable rabbitmq_management
启动rabbitmq和添加用户
node1节点
#启动rabbitmq
[root@node1 rabbitmq]# /usr/local/rabbitmq/sbin/rabbitmq-server -detached
Warning: PID file not written; -detached was passed.
#添加用户
[root@node1 rabbitmq]# /usr/local/rabbitmq/sbin/rabbitmqctl add_user admin admin
Adding user "admin" ...
#添加到administrator管理组
[root@node1 rabbitmq]# /usr/local/rabbitmq/sbin/rabbitmqctl set_user_tags admin administrator
Setting tags for user "admin" to [administrator] ...
#保证三台机器上的cookie是一致的
[root@node1 rabbitmq]# scp ~/.erlang.cookie root@10.241.0.11:~/.erlang.cookie
[root@node1 rabbitmq]# scp ~/.erlang.cookie root@10.241.0.12:~/.erlang.cookie
node2节点
#启动添加用户和组
[root@node2 local]# /usr/local/rabbitmq/sbin/rabbitmq-server -detached
Warning: PID file not written; -detached was passed.
[root@node2 local]# /usr/local/rabbitmq/sbin/rabbitmqctl add_user admin admin
Adding user "admin" ...
[root@node2 local]# /usr/local/rabbitmq/sbin/rabbitmqctl set_user_tags admin administrator
Setting tags for user "admin" to [administrator] ...
#停止后重置数据加入集群
[root@node2 local]# /usr/local/rabbitmq/sbin/rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node2 ...
[root@node2 local]# /usr/local/rabbitmq/sbin/rabbitmqctl reset
Resetting node rabbit@node2 ...
[root@node2 local]# /usr/local/rabbitmq/sbin/rabbitmqctl join_cluster rabbit@node1
Clustering node rabbit@node2 with rabbit@node1
#加入后启动并查看集群状态
[root@node2 local]# /usr/local/rabbitmq/sbin/rabbitmqctl start_app
Starting node rabbit@node2 ...
completed with 3 plugins.
[root@node2 local]# /usr/local/rabbitmq/sbin/rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node1,rabbit@node2]}]},
{running_nodes,[rabbit@node1,rabbit@node2]},
{cluster_name,<<"rabbit@node2">>},
{partitions,[]},
{alarms,[{rabbit@node1,[]},{rabbit@node2,[]}]}]
node3节点
[root@node3 rabbitmq]# /usr/local/rabbitmq/sbin/rabbitmq-server -detached
Warning: PID file not written; -detached was passed.
[root@node3 rabbitmq]# /usr/local/rabbitmq/sbin/rabbitmqctl add_user admin admin
Adding user "admin" ...
[root@node3 rabbitmq]# /usr/local/rabbitmq/sbin/rabbitmqctl set_user_tags admin administrator
Setting tags for user "admin" to [administrator] ...
[root@node3 rabbitmq]# /usr/local/rabbitmq/sbin/rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node3 ...
[root@node3 rabbitmq]# /usr/local/rabbitmq/sbin/rabbitmqctl reset
Resetting node rabbit@node3 ...
[root@node3 rabbitmq]# /usr/local/rabbitmq/sbin/rabbitmqctl join_cluster rabbit@node1
Clustering node rabbit@node3 with rabbit@node1
[root@node3 rabbitmq]# /usr/local/rabbitmq/sbin/rabbitmqctl start_app
Starting node rabbit@node3 ...
completed with 3 plugins.
[root@node3 rabbitmq]# /usr/local/rabbitmq/sbin/rabbitmqctl cluster_status
Cluster status of node rabbit@node3 ...
[{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]},
{running_nodes,[rabbit@node1,rabbit@node2,rabbit@node3]},
{cluster_name,<<"rabbit@node2">>},
{partitions,[]},
{alarms,[{rabbit@node1,[]},{rabbit@node2,[]},{rabbit@node3,[]}]}]
登录rabbitmq
http://10.241.0.10:15672/#/
账号: admin
密码: admin
image (2).png
常用命令
rabbitmqctl stop_app 仅关闭应用,不关闭节点
rabbitmqctl start_app 开启应用
rabbitmq--server -detached 启动节点和应用
rabbitmqctl 关闭节点和应用
服务器启动与关闭
启动: rabbitmq-server –detached
关闭: rabbitmqctl stop
若单机有多个实例,则在rabbitmqctlh后加–n 指定名称
插件管理
开启某个插件:rabbitmq-plugins enable xxx
关闭某个插件:rabbitmq-plugins disable xxx
注意:重启服务器后生效。
virtual_host管理
新建virtual_host:rabbitmqctl add_vhost xxx
撤销virtual_host:rabbitmqctl delete_vhost xxx
用户管理
新建用户:rabbitmqctl add_user xxxpwd
删除用户: rabbitmqctl delete_user xxx
查看用户:rabbitmqctl list_users
改密码: rabbimqctl change_password {username} {newpassword}
设置用户角色:rabbitmqctlset_user_tags {username} {tag ...}
Tag可以为 administrator,monitoring, management
权限管理
权限设置:set_permissions [-pvhostpath] {user} {conf} {write} {read}
Vhostpath
Vhost路径
user
用户名
Conf
一个正则表达式match哪些配置资源能够被该用户访问。
Write
一个正则表达式match哪些配置资源能够被该用户读。
Read
一个正则表达式match哪些配置资源能够被该用户访问。
获取服务器状态信息
服务器状态:rabbitmqctl status
获取集群状态信息
rabbitmqctl cluster_status
网友评论