RabbitMQ消息中间件搭建for Centos7

什么是RabbitMQ

RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然:

单向解耦

Pj96L4.png

双向解耦(如:RPC)

PjCh7j.png

例如一个日志系统,很容易使用RabbitMQ简化工作量,一个Consumer可以进行消息的正常处理,另一个Consumer负责对消息进行日志记录,只要在程序中指定两个Consumer所监听的queue以相同的方式绑定到同一个exchange即可,剩下的消息分发工作由RabbitMQ完成。

PjCohq.png

引言

你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相互调用、通讯的问题而苦恼、挣扎?如果是,那么恭喜你,消息服务让你可以很轻松地解决这些问题。
消息服务擅长于解决多系统、异构系统间的数据交换(消息通知/通讯)问题,你也可以把它用于系统间服务的相互调用(RPC)。

RabbitMQ能为你做些什么?

消息系统允许软件、应用相互连接和扩展.这些应用可以相互链接起来组成一个更大的应用,或者将用户设备和数据进行连接.消息系统通过将消息的发送和接收分离来实现应用程序的异步和解偶.

或许你正在考虑进行数据投递,非阻塞操作或推送通知。或许你想要实现发布/订阅,异步处理,或者工作队列。所有这些都可以通过消息系统实现。

RabbitMQ是一个消息代理 -
一个消息系统的媒介。它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全。

RabbitMQ技术亮点

1)可靠性

RabbitMQ提供了多种技术可以让你在性能和可靠性之间进行权衡。这些技术包括持久性机制、投递确认、发布者证实和高可用性机制。

2)灵活的路由

消息在到达队列前是通过交换机进行路由的。RabbitMQ为典型的路由逻辑提供了多种内置交换机类型。如果你有更复杂的路由需求,可以将这些交换机组合起来使用,你甚至可以实现自己的交换机类型,并且当做RabbitMQ的插件来使用。

3)集群

在相同局域网中的多个RabbitMQ服务器可以聚合在一起,作为一个独立的逻辑代理来使用。

4)联合

对于服务器来说,它比集群需要更多的松散和非可靠链接。为此RabbitMQ提供了联合模型。

5)高可用的队列

在同一个集群里,队列可以被镜像到多个机器中,以确保当其中某些硬件出现故障后,你的消息仍然安全。

6)多协议

RabbitMQ 支持多种消息协议的消息传递。

7)广泛的客户端

只要是你能想到的编程语言几乎都有与其相适配的RabbitMQ客户端。

8)可视化管理工具

RabbitMQ附带了一个易于使用的可视化管理工具,它可以帮助你监控消息代理的每一个环节。

9)追踪

如果你的消息系统有异常行为,RabbitMQ还提供了追踪的支持,让你能够发现问题所在。

10)插件系统

RabbitMQ附带了各种各样的插件来对自己进行扩展。你甚至也可以写自己的插件来使用。

搭建RabbitMQ

rabbitmq 是用 erlang 语言写的,所以我们需要安装 erlang,安装 erlang 又需要安装 python,所以我们下边先从python来着手安装,貌似从哪看到pyhton2.5以下版本还要安装个pyhton的插件,具体忘记了,默认自带了2.7版本,所以就忽略了这个

一、安装pyhton

Centos7自带了python2.7.5,所以这步省略

PjCqjU.png

二、安装erlang(源码编译安装)

官网下载erlang:http://www.erlang.org/news/116

1、创建源码包目录并上传软件包
1
2
mkdir -p /a01/apps/apps_src
cd /a01/apps/apps_src/
2、解包
1
2
tar -zxvf otp_src_20.2.tar.gz
cd otp_src_20.2
3、配置
1
./configure --prefix=/a01/apps/erlang

PjCjHJ.png

缺少依赖:

1
yum -y install ncurses-devel

再来一次:

1
./configure --prefix=/a01/apps/erlang

PjPS41.png

1
2
3
4
5
crypto         : No usable OpenSSL found
jinterface : No Java compiler found
odbc : ODBC library - link check failed
ssh : No usable OpenSSL found
ssl : No usable OpenSSL found

这里主要注意APPLICATIONS DISABLED部分的提示,其它两部分是不影响的,从上图中很明显可以看到缺少了很多依赖,其实不安装这些依赖也可以编译安装完成RabbitMQ,但是安装完成之后服务起不来,我们一个一个来解决这些依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
A)jinterface     : No Java compiler found
没有JAVA编译器?其实这里我们可以选择用gcc等其它方式来编译erlang,如果你安装了gcc,这里就用不上JAVA编译了,因此可以在configure时增加--without-javac避免

B)crypto : No usable OpenSSL found
ssh : No usable OpenSSL found
ssl : No usable OpenSSL found
这里很明显,没有OpenSSL,安装上就行yum -y install openssl-devel

C )odbc : ODBC library - link check failed
安装依赖yum -y install unixODBC-devel

D)xsltproc is missing
fop is missing
安装依赖yum -y install xsltproc fop

E)wx : wxWidgets not found, wx will NOT be usable
不使用debugger也问题不大,不过有时候调个小程序什么的还是不方便,如果不需要,直接忽略即可,如果需要使用,则需要安装epel源

把依赖都安装完之后我们再来一遍

1
./configure --prefix=/a01/apps/erlang --without-javac

PjPPgK.png

4、安装
1
make -j 4 && make install

PjPuCt.png

5、配置环境变量
1
2
echo "export PATH=$PATH:/a01/apps/erlang/bin">>/etc/profile
source /etc/profile
6、测试一下erlang是否安装成功

PjPK8P.png

三、安装RabbitMQ

方法一:rpm包安装rabbitmq

官网下载:http://www.rabbitmq.com/download.html

1
2
yum -y install socat
rpm -ivh rabbitmq-server-3.7.1-1.el7.noarch.rpm --nodeps

PjPQv8.png

方法二:二进制包直接安装rabbitmq
1
2
3
4
5
xz -d rabbitmq-server-generic-unix-3.7.0.tar.xz
tar -xvf rabbitmq-server-generic-unix-3.7.0.tar
mv rabbitmq_server-3.7.0/ /a01/apps/rabbitmq
echo "export PATH=$PATH:/a01/apps/rabbitmq/sbin">>/etc/profile
source /etc/profile

配置RabbitMQ

(默认安装完成后没有配置文件)

1、修改默认参数
1
vim /a01/apps/rabbitmq/sbin/rabbitmq-defaults

根据官方文档,删除SYS_PREFIX=后边的参数,才能让rabbitmq不去读取默认的配置,而是优先读取我们手写的配置文件:

1
http://www.rabbitmq.com/install-generic-unix.html

PjP3Dg.png

2、创建存放rabbitmq配置文件的目录:
1
mkdir -p /etc/rabbitmq
3、创建以下两个配置文件:
1
2
3
cd /etc/rabbitmq/
touch rabbitmq-env.conf
touch rabbitmq.conf
4、编写配置文件rabbitmq-env.conf
1
vim /etc/rabbitmq/rabbitmq-env.conf

该配置文件官方说明:
http://www.rabbitmq.com/relocate.html

1
2
3
4
5
6
7
8
9
RABBITMQ_CONFIG_FILE=/etc/rabbitmq/rabbitmq.conf		#配置文件
RABBITMQ_MNESIA_BASE=/a01/apps/rabbitmq/data #节点数据库目录
RABBITMQ_LOG_BASE=/var/log/rabbitmq #日志目录
RABBITMQ_PLUGINS_DIR=/a01/apps/rabbitmq/plugins #插件目录
RABBITMQ_NODE_PORT=5672 #默认监听端口
RABBITMQ_PID_FILE=/var/run/rabbitmq/rabbitmq.pid #进程pid文件
RABBITMQ_LOGS=/var/log/rabbitmq/erlang.log #erlang日志
RABBITMQ_SASL_LOGS=/var/log/rabbitmq/sasl.log #sasl日志
RABBITMQ_CONF_ENV_FILE=/etc/rabbitmq/rabbitmq-env.conf #默认env配置文件
5、编写配置文件rabbitmq.conf
1
vim /etc/rabbitmq/rabbitmq.conf

该配置文件官方有给出一个示例:
https://github.com/rabbitmq/rabbitmq-server/blob/master/docs/rabbitmq.conf.example

常用参数官方说明:
http://www.rabbitmq.com/configure.html#configuration-file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
listeners.tcp.default = 5672							#监听AMQP连接(不含TLS)的端口
num_acceptors.tcp = 10 #接受TCP侦听器连接的Erlang进程的数量
handshake_timeout = 10000 #AMQP 0-9-1握手的最大时间,以毫秒为单位
listeners.ssl = none #ssl连接
vm_memory_calculation_strategy = allocated #使用Erlang内存分配器统计内存使用情况
vm_memory_high_watermark_paging_ratio = 0.75 #当内存使用超过总内存百分比多少时,队列开始将消息持久化到磁盘以释放内存
disk_free_limit.absolute = 2GB #RabbitMQ存储数据的分区的磁盘空间限制。当可用的磁盘空间低于这个限制时,就会触发流控制。
log.file.level = info #日志记录,可设置级别:‘none’、‘error’、‘warning’、‘info’、‘debug’,其中下一层级别的日志输出均包含上层级别的日志输出,比如warning包含warning和error,none为不输出日志
channel_max = 0 #与客户协商的最大通道数量。设置为0意味着“无限”
#channel_operation_timeout = 15000
heartbeat = 600 #在有大量连接的情况下,禁用心跳可能改善性能,但可能会导致连接在关闭非活动连接的网络设备的出现
default_vhost = / #当RabbitMQ创建一个新的数据库时,创建一个虚拟主机。交换amq.rabbitmq.logwill存在于这个虚拟主机中
default_user = guest #当RabbitMQ创建一个新的数据库时,需要创建的用户名
default_pass = lianni@com #默认用户guest的密码
default_user_tags.administrator = false #默认用户的角色是否为管理员
default_permissions.configure = .* #在创建时分配给默认用户的权限
default_permissions.read = .*
default_permissions.write = .*
loopback_users.guest = true #是否限制guest用户只能本地登录,其它用户一样的设置
collect_statistics = none #统计数据收集模式,none为不发布统计数据,coarse为发出的每个队列/通道/连接统计信息,fine为发出的每条数据
collect_statistics_interval = 5000 #统计信息收集间隔,以毫秒为单位
#management_db_cache_multiplier = 3
#auth_mechanisms.1 = PLAIN
#auth_mechanisms.2 = AMQPLAIN
#auth_backends.1 = internal
reverse_dns_lookups = false #客户端连接执行反向DNS查询
tcp_listen_options.backlog = 128 #默认的套接字选项,通常不改变这些参数
tcp_listen_options.nodelay = true
tcp_listen_options.linger.on = true
tcp_listen_options.linger.timeout = 0
tcp_listen_options.exit_on_close = false
hipe_compile = false #设置为true,使用HiPE预编译RabbitMQ的部分,这是Erlang的即时编译器。这将增加服务器的吞吐量,以增加启动时间的成本。您可能会看到,在启动时延迟几分钟,您的性能会提高20-50%。这些数据是高度工作负载和硬件依赖的。HiPE支持可能不会编译到您的Erlang安装中。如果不是这样,启用这个选项只会导致一个警告消息被显示,而启动将照常进行。例如,Debian/Ubuntu用户需要安装erlangbase-base-hipe包。
cluster_partition_handling = ignore #如何处理网络分区
cluster_keepalive_interval = 100000 #节点多久发送keepalive消息到其它节点
queue_index_embed_msgs_below = 4096 #在4096字节数中,消息将被直接嵌入到队列索引中
mnesia_table_loading_retry_timeout = 30000 #在集群中等待每个重试时间
mnesia_table_loading_retry_limit = 5 #等待集群可用时,需要重试的次数
proxy_protocol = false #如果设置为true,则打开AMQP连接时,RabbitMQ将期望首先发送代理协议头。这意味着在RabbitMQ前面建立一个符合代理协议的反向代理(例如HAproxy 或AWS ELB)。启用代理协议后,客户端无法直接连接到RabbitMQ,因此所有连接都必须通过反向代理。
6、启动rabbitmq
1
rabbitmq-server start或者后台运行rabbitmq-server -detached

PjPa80.png

关闭rabbitmq

1
rabbitmqctl stop
7、启用web插件页面
1
rabbitmq-plugins enable rabbitmq_management

PjPd2V.png

8、开启防火墙15672(网页管理)和5672(AMQP)端口

(视启用的插件来决定开放哪些端口)

1
2
3
firewall-cmd --add-port=15672/tcp --permanent
firewall-cmd --add-port=5672/tcp --permanent
systemctl reload firewalld

注意以下端口不要被占用:

官网说明:
http://www.rabbitmq.com/install-generic-unix.html

PjPwvT.png

9、网页访问IP:15672

PjP6a9.png

默认用户为guest,密码在配置文件中我设置为lianni@com
但是这个guest用户只允许本地登录,所以我们在这里是无法登录的,需要增加用户,并授权

PjPc5R.png

10、创建用户
1
2
[root@test01centos7 ~]# rabbitmqctl add_user nong nong
Adding user "nong" ...
11、授权
1
2
[root@test01centos7 ~]# rabbitmqctl set_permissions -p / nong '.*' '.*' '.*'
Setting permissions for user "nong" in vhost "/" ...
12、修改角色
1
2
[root@test01centos7 ~]# rabbitmqctl set_user_tags nong administrator
Setting tags for user "nong" to [administrator] ...
13、用nong用户访问:

PjPW26.png

14、编写systemctl启动RabbitMQ文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ln -s /a01/apps/erlang/bin/* /usr/bin/
vim /etc/systemd/system/rabbitmq.service

[Unit]
Description=RabbitMQ broker
After=network.target
Wants=network.target

[Service]
User=root
Group=root
Type=forking
WorkingDirectory=/a01/apps/rabbitmq
ExecStart=/a01/apps/rabbitmq/sbin/rabbitmq-server -detached
ExecStop=/a01/apps/rabbitmq/sbin/rabbitmqctl stop

[Install]
WantedBy=multi-user.target
15、给予脚本权限,设置开机自启
1
2
chmod 754 /etc/systemd/system/rabbitmq.service
systemctl enable rabbitmq
16、验证
1
2
systemctl start rabbitmq
ps -aux | grep rabbitmq

PjP5rD.png

1
2
systemctl stop rabbitmq
ps -aux | grep rabbitmq

PjPHIA.png

1
2
systemctl restart rabbitmq
ps -aux | grep rabbitmq

PjPLGt.png

Rabbitmq用户管理

用户管理包括增加用户,删除用户,查看用户列表,修改用户密码,设置用户角色,权限等等。

新增一个用户
1
# rabbitmqctl  add_user  Username Password
删除一个用户
1
# rabbitmqctl  delete_user  Username
修改用户的密码
1
# rabbitmqctl  oldPassword  Username  newPassword
查看当前用户列表
1
# rabbitmqctl  list_users
设置用户角色
1
# rabbitmqctl  set_user_tags  User Tag

User为用户名, Tag为角色名(对应于下面的administrator,monitoring,policymaker,management,或其他自定义名称)。

也可以给同一用户设置多个角色,例如:
1
# rabbitmqctl  set_user_tags  hncscwc monitoring  policymaker
设置用户权限
1
# rabbitmqctl  set_permissions  -p VHostPath  User  ConfP  WriteP  ReadP
查看(指定hostpath)所有用户的权限信息
1
# rabbitmqctl  list_permissions [-p  VHostPath]
查看指定用户的权限信息
1
# rabbitmqctl  list_user_permissions User
清除用户的权限信息
1
# rabbitmqctl  clear_permissions  [-pVHostPath]  User

Rabbitmq用户角色

按照个人理解,用户角色可分为五类,超级管理员, 监控者, 策略制定者, 普通管理者以及其他。

超级管理员(administrator)

可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。

监控者(monitoring)

可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

策略制定者(policymaker)

可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。

普通管理者(management)

仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。

其他

无法登陆管理控制台,通常就是普通的生产者和消费者。

Rabbitmq用户权限

用户权限指的是用户对exchange,queue的操作权限,包括配置权限,读写权限。配置权限会影响到exchange,queue的声明和删除。读写权限影响到从queue里取消息,向exchange发送消息以及queue和exchange的绑定(bind)操作。

例如:将queue绑定到某exchange上,需要具有queue的可写权限,以及exchange的可读权限;向exchange发送消息需要具有exchange的可写权限;从queue里取数据需要具有queue的可读权限。详细请参考官方文档中”Howpermissions work”部分。

博主QQ:1012405802
技术交流QQ群:830339411
版权声明:网站内容有原创和转载,如有侵权,请联系删除,谢谢!!
感谢打赏,93bok因你们而精彩!!(支付宝支持花呗)
0%