消息中间件Rabbitmq的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息中间件Rabbitmq的使用相关的知识,希望对你有一定的参考价值。

一:消息中间件的描述
1、简介
消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。
当下主流的消息中间件有RabbitMQ、Kafka、ActiveMQ、RocketMQ等

2、消息中间件主要作用
? 冗余(存储)
? 扩展性
? 可恢复性
? 顺序保证
? 缓冲
? 异步通信
? 削峰 :消息队列中的常用场景,一般在秒杀或抢够活动中使用广泛。一般会因为流量过大,应用系统配置承载不了这股瞬间流量,导致系统直接挂掉,即传说中的“宕机”现象。为解决这个问题,我们会将那股巨大的流量拒在系统的上层,即将其转移至 MQ 而不直接涌入我们的接口。

二.消息队列之一RabbiMQ简介
1, RabbiMQ是?Erang开发的,集群?常?便,因为Erlang天?就是??分布式语?,但其本身并不?持负载均衡,支持高并发,支持可扩展。支持AJAX,持久化,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

2, RabbiMQ的特点
? 可靠性
? 扩展性
? 高可用性
? 多种协议
? 多语言客户端
? 管理界面
? 插件机制

3.什么是消息队列
MQ 全称为Message Queue, 消息队列。是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。
消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信。

4.RabbiMQ模式
注意:RabbitMQ模式?概分为以下三种:
(1)单?模式 (一台主机部署rabbitmq)
(2)普通模式 (默认的集群模式)。
(3) 镜像模式 (把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA?案,在对业务可靠性要求较?的场合中?较适?)。要实现镜像模式,需要先搭建?个普通集群模式,在这个模式的基础上再配置镜像模式以实现?可?,在镜像模式中设置策略可以将主rabbitmq中的数据同步到集群中其他节点里

++++++++++++RabbitMQ 集 群 基 础 部 署 (普通模式)++++++++++++

一:基础部署,集群里的主机都需要实施的操作

1,若有三台服务器作为三个节点,且都联?,关闭防火墙,selinux,编辑域名解析/etc/hosts(ip与主机名称应该对应好,要不然容易影响实验)
[root@rabbitmq-1 ~]# vim /etc/hosts
192.168.50.138 rabbitmq-1
192.168.50.139 rabbitmq-2
192.168.50.140 rabbitmq-3

2,三个节点配置安装rabbitmq软件
安装依赖:
[root@rabbitmq-1 ~]# yum install -y gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel
[root@rabbitmq-1 ~]# wget --content-disposition https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-20.3-1.el7.centos.x86_64.rpm/download.rpm
[root@rabbitmq-1 ~]# rpm -ivh erlang-20.3-1.el7.centos.x86_64.rpm

测试;
[root@rabbitmq-1 ~]# erl

安装rabbitmq:
[root@rabbitmq-1 ~]# wget https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.5/rabbitmq-server-3.7.5-1.el7.noarch.rpm
[root@rabbitmq-1 ~]# yum install rabbitmq-server-3.7.5-1.el7.noarch.rpm

3.启动
启动方式一:
[root@rabbitmq-1 ~]# systemctl daemon-reload
[root@rabbitmq-1 ~]# systemctl start rabbitmq-server
[root@rabbitmq-1 ~]# systemctl enable rabbitmq-server
[root@rabbitmq-1 ~]# systemctl status rabbitmq-server
启动方式二:
[root@rabbitmq-1 ~]# /sbin/service rabbitmq-server status ---查看状态
[root@rabbitmq-1 ~]# /sbin/service rabbitmq-server start ---启动

4,开启rabbitmq的web访问界面:
[root@rabbitmq-1 ~]# rabbitmq-plugins enable rabbitmq_management


5.创建用户:
注意:创建用户只需要在一台主机上添加就可以,即把谁当作管理员就在哪儿创建
(1)添加用户和密码谁在
[root@rabbitmq-1 ~]# rabbitmqctl add_user soho 123
Creating user "soho" ...
...done.
(2)这是为管理员
[root@rabbitmq-1 ~]# rabbitmqctl set_user_tags soho administrator
Setting tags for user "soho" to [administrator] ...
...done.
(3)查看用户
[root@rabbitmq-1 ~]# rabbitmqctl list_users
Listing users ...
guest [administrator]
soho [administrator]
...done.
(4)权限
[root@rabbitmq-1 ~]# rabbitmqctl set_permissions -p "/" soho "." "." "."
Setting permissions for user "soho" in vhost "/" ...
...done.
此处设置权限时注意‘.
‘之间需要有空格 三个‘.*‘分别代表了conf权限,read权限与write权限 例如:当没有给
soho设置这三个权限前是没有权限查询队列,在ui界面也看不见


6,所有机器都操作:开启用户远程登录:
[root@rabbitmq-1 ~]# cd /etc/rabbitmq/
[root@rabbitmq-1 rabbitmq]# cp /usr/share/doc/rabbitmq-server-3.7.5/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
[root@rabbitmq-1 rabbitmq]# ls
enabled_plugins rabbitmq.config
[root@rabbitmq-1 rabbitmq]# vim rabbitmq.config
修改如下:

7.三台机器都操作重启服务服务:
[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server
查看端口 所有机器都操作:开启用户远程登录:
[root@rabbitmq-1 ~]# cd /etc/rabbitmq/
[root@rabbitmq-1 rabbitmq]# cp /usr/share/doc/rabbitmq-server-3.7.5/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
[root@rabbitmq-1 rabbitmq]# ls
enabled_plugins rabbitmq.config
[root@rabbitmq-1 rabbitmq]# vim rabbitmq.config
修改如下:
技术图片

8.三台机器都操作重启服务服务:
[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server
查看端口
技术图片
4369 -- erlang发现口
5672 --程序连接端口
15672 -- 管理界面ui端口
25672 -- server间内部通信口

9,注意如果是云服务器,切记添加安全组端口放行。
web访问:192.168.50.138:15672
这里需要注意:
rabbitmq默认管理员用户:guest 密码:guest
新添加的用户为:soho 密码:123

++++++++++++RabbitMQ 集 群 正 式 部 署 (普通模式)+++++++++++++

二,正式部署集群

1.首先创建好数据存放目录和日志存放目录
[root@rabbitmq-1 ~]# mkdir -p /data/rabbitmq/data
[root@rabbitmq-1 ~]# mkdir -p /data/rabbitmq/logs
[root@rabbitmq-1 ~]# chmod 777 -R /data/rabbitmq
[root@rabbitmq-1 ~]# chown rabbitmq.rabbitmq /data/ -R

2,创建配置文件:
[root@rabbitmq-1 ~]# vim /etc/rabbitmq/rabbitmq-env.conf (添加如下内容)
RABBITMQ_MNESIA_BASE=/data/rabbitmq/data
RABBITMQ_LOG_BASE=/data/rabbitmq/logs

[root@rabbitmq-1 ~]# cat /etc/rabbitmq/rabbitmq-env.conf

3,重启服务
[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server

4.拷?erlang.cookie
原因:集群中各节点是经由?个cookie来实现的,所以必须保证各节点cookie?致,不然节点之间就?法通信.(cookie存放的位置:解压缩方式安装部署的rabbitmq存放于/home/.erlang.cookie。rpm等安装包方式进行安装的/var/lib/rabbitmq)

[root@rabbitmq-1 ~]# cat /var/lib/rabbitmq/.erlang.cookie
HOUCUGJDZYTFZDSWXTHJ
?scp的?式将rabbitmq-1节点的.erlang.cookie的值复制到其他两个节点中。
[root@rabbitmq-1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.50.139:/var/lib/rabbitmq/
[root@rabbitmq-1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.50.140:/var/lib/rabbitmq/

3.将mq-2、mq-3作为内存节点加?mq-1节点集群中.mq-1用作磁盘节点,在RabbitMQ集群中,必须?少有?个磁盘节点,否则队列元数据?法写?到集群中,当磁盘节点宕掉时,集群将?法写?新的队列元数据信息。
在mq-2、mq-3执?如下命令:
[root@rabbitmq-2 ~]# rabbitmqctl stop_app #停止节点,切记不是停止服务
[root@rabbitmq-2 ~]# rabbitmqctl reset #如果有数据需要重置,没有则不用
[root@rabbitmq-2 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq-1 #添加到磁盘节点
Clustering node ‘rabbit@rabbitmq-2‘ with ‘rabbit@rabbitmq-1‘ ...
[root@rabbitmq-2 ~]# rabbitmqctl start_app #启动节点
Starting node ‘rabbit@rabbitmq-2‘ ...

3.1.0此处节点问题解决方式:
(1)如果执行rabbitmqctl stop_app 这条命令报错:需要执行
#chmod 400 .erlang.cookie ?件是400的权限
#chown rabbitmq.rabbitmq .erlang.cookie
(2)由于更改hostname文件,在每次rabbitmqctl stop或者rabbitmqctl cluster_status等,只要是rabbitmq的命令就报错,提示大概如下
Cluster status of node rabbit@web2 ...
Error: unable to connect to node rabbit@web2: nodedown
..............
此时先ps aux | grep mq,然后kill -9 所有mq的进程,然后再rabbitmq-server -detached即可解决。(即先强杀,再重新启动)
(3)使用rabbitmqctl stop,rabbitmq-server -detached重新启动后,原先添加的用户admin、虚拟主机coresystem等均丢失,还需要重新添加。
(4) rabbitmqctl join_cluster --ram rabbit@rabbitmq-1报错时检查域名解析
(5)其他问题关于使用 rabbitmq-server -detached命令启动rabbitmq时,出现以下提示Warning: PID file not written; -detached was passed,此时使用
rabbitmqctl status提示服务已启动,可知此问题不用解决。
3.1.1节点补充:
(1)默认rabbitmq启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,
mq-1是磁盘节点。
( 2)如果要使mq-2、mq-3都是磁盘节点,去掉--ram参数即可。
(3)如果想要更改节点类型,可以使?命令rabbitmqctl change_cluster_node_type disc(ram),前提是必须停掉rabbit应?
注:
#如果有需要使用磁盘节点加入集群
[root@rabbitmq-2 ~]# rabbitmqctl join_cluster rabbit@rabbitmq-1
[root@rabbitmq-3 ~]# rabbitmqctl join_cluster rabbit@rabbitmq-1

4,查看集群状态,在任意节点上执行 rabbitmqctl cluster_status来查看是否集群配置成功。
[root@rabbitmq-1 ~]# rabbitmqctl cluster_status
技术图片
每台机器显示出三台节点,表示已经添加成功!

5.登录rabbitmq web管理控制台,创建新的队列
打开浏览器输?http://192.168.50.138:15672,
输?默认的Username:guest
输?默认的Password:guest
技术图片

根据界?提示创建?条队列
技术图片

++++++由以上RABBITMQ普通模式+镜像模式+++++++++++++

三,添加镜像模式的原因:

     上面已经完成RabbitMQ默认集群模式,但并不保证队列的高可用性,队列内容不会复制。如果队列节点宕机直接导致该队列无法应用,只能等待重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,必须要创建镜像队列。    镜像队列是基于普通的集群模式的。

1,创建镜像集群:三台机器相同操作
rabbitmq set_policy :设置策略
[root@rabbitmq-1 ~]#rabbitmqctl set_policy ha-all "^" ‘{"ha-mode":"all"}‘
Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...

2,再次查看队列已经同步到其他两台节点:
技术图片

3,此时镜像队列设置成功。已经部署完成,将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一致。``

++++++++rabbitmq默认的集群模式+镜像模式+HA+负载均衡++++++++++++
RabbitMQ 高可用集群搭建完成,最后一个步骤就是搭建均衡器。
技术图片

简单安装并配置负载均衡器HA

注意:如果使用阿里云,可以使用阿里云的内网slb来实现负载均衡,不用自己搭建HA。
安装并配置负载均衡器HA
1、在192.168.50.138安装HAProxy
yum -y install haproxy
2、修改 /etc/haproxy/haproxy.cfg
[root@rabbitmq-1 ~]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
[root@rabbitmq-1 ~]# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2

chroot      /var/lib/haproxy
pidfile     /var/run/haproxy.pid
maxconn     4000
user        haproxy
group       haproxy
nbproc      4
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
defaults
mode http
log global
retries 3
timeout connect 10s
timeout client 1m
timeout server 1m
timeout check 10s
maxconn 2048
#---------------------------------------------------------------------
##监控查看本地状态#####
listen admin_stats
bind :80
mode http
option httplog
option httpclose
log 127.0.0.1 local0 err
stats uri /haproxy
stats auth xingdian:123 (用户+密码)
stats refresh 30s
####################################
###反代监控
frontend server
bind
:5670
log global
mode tcp
#option forwardfor
default_backend rabbitmq
maxconn 3
backend rabbitmq
mode tcp
log global
balance roundrobin
server rabbitmq1 192.168.50.138:5672 check inter 2000s rise 2 fall 3
server rabbitmq2 192.168.50.139:5672 check inter 2000s rise 2 fall 3
server rabbitmq3 192.168.50.140:5672 check inter 2000s rise 2 fall 3

[root@rabbitmq-1 ~]# systemctl restart haproxy

浏览器输入http://192.168.50.138/haproxy查看rabbitmq的状态。

以上是关于消息中间件Rabbitmq的使用的主要内容,如果未能解决你的问题,请参考以下文章

分布式系统消息中间件——RabbitMQ的使用思考篇

揭开消息中间件RabbitMQ的神秘面纱

消息中间件Rabbitmq的使用

消息中间件RabbitMQ

RabbitMq

RabbitMQ 消息中间件