Centos6.5 安装 RabbitMQ 3.7.11

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

它是一个很强的消息队列,是个中间件。

## 安装rabbitmq
# 安装依赖
    yum install gcc glibc-devel make ncurses-devel openssl-devel xmlto
# 安装或更新EPEL库
    yum -y install epel-release 
# 或:
    wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
    rpm -ivh epel-release-6-8.noarch.rpm


# 安装erlang  下载 https://bintray.com/rabbitmq/rpm/erlang
# 注意el6 和 el7的区别
    rpm -ivh erlang-21.1.2-1.el6.x86_64.rpm  # centos6.5用el6 
## 检查
    erl # 进入erlang 出现:Erlang/OTP 21 [erts-10.1.2] [source] [64-bit]...
    halt().  # 退出 erlang
    netstat -nltp # 端口4369即是erlang的进程
    
    
# 安装MQ  下载 # http://www.rabbitmq.com/download.html
    rpm -ivh rabbitmq-server-3.7.11-1.el6.noarch.rpm

 

如果是CentOS7以上,安装时会稍有不同,除了注意版本的选择外,可能还需要安装依赖:

yum -y install socat

并且安装了erlang后,进程中看不到4369端口打开,但是当启动rabbitmq-server时,erlang会一起启动。 

systemctl start rabbitmq-server

 

 

简单的服务启动与停止

## 服务管理命令
service rabbitmq-server start  # 启动
service rabbitmq-server status # 状态
service rabbitmq-server stop   # 停止
rabbitmq-plugins enable rabbitmq_management # 启用15672 web管理
# 如果执行这条命令,会在/etc/rabbitmq/ 下生成 文件 enabled_plugins
## 常用命令 rabbitmqctl # 帮助 rabbitmqctl status # 状态 同上 rabbitmqctl stop # 停止服务 会将节点及应用程序同时关闭 # 由于同一节点可能运行除rabbitmq 其他erlang程序,停止整个节点是不可取的 rabbitmqctl stop_app # 保持25672不停 rabbitmqctl start_app # 启动5672 和
15672

 

# 3.7.11 默认情况下guest用户只能localhost访问。可以添加账号用于远程登录,或者启用guest远程。

## 用户管理 
rabbitmqctl add_user admin 123456 # 添加用户admin
rabbitmqctl delete_user admin     # 删除用户
rabbitmqctl change_password admin 111111 # 修改密码
rabbitmqctl list_users            # 查看用户列表
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"  # 赋予访问 / 权限
rabbitmqctl set_user_tags admin administrator          # 赋予管理员权限

cp /usr/share/doc/rabbitmq-server-3.7.11/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
# 复制个配置文件到此后,修改内容:
  {loopback_users, []}, # 去掉此行前面的 %% 即启用此配置(最后面的逗号可能要去掉)
# 重启服务后,guest即可远程登录
service rabbitmq-server restart

 


## 用户角色 参考:
链接:https://www.jianshu.com/p/e3af4cf97820
用户角色可分为五类,超级管理员, 监控者, 策略制定者, 普通管理者以及其他。
(1) 超级管理员(administrator)
可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。
(2) 监控者(monitoring)
可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
(3) 策略制定者(policymaker)
可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。与administrator的对比,administrator能看到这些内容。
(4) 普通管理者(management)
仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。
(5) 其他
无法登陆管理控制台,通常就是普通的生产者和消费者。

 

## 以下博客都对操作RabbitMQ有详细介绍。
# springboot操作RabbitMQ使用参考:https://www.cnblogs.com/ityouknow/p/6120544.html
# C# 操作RabbitMQ使用参考: https://www.cnblogs.com/richieyang/p/5492432.html
# Node.js操作RabbitMQ https://www.cnblogs.com/wukong-holmes/p/9306733.html

 

升级

有一台CentOS7.5  Erlang 和 rabbitmq-server 都已经版本过低,官方已经不再支持。

升级时直接准备好 rpm 和 配置文件,然后写个批处理执行,完成。缺点是没有对数据备份,会有短暂的丢失。

在/opt/下放入文件: 

rabbitmq-server-3.7.15-1.el7.noarch.rpm  
erlang-21.3.8.4-1.el7.x86_64.rpm

原有的/etc/rabbitmq/下的配置文件可以继续使用,新版本在启动服务时,会自动读取原有配置文件。

也可根据实际需求修改,如果没有,也可添加文件:

rabbitmq.config 

[
    {rabbit, [{log_levels, [{channel, warning}, {connection, warning}, {federation, warning}, {mirroring, warning}]},
                 {loopback_users, []}
             ]}
].

enabled_plugins

[rabbitmq_management,rabbitmq_top].

rabbitmq-env.conf

RABBITMQ_LOG_BASE=/db/logs/rabbitmq

 

使用 rpm -qa |grep erlang 以及 rpm -qa |grep rabbitmq 列出旧的软件名称,然后加入批处理中卸载。

使用 netstat -nltp 找出4369端口的 PID ,加入批处理中 kill

最后执行批处理:

systemctl stop rabbitmq-server

kill -9 24593   # erlang 4369

rpm -e --nodeps erlang-test_server-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-erts-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-mnesia-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-xmerl-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-inets-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-cosEvent-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-edoc-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-tv-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-cosEventDomain-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-eldap-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-ic-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-eunit-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-webtool-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-debugger-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-reltool-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-typer-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-crypto-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-syntax_tools-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-runtime_tools-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-asn1-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-orber-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-cosTime-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-ssh-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-os_mon-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-cosTransactions-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-diameter-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-observer-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-megaco-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-dialyzer-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-kernel-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-compiler-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-gs-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-public_key-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-tools-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-cosNotification-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-otp_mibs-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-erl_docgen-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-appmon-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-toolbar-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-jinterface-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-wx-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-common_test-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-stdlib-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-hipe-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-snmp-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-ssl-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-sasl-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-cosProperty-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-pman-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-cosFileTransfer-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-percept-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-erl_interface-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-parsetools-R16B-03.18.el7.x86_64
rpm -e --nodeps erlang-et-R16B-03.18.el7.x86_64

rpm -e --nodeps rabbitmq-server-3.3.5-34.el7.noarch
cd /opt

rpm -Uvh erlang-21.3.8.4-1.el7.x86_64.rpm
rpm -Uvh rabbitmq-server-3.7.15-1.el7.noarch.rpm

systemctl start rabbitmq-server 

rabbitmqctl change_password guest oldpwd
rabbitmq-plugins enable rabbitmq_management 

登录相应的 http 地址,使用旧密码登录,检查exchage和queue等。 因为批处理里自动改了旧密码,所以,原有的应用程序可直接访问 rabbitmq-server 

 

更新:

centos7

# 下载导入 key
rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
yum install rabbitmq-server-3.8.1-1.el7.noarch.rpm


#-------------------------- rpm 方式,方便快速 -------------------------
# https://www.rabbitmq.com/install-rpm.html

# 1. 下载并安装 erlang 找到版本对应的RPM包
# 版本需求:https://www.rabbitmq.com/which-erlang.html 
# 下载地址:https://bintray.com/rabbitmq-erlang/rpm/erlang
yum -y install socat
rpm -Uvh erlang-22.1.7-1.el7.x86_64.rpm 
rpm -ivh rabbitmq-server-3.8.1-1.el7.noarch.rpm 

## service
systemctl status rabbitmq-server
systemctl start rabbitmq-server
systemctl stop rabbitmq-server
systemctl restart rabbitmq-server


## 启用 管理 插件 
rabbitmq-plugins enable rabbitmq_management # 启用web 15672

#  rabbitmq_delayed_message_exchange-3.8.0.ez
# 下载.ez文件至 /usr/lib/rabbitmq/lib/rabbitmq_server-3.8.1/plugins/
rabbitmq-plugins list
# 启用
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
# 在管理界面中, Add a new exchange, 查看Type中有无类型 x-delayed-message 


rabbitmqctl status          # 状态  
rabbitmqctl start_app       # 启动应用  
rabbitmqctl stop_app        # 停止应用  

## 用户管理 也可以在 web 控制台里操作。
rabbitmqctl add_user admin 123456     # 添加用户admin
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"  # 赋予访问 / 权限
rabbitmqctl set_user_tags admin administrator          # 赋予管理员权限

rabbitmqctl delete_user admin     # 删除用户
rabbitmqctl change_password admin 111111 # 修改密码
rabbitmqctl list_users            # 查看用户列表

cp /usr/share/doc/rabbitmq-server-3.7.11/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
# 复制个配置文件到此后,修改内容:
  {loopback_users, []}, # 去掉此行前面的 %% 即启用此配置(最后面的逗号可能要去掉)
# 重启服务后,guest即可远程登录
service rabbitmq-server restart

rabbitmqctl list_queues --vhost test  # 某vhost下所有队列名
rabbitmqctl list_queues --vhost test messages_ready messages_unacknowledged

#-------------------- config file --------------------------------------
# 3.7.0之后推荐使用 key = value 格式。
listeners.tcp.default = 5673




#---------------------- cluster 1 simple ------------------------------
# 统一各主机的 hosts 文件解析,
# 统一各主机的 /var/lib/rabbitmq/.erlang.cookie 文件内容相同

systemctl restart rabbitmq-server.service    # 全部重启服务
# 次要主机 rbtmq02 操作如下:
rabbitmqctl stop_app                         
rabbitmqctl join_cluster rabbit@rbtmq01
rabbitmqctl cluster_status

# 特点:
# 1. 声明队列时的节点,后续不变。除非删除队列。
# 2. 节点没有的数据,会从其它节点读取。
# 普通模式:默认模式,以两个节点AB为例说明。对于Queue来说,消息实体只存在于其中一个节点A或B,A和B两个节点仅有相同的元数据,即队列的结构。
当消息进入A节点的Queue后,consumer从B节点消费时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer。
所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。
否则无论consumer连A或B,出口总在A,会产生瓶颈。当A节点故障后,B节点无法取到A节点中还未消费的消息实体。
如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。 # 连接池 # https:
//pika.readthedocs.io/en/latest/examples/blocking_consume_recover_multiple_hosts.html #---------------------- cluster 2 mirror ------------------------------ # 直接在Admin, Policies, Add/update, 选择vhost, 填写Name, # Pattern: 匹配模式. ^ 表示所有; ^ha 表示以 ha 开头的, # Apply to Exchanges & Queues # 点击 HA mode, 设置 ha-mode = all 队列则镜像到所有的节点。 # 队列数据镜像复制之后,如果某一台当机,另一台仍然可用。故障节点恢复后,启动服务即可。 # 故障期间被消费的数据不会产生重复;新加入的数据在故障节点恢复连接后,将自动同步。 # 镜像模式:把需要的队列做成镜像队列,存在多个节点。属于RabbitMQ的HA方案。该模式解决了普通模式中的问题,
不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。
该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,
集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。 #
------------------------ cluster remove node -------------------------- # 要移除的节点上操作: rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl start_app # 在主节点进行节点的移除. rabbitmqctl forget_cluster_node rabbit@rbtmq02 # 然后查看集群状态 rabbitmqctl cluster_status #---------------------- 单机启动3个节点的集群 --------------------------- rabbitmqctl stop RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15672}]" RABBITMQ_NODENAME=rabbit rabbitmq-server -detached RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit_1 rabbitmq-server -detached RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit_2 rabbitmq-server -detached # 加入为 disk rabbitmqctl -n rabbit_1 stop_app rabbitmqctl -n rabbit_1 reset rabbitmqctl -n rabbit_1 join_cluster rabbit rabbitmqctl -n rabbit_1 start_app # 加入为 ram rabbitmqctl -n rabbit_2 stop_app rabbitmqctl -n rabbit_2 reset rabbitmqctl -n rabbit_2 join_cluster rabbit --ram rabbitmqctl -n rabbit_2 start_app #------------------------- Params ------------------------------------ # 连接关闭则 result = channel.queue_declare(queue='', exclusive=True) # ------------------backup & restore -------------------------- # rabbitmqctl eval 'rabbit_mnesia:dir().' cd /var/lib/rabbitmq/mnesia tar zcf rabbit\@rdxmq.tgz rabbit\@rdxmq tar zxf rabbit\@rdxmq.tgz

 

posted @ 2019-02-12 15:38  枫若雪  阅读(1062)  评论(0编辑  收藏  举报