MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通讯方法。应用程序经过读写出入队列的消息(针对应用程序的数据)来通讯,而无需专用链接来连接它们。消息传递指的是程序之间经过在消息中发送数据进行通讯,而不是经过直接调用彼此来通讯,直接调用一般是用于诸如远程过程调用的技术。排队指的是应用程序经过 队列来通讯。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBM WEBSPHERE MQ等等。html
rabbitmq是采用Erlang(一种通用的面向并发的编程语言)编写的符合AMQP(Advanced Message Queuing Protocol)规范的消息中间件。诞生于金融行业,如今普遍应用于企业级的分布式应用中。node
从模型抽象上来讲其工做过程:生产者(producer)建立消息,而后发布到队列(queue)中,最后将消息发送到监听的消费者(consumer)。git
Exchange分发消息的类型有四种:github
routing key
(exchange和queue绑定时可指定)直接投递到队列 routing key
由.
号分隔的字符串指定,如quick.orange.rabbit
,每一个分隔的字符串最好能对应必定的业务含义。支持模糊匹配,如*.orange.rabbit
或如quick.orange.#
。*
精确匹配一个字符串,#
匹配0个或多个字符串。 routing key
。关于本节内容可参考:https://www.jianshu.com/p/79ca08116d57web
系统环境:centos 7.3算法
内网ip:192.168.228.130express
$ yum install -y erlang
此处直接yum安装的版本为erlang-R16B-03.18.el7.x86_64
在后面安装Rabbitmq时会报错:编程
错误:软件包:rabbitmq-server-3.7.6-1.el7.noarch (/rabbitmq-server-3.7.6-1.el7.noarch) 须要:erlang >= 19.3 已安装: erlang-R16B-03.18.el7.x86_64 (@epel) erlang = R16B-03.18.el7 您能够尝试添加 --skip-broken 选项来解决该问题 您能够尝试执行:rpm -Va --nofiles --nodigest
缘由是:rabbitmq-server-3.7.6依赖erlang版本要19.3=<erlang<=20.3.x(第一次根据官方提供的方法安装的21.0版本——成功入坑,详情继续向下看)。vim
解决办法(此处有坑):centos
# 下载erlang官方镜像源 $ wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm # 配置镜像源 $ rpm -Uvh erlang-solutions-1.0-1.noarch.rpm # 安装erlang $ yum install -y erlang # 查看版本 $ rpm -q erlang erlang-21.0-1.el7.centos.x86_64 # 即安装的为21.0版本
再次入坑(使用上述办法安装erlang,在手动添加rabbitmq配置文件后),报错信息:
Could not start application logger: Logger.App.start(:normal, []) returned an error: shutdown: failed to start child: Logger.ErrorHandler ** (EXIT) no process: the process is not alive or there's no process currently associated with the given name, possibly because its application isn't started
按官方提供的方法安装好erlang后,当手动添加rabbitmq配置文件后再次启动出现上面的报错信息,通过分析发现(太坑了):
再次爬坑: 根据上图中的提示,只能再找办法安装19.3~20.3.x之间版本的erlang了,可是官方提供的方法只能安装最新版的erlang,通过一番搜索找到以下办法能够安装19.3~20.3.x之间版本的erlang:
# 手动配置erlang的repo源 # In /etc/yum.repos.d/rabbitmq-erlang.repo [rabbitmq-erlang] name=rabbitmq-erlang baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/20/el/7 gpgcheck=1 gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc repo_gpgcheck=0 enabled=1 # 清理原有rpm包缓存 $ yum clean all # 从新安装20.3版本的erlang $ yum install -y erlang # 查看包状态 $ rpm -q erlang erlang-20.3-1.el7.centos.x86_64 # 完成!
注意1: 由于以前安装过旧版本的erlang会致使冲突,因此在安装新版本erlang时须要将旧版本erlang有关的包所有卸载掉yum remove -y erlang
(使用rpm -e erlang --nodeps只能卸载erlang包,没法卸载其相关的依赖包)。
注意2: 若是你以前像我同样根据官方提示安装过erlang-21.0,那么确定也入坑了,爬坑过程当中卸载erlang的时候注意观察会发现rabbitmq-server会同时被卸载,因此安装好erlang-20.3后须要再次安装rabbitmq-server,方法以下。
参考erlang官方文档:https://www.erlang-solutions.com/resources/download.html
若是你安装的是低版本的rabbitmq会比较省事,官方提供了erlang的rpm包:http://www.rabbitmq.com/releases/erlang/
# download rpm.repo $ wget https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.6/rabbitmq-server-3.7.6-1.el7.noarch.rpm $ rpm --import https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc # this example assumes the CentOS 7 version of the package $ yum install -y rabbitmq-server-3.7.6-1.el7.noarch.rpm # Done! $ rpm -q rabbitmq-server rabbitmq-server-3.7.6-1.el7.noarch
若是报错请返回 “erlang 安装” 。
centos7能够直接使用系统工具管理服务
$ systemctl start/status/restart/stop rabbitmq-server # 查看rabbimq启动的端口 $ netstat -lntp tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN 96803/epmd tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN 96660/beam.smp tcp6 0 0 :::4369 :::* LISTEN 96803/epmd tcp6 0 0 :::5672 :::* LISTEN 96660/beam.smp
参考rabbitmq官方文档:http://www.rabbitmq.com/install-rpm.html
文件结构:
/var/lib/rabbitmq/ ├── config # 存放配置文件 ├── mnesia # 存放节点的数据、信息、状态、日志等文件 └── schema # 存放rabbitmq的纲要文件
怎么寻找RabbitMQ配置文件位置:
每一个节点的配置信息均可以在log_file(首行)找到,内容以下
node : rabbit@host3 home dir : /var/lib/rabbitmq config file(s) : (none) # 在此发现rabbit@host1这个节点并无配置文件(后面补充) cookie hash : FFGcfZmAr6Q+pjUEHEiUEw== log(s) : /var/log/rabbitmq/rabbit@host3.log : /var/log/rabbitmq/rabbit@host3_upgrade.log database dir : /var/lib/rabbitmq/mnesia/rabbit@host3
能够再Management_UI界面找到,前提是开启UI插件,开启方法以下:
$ rabbitmq-plugins enable rabbitmq_management
关于Management_UI用户类型及权限管理:
官方关于如何分配服务器资源的 建议 :http://www.rabbitmq.com/production-checklist.html
{vm_memory_high_watermark, 0.4}
;disk_free_limit
;{disk_free_limit, {mem_relative, 1.0}}
,即当剩余的磁盘空间和分配的内存空间相同时告警,这是保证节点正常运行的最低内存、磁盘空间比例;{disk_free_limit, {mem_relative, 1.5}}
,当剩余磁盘空间为分配的内存空间的1.5倍时告警,这样配置比较安全;{disk_free_limit, {mem_relative, 2.0}}
,当剩余磁盘空间为分配的内存空间的2倍时告警,这样配置最谨慎。自3.7.0版本开始,rabbitmq的配置文件命名为rabbitmq.config,是一种标准的erlang配置文件,同时也兼容旧版本的配置文件(advanced.config)格式,与旧格式的配置文件相比,新格式配置文件更简介、更清晰、更易于管理,且可使用Chef、Puppet等自动化部署工具生成。新旧版本配置文件对比e.g.:
新版配置文件格式的结构能够总结为如下三点:
key = value
模式;listeners.tcp.default = 5673
或,
[ {rabbit, [{tcp_listeners, [5673]}]} ].
配置完成后启动rabbitmq:
# 重启 $ systemctl restart rabbitmq-server # 查看端口 $ netstat -lntp tcp6 0 0 :::5673 :::* LISTEN 44435/beam.smp # 查看日志 $ less /var/log/rabbitmq/rabbit@host3.log 2018-07-09 21:15:37.692 [info] <0.215.0> node : rabbit@host3 home dir : /var/lib/rabbitmq config file(s) : /etc/rabbitmq/rabbitmq.conf # 此时新配置文件生效 cookie hash : p40SfKMD4r8HemoR0EOJWw== log(s) : /var/log/rabbitmq/rabbit@host3.log : /var/log/rabbitmq/rabbit@host3_upgrade.log database dir : /var/lib/rabbitmq/mnesia/rabbit@host3
自定义rabbitmq的配置文件路径:
$ vim /usr/lib/systemd/system/rabbitmq-server.service [Unit] Description=RabbitMQ broker After=syslog.target network.target [Service] Type=notify User=rabbitmq Group=rabbitmq UMask=0027 NotifyAccess=all TimeoutStartSec=3600 # RABBITMQ_CONFIG_FILE=/etc/rabbitmq/rabbitmq.conf # 指定配置文件 # Un-comment this setting if you need to increase RabbitMQ's # open files limit # LimitNOFILE=16384 # # Note: systemd on CentOS 7 complains about in-line comments, # so only append them here # # Restart: # The following setting will automatically restart RabbitMQ # in the event of a failure. systemd service restarts are not a # replacement for service monitoring. Please see # http://www.rabbitmq.com/monitoring.html Restart=on-failure RestartSec=10 WorkingDirectory=/var/lib/rabbitmq ExecStart=/usr/sbin/rabbitmq-server ExecStop=/usr/sbin/rabbitmqctl shutdown # See rabbitmq/rabbitmq-server-release#51 SuccessExitStatus=69 [Install] WantedBy=multi-user.target
配置文件详解:
说明:
开启管理插件:
$ rabbitmq-plugins enable rabbitmq_management <输出内容> The following plugins have been configured: rabbitmq_management rabbitmq_management_agent rabbitmq_web_dispatch Applying plugin configuration to rabbit@host3... The following plugins have been enabled: rabbitmq_management rabbitmq_management_agent rabbitmq_web_dispatch started 3 plugins. <开启成功>
访问web界面:(默认端口为15672)http://server_ip:15672
为guest用户受权:loopback_users = none
(默认只能是本机访问,localhost或者127.0.0.1,从外部访问须要添加该配置)
重启后访问,登陆管理页面:
管理页面能作的操做:
list and delete exchanges, queues, bindings, users, virtual hosts and permissions. Monitor queue length, message rates globally and per channel, data rates per connection, etc. Monitor resource usage, such as file descriptors, memory use, available disk space. Manage users (provided administrative permissions of the current user). Export and import object definitions (vhosts, users, permissions, queues, exchanges, bindings, parameters, policies) to JSON. Force close connections, purge queues. Send and receive messages (useful in development environments and for troubleshooting).
由于guest为默认用户,对外开放并不安全,可是经过localhost来访问又不方便(经过配置代理也能够实现外网访问),因此在此还可使用命令行进行管理,在此准备了两种管理工具:rabbitmqctl、rabbitmqadmin(二者不冲突)。
rabbitmqctl为rabbitmq内置管理工具,功能不少,详细的使用方法能够参考下面的连接:http://www.rabbitmq.com/man/rabbitmqctl.8.html。
用法示例:
添加用户:
# rabbitmqctl add_user <username> <newpassword> $ rabbitmqctl add_user adai 123456 Adding user "adai" ...
查看用户信息:
$ rabbitmqctl list_users Listing users ... adai [] guest [administrator]
修改用户密码:
# rabbitmqctl change_password <username> <newpassword> $ rabbitmqctl change_password adai 111111 Changing password for user "adai" ...
为用户受权:
# 格式: rabbitmqctl set_permissions [-pvhostpath] {user} {conf} {write} {read} ## vhost The name of the virtual host to which to grant the user access, defaulting to "/". ## user The name of the user to grant access to the specified virtual host. ## conf A regular expression matching resource names for which the user is granted configure permissions. ## write A regular expression matching resource names for which the user is granted write permissions. ## read A regular expression matching resource names for which the user is granted read permissions. # 示例:受权给用户adai默认vhost("/")的全部配置的读、写权限 $ rabbitmqctl set_permissions -p "/" adai ".*" ".*" ".*" Setting permissions for user "adai" in vhost "/" ...
查看用户权限:
# rabbitmqctl list_permissions [-p vhost] $ rabbitmqctl list_permissions -p / Listing permissions for vhost "/" ... guest .* .* .* adai .* .* .*
清理用户权限:
# rabbitmqctl clear_permissions [-p vhost] username $ rabbitmqctl clear_permissions -p / adai Clearing permissions for user "adai" in vhost "/" ... $ rabbitmqctl list_permissions -p / Listing permissions for vhost "/" ... guest .* .* .*
查看某用户的权限:
$ rabbitmqctl list_user_permissions adai Listing permissions for user "adai" ... $ rabbitmqctl set_permissions -p "/" adai ".*" ".*" ".*" Setting permissions for user "adai" in vhost "/" ... $ rabbitmqctl list_user_permissions adai Listing permissions for user "adai" ... / .* .* .*
设置用户角色(上面有讲,共五种角色类型):
$ rabbitmqctl set_user_tags adai administartor # 将adai设置为管理员 Setting tags for user "adai" to [administartor] ... $ rabbitmqctl list_users Listing users ... adai [administartor] guest [administrator]
删除用户:
# rabbitmqctl delete_user <username> $ rabbitmqctl add_user test monitoring Adding user "test" ... $ rabbitmqctl list_users Listing users ... adai [administartor] guest [administrator] test [] $ rabbitmqctl delete_user test Deleting user "test" ... $ rabbitmqctl list_users Listing users ... adai [administartor] guest [administrator]
该工具来自第三方,获取方法:
若是你安装了UI_management插件,能够直接经过下面方法获取
wget http://server_ip:15672/cli/rabbitmqadmin # 注意: ## The tool supports: ## Python 3.x ## Python 2.6 or later for HTTP connections ## Python 2.7.9 or later for HTTPS connections
还能够经过github仓库获取,地址https://raw.githubusercontent.com/rabbitmq/rabbitmq-management/v3.7.6/bin/rabbitmqadmin
获取rabbitmqadmin后,将其加入系统环境:/usr/local/bin
mv rabbitmqadmin /usr/local/bin/ # 赋予其执行权限 chmod 755 /usr/local/bin/rabbitmqadmin # 激活rabbitmqadmin命令 rabbitmqadmin --help
注意: rabbitmqadmin的版本要好rabbitmq的版本对应,不然没法使用。
rabbitmqadmin工具支持在bash中以列表的输出信息:
# 开启rabbitmqadmin的列表支持功能 rabbitmqadmin --bash-completion > /etc/bash_completion.d/rabbitmqadmin