Rabbitmq介绍

RabbitMQ是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成,因此也是继承了这些优点。

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。它从生产者接收消息并递送给消费者,在这个过程中,根据规则进行路由,缓存与持久化。

AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

RabbitMQ的基础概念

  • Broker:简单来说就是消息队列服务器实体

  • Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列

  • Queue:消息队列载体,每个消息都会被投入到一个或多个队列

  • Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来

  • Routing Key:路由关键字,exchange根据这个关键字进行消息投递

  • vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离

  • producer:消息生产者,就是投递消息的程序

  • consumer:消息消费者,就是接受消息的程序

  • channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务

RabbitMQ的特性

  • 可靠性:包括消息持久化,消费者和生产者的消息确认

  • 灵活路由:遵循AMQP协议,支持多种Exchange类型实现不同路由策略

  • 分布式:集群的支持,包括本地网络与远程网络

  • 高可用性:支持主从备份与镜像队列

  • 多语言支持:支持多语言的客户端

  • WEB界面管理:可以管理用户权限,exhange,queue,binding,与实时监控

  • 访问控制:基于vhosts实现访问控制

  • 调试追踪:支持tracing,方便调试

RabbitMQ 安装

rabbitmq安装分为 rpm安装和binary安装,本节使用rpm安装。官方安装地址如下 https://www.rabbitmq.com/install-rpm.html

安装过程中,由于需要安装erlang,官网导入的yum 源文件访问比较慢,所以果断使用阿里云yum 源。注意版本问题,参考这里

  1. $ cat /etc/yum.repos.d/rabbit.repo
  2. [rabbitmq-erlang]
  3. name=rabbitmq-erlang
  4. baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/20/el/7
  5. gpgcheck=
  6. gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
  7. repo_gpgcheck=
  8. enabled=

下载rabbitmq rpm安装文件

  1. wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.14/rabbitmq-server-3.7.14-1.el7.noarch.rpm && yum localinstall rabbitmq-server-3.7.14-1.el7.noarch.rpm

默认会自动安装erlang

rabbitmq默认配置文件

/usr/lib/rabbitmq/lib/rabbitmq_server-3.7.14/sbin/rabbitmq-defaults,里面定义了数据目录和日志目录等

启动rabbitmq

  1. systemctl start rabbitmq-server

查看进程

  1. $ ps -ef |grep rabbitmq
  2. root : pts/ :: grep --color=auto rabbitmq
  3. rabbitmq : ? :: /usr/lib64/erlang/erts-9.3.3.6/bin/beam.smp -W w -A -MBas ageffcbf -MHas ageffcbf -MBlmbcs -MHlmbcs -MMmcs -P -t -stbt db -zdbbl -K true -- -root /usr/lib64/erlang -progname erl -- -home /var/lib/rabbitmq -- -pa /usr/lib/rabbitmq/lib/rabbitmq_server-3.7./ebin -noshell -noinput -s rabbit boot -sname rabbit@k8s_node2 -boot start_sasl -kernel inet_default_connect_options [{nodelay,true}] -sasl errlog_type error -sasl sasl_error_logger false -rabbit lager_log_root "/var/log/rabbitmq" -rabbit lager_default_file "/var/log/rabbitmq/rabbit@k8s_node2.log" -rabbit lager_upgrade_file "/var/log/rabbitmq/rabbit@k8s_node2_upgrade.log" -rabbit enabled_plugins_file "/etc/rabbitmq/enabled_plugins" -rabbit plugins_dir "/usr/lib/rabbitmq/plugins:/usr/lib/rabbitmq/lib/rabbitmq_server-3.7.14/plugins" -rabbit plugins_expand_dir "/var/lib/rabbitmq/mnesia/rabbit@k8s_node2-plugins-expand" -os_mon start_cpu_sup false -os_mon start_disksup false -os_mon start_memsup false -mnesia dir "/var/lib/rabbitmq/mnesia/rabbit@k8s_node2" -kernel inet_dist_listen_min -kernel inet_dist_listen_max
  4. rabbitmq : ? :: erl_child_setup
  5. rabbitmq : ? :: inet_gethost
  6. rabbitmq : ? :: inet_gethost 4
  7.  
  8. $ netstat -ntlp | grep 5672

查看状态

  1. $ systemctl status rabbitmq-server.service
  2.  
  3. $ rabbitmqctl status

安装管理插件

  1. web管理插件
  2. rabbitmq-plugins list #查看插件列表
  3. rabbitmq-plugins enable rabbitmq_management
  4.  
  5. 日志跟踪插件
  6. rabbitmq-plugins enable rabbitmq_tracing #rabbitmq启用trace插件
  7. rabbitmqctl trace_on #打开trace的开关
  8. rabbitmqctl trace_on -p test #打开trace的开关(test为需要日志追踪的vhost)
  9. rabbitmqctl trace_off #关闭trace的开关
  10. 安装rabbitmq_delayed_message_exchange(延时队列)
  11.  
  12. 默认插件目录:
  13. cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.14/plugins/
  14. wget https://dl.bintray.com/rabbitmq/community-plugins/rabbitmq_delayed_message_exchange-0.0.1.ez
  15.  
  16. rabbitmq-plugins enable rabbitmq_delayed_message_exchange
  17. The following plugins have been enabled:
  18. rabbitmq_delayed_message_exchange
  19.  
  20. Applying plugin configuration to v01-app-rabbit@localhost... started plugin.

至此3台上面的rabbitmq都已安装完成,并且启动正常,现在开始配置集群服务。

日志文件:

参考默认配置文件

Rabbitmq配置集群

rabbitmq的集群是依附于erlang的集群来工作的,所以必须先构建起erlang的集群镜像。Erlang的集群中各节点是经由过程一个magic cookie来实现的。这个cookie存放在 ${rabbitmq_home}/.erlang.cookie 中,本节使用rpm安装的,所以.erlang.cookie就放在/var/lib/rabbitmq/中

erlang.cookie是erlang实现分布式的必要文件,erlang分布式的每个节点上要保持相同的.erlang.cookie文件,同时保证文件的权限是400,不然节点之间就无法通信。

打开文件然后需要先把其中的一台服务器的.erlang.cookie中的内容复制到别的机器上,最好是复制内容,因为文件权限不对的话会出现问题。

也可是直接使用scp传过去,记得文件权限和用户属主属组如scp .erlang.cookie root@10.20.200.232:/tmp

erlang.cookie复制完成后,逐个重启节点服务:

  1. systemctl restart rabbitmq-server.service

添加节点到集群

将rabbit@k8s_node1作为集群主节点,在节点k8s_node2和节点k8s_node3上面分别执行如下命令,以加入集群中.

  1. $ rabbitmqctl stop_app
  2. Stopping rabbit application on node rabbit@k8s_node3 ...
  3. $ rabbitmqctl join_cluster rabbit@k8s_node1
  4. Clustering node rabbit@k8s_node3 with rabbit@k8s_node1
  5. $ rabbitmqctl start_app
  6. Starting node rabbit@k8s_node3 ...
  7. completed with plugins.

查看集群状态

  1. $ rabbitmqctl cluster_status
  2. Cluster status of node rabbit@k8s_node3 ...
  3. [{nodes,[{disc,[rabbit@k8s_node1,rabbit@k8s_node2,rabbit@k8s_node3]}]},
  4. {running_nodes,[rabbit@k8s_node1,rabbit@k8s_node2,rabbit@k8s_node3]},
  5. {cluster_name,<<"rabbit@k8s_node1">>},
  6. {partitions,[]},
  7. {alarms,[{rabbit@k8s_node1,[]},{rabbit@k8s_node2,[]},{rabbit@k8s_node3,[]}]}]

从集群中移除节点:

  1. $ rabbitmqctl stop_app
  2. Stopping rabbit application on node 'rabbit@k8s_node2'
    $ rabbitmqctl reset
  3. Resetting node 'rabbit@k8s_node2'

  4. $ rabbitmqctl start_app
  5. Starting node 'rabbit@v01-app-rabbitmq02'
  6.  
  7. #首先将要移除的节点停机.
    $ rabbitmqctl stop
    Stopping and halting node 'k8s_node2' ...
  8.  
  9. #然后在主节点,也就是发起进群的主机上进行节点的移除.
    $ rabbitmqctl forget_cluster_node k8s_node2
  10.  
  11. #然后查看集群状态
    $ rabbitmqctl cluster_status
  1.  

RABBITMQ集群重启

集群重启时,最后一个挂掉的节点应该第一个重启,如果因特殊原因(比如同时断电),而不知道哪个节点最后一个挂掉。可用以下方法重启:

  1. #先在一个节点上执行
  2. $ rabbitmqctl force_boot
  3.  
  4. $ systemctl start rabbitmq-server
  5.  
  6. #在其他节点上执行
  7. $ systemctl start rabbitmq-server
  8.  
  9. #查看cluster状态是否正常(要在所有节点上查询)。
  10. $ rabbitmqctl cluster_status

如果有节点没加入集群,可以先退出集群,然后再重新加入集群。

上述方法不适合内存节点重启,内存节点重启的时候是会去磁盘节点同步数据,如果磁盘节点没起来,内存节点一直失败。

改变集群节点类型
加入集群时指定节点类型:

  1. rabbitmqctl stop_app
  2. rabbitmqctl join_cluster --ram rabbit@k8s_node2
  3. rabbitmqctl start_app

--ram 指定内存节点类型,--disc指定磁盘节点类型,默认为磁盘节点类型

修改节点类型:

  1. rabbitmqctl stop_app
  2. rabbitmqctl change_cluster_node_type disc
  3. rabbitmqctl start_app

Haproxy 配置

haproxy.cfg

  1. frontend rabbitMQ_cluster_frontend
  2. mode tcp
  3. option tcpka
  4. log 127.0.0.1 local0 debug
  5. bind 0.0.0.0:5672
  6. use_backend rabbitMQ_cluster_backend
  7.  
  8. backend rabbitMQ_cluster_backend
  9. balance roundrobin
  10. server rabbitmq-node1 10.20.200.231:5672 check inter 3s rise 1 fall 2
  11. server rabbitmq-node2 10.20.200.232:5672 check inter 3s rise 1 fall 2
  12. server rabbitmq-node3 10.20.200.233:5672 check inter 3s rise 1 fall 2

  

Rabbitmq 管理

用户角色

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

(1) 超级管理员(administrator)

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

(2) 监控者(monitoring)

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

(3) 策略制定者(policymaker)

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

(4) 普通管理者(management)

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

(5) 其他

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

了解了这些后,就可以根据需要给不同的用户设置不同的角色,以便按需管理。

设置用户角色的命令为

rabbitmqctl  set_user_tags  User  Tag

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

也可以给同一用户设置多个角色,例如

rabbitmqctl  set_user_tags  hncscwc  monitoring  policymaker

账号管理

  1. 添加账号:
  2. $rabbitmqctl add_user admin admin

  3. 添加 权限tag
  4. $ rabbitmqctl set_user_tags admin administrator
  5.  
  6. 删除用户(删除guest用户)
  7. $ rabbitmqctl delete_user guest
  8. Deleting user "guest"
  9.  
  10. 修改用户的密码
  11. $rabbitmqctl change_password Username Newpassword
  12.  
  13. $ rabbitmqctl change_password admin 0GM1aol4z8GeSZY99
  14. Changing password for user "admin"
  15.  
  16. 查看当前用户列表
  17. $ rabbitmqctl list_users
  18. Listing users
  19. admin [administrator]

用户权限

用户权限指的是用户对exchange,queue的操作权限,包括配置权限,读写权限。配置权限会影响到exchange,queue的声明和删除。

读写权限影响到从queue里取消息,向exchange发送消息以及queue和exchange的绑定(bind)操作。

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

相关命令为:

  1. # 设置用户权限
  2. $ rabbitmqctl set_permissions -p VHostPath User ConfP WriteP ReadP
  3.  
  4. # 查看(指定hostpath)所有用户的权限信息
  5. $ rabbitmqctl list_permissions [-p VHostPath]
  6.  
  7. # 查看指定用户的权限信息
  8. $ rabbitmqctl list_user_permissions User_name
  9.  
  10. # 清除用户的权限信息
  11. $ rabbitmqctl clear_permissions [-p VHostPath] User

删除队列

  1. rabbitmqctl eval 'rabbit_amqqueue:internal_delete({resource,<<"/">>,queue,<<"queue_name">>}).'

可参考这里

web管理

ip:15672

Centos7 安装配置 Rabbitmq Cluster的更多相关文章

  1. Centos7安装配置gitlab

    Centos7安装配置gitlab 这篇文字我会介绍在Centos7上安装gitlab,配置gitlab的smtp,并且创建项目demo. sudo yum install openssh-serve ...

  2. Centos7安装配置Apache+PHP+Mysql+phpmyadmin

    转载自: Centos7安装配置Apache+PHP+Mysql+phpmyadmin 一.安装Apache yum install httpd 安装成功后,Apache操作命令: systemctl ...

  3. 在linux下安装配置rabbitMQ详细教程

    在linux下安装配置rabbitMQ详细教程 2017年12月20日 17:34:47 阅读数:7539 安装Erlang 由于RabbitMQ依赖Erlang, 所以需要先安装Erlang. Er ...

  4. Centos7安装配置JDK8

    Centos7安装配置JDK8 一.准备工作 第一步,去甲骨文官网下载Jdk相应的版本,我这里下载的是jdk1.8. 第二步将你从官网上下载下来的jdk使用FTP工具上传到云服务器上的相应目录,我的是 ...

  5. centos7命令行和图形界面的相互切换(附centos7安装配置教程)

    一.最近安装了centos7,发现在命令行和图形界面的相互切换命令上,与centos以往版本有很大不同,先整理如下,加深记忆. 1,centos7默认安装后,跟其他版本一样,启动默认进入图形界面: 2 ...

  6. (转)Centos7安装配置NFS服务和挂载

    Centos7安装配置NFS服务和挂载 原文:https://www.u22e.com/601.html NFS简介 NFS(Network File System)即网络文件系统,是FreeBSD支 ...

  7. CentOS7 安装配置笔记

    CentOS7 安装配置笔记 1.通过镜像安装 CentOS7 ==============================* 使用 UltraISO 9.7 或者 rufus-3.5p 制作ISO的 ...

  8. Centos7安装配置jenkins(Tomcat)

    Centos7安装配置jenkins(Tomcat) 一.准备工作 1.1 安装JDK1.8 具体安装过程不在赘述. 1.2 下载jenkins的war包 jenkins官网下载地址:https:// ...

  9. Centos7 上安装配置 RabbitMQ

    前言:  最近服务器上搭建了一下rabbitmq, 网上找了很多教程, 采了灰常灰常多的坑. 现在终于从坑里面爬出来了.赶紧写下来,避免下次掉坑里面   好了,废话不多说,下面步入正题 一.安装Erl ...

随机推荐

  1. 【Spring AOP】AOP的实现(三)

    一.Spring 对AOP的支持 Spring中AOP代理由Spring的IOC容器负责生成.管理,其依赖关系也由IOC容器负责管理.因此,AOP代理可以直接使用容器中的其它bean实例作为目标,这种 ...

  2. Mrmr:

    Feature selection: minimum redundancy and maximum relevance feature selection for high-dimensional d ...

  3. 实现 Cloneable 需要注意

    产品Product里面包含BaseInfo对象:Product(productName,companyName,baseinfo)如果implement Cloneable  需要实现   注意强转类 ...

  4. 洛谷p3384【模板】树链剖分题解

    洛谷p3384 [模板]树链剖分错误记录 首先感谢\(lfd\)在课上调了出来\(Orz\) \(1\).以后少写全局变量 \(2\).线段树递归的时候最好把左右区间一起传 \(3\).写\(dfs\ ...

  5. [LeetCode] 901. Online Stock Span 股票价格跨度

    Write a class StockSpanner which collects daily price quotes for some stock, and returns the span of ...

  6. thinkphp5.1 - twig模板-全局变量

    thinkphp5.1 - twig模板-全局变量我们在定义 ccs 之类的静态文件的时候,经常会使用<link rel="stylesheet" href="__ ...

  7. Docker下构建centos7容器无法使用systemctl命令的解决办法

    最近在使用docker 构建centos7 容器时,发现无法使用systemctl 命令.后来万能的百度解决了问题,随记之以备后用. 解决办法: docker run --privileged -it ...

  8. windows 7输入regedit 打不开注册表

    Win 10 win 7 Win7 regedit 打不开 怎么打不开 打不开了怎么办 没反应 不能打开 注册表? 1.使用键盘快捷键 win+r,打开运行工具. 2.在输入框内输入gepedit.m ...

  9. (三)golang--执行流程分析

    XXX.go--go build XXX.go--XXX.exe XXX.go--go run XXX.go 两种方式的区别:(1)如果我们先编译生成了可执行文件,那么我们可以将该可执行文件拷贝到没g ...

  10. 《Interest Rate Risk Modeling》阅读笔记——第四章:M-absolute 和 M-square 风险度量

    目录 第四章:M-absolute 和 M-square 风险度量 思维导图 两个重要不等式的推导 关于 \(M^A\) 的不等式 关于 \(M^2\) 的不等式 凸性效应(CE)和风险效应(RE)的 ...