RabbitMQ 消息中间件 消息队列

RabbitMQ

1、RabbitMQ简介

RabbiMQ是⽤Erang开发的,集群⾮常⽅便,因为Erlang天⽣就是⼀⻔分布式语⾔,但其本身并不⽀持负载均衡。支持高并发,支持可扩展。支持AJAX,持久化,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

2、RabbitMQ 特点

  • 可靠性

  • 扩展性

  • 高可用性

  • 多种协议

  • 多语言客户端

  • 管理界面

  • 插件机制

3、什么是消息队列

​ MQ 全称为Message Queue, 。是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。

消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信。

4、RabbiMQ模式

注意:RabbitMQ模式⼤概分为以下三种:

(1)单⼀模式。

(2)普通模式(默认的集群模式)。

(3) 镜像模式(把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA⽅案,在对业务可靠性要求较⾼的场合中⽐较适⽤)。要实现镜像模式,需要先搭建⼀个普通集群模式,在这个模式的基础上再配置镜像模式以实现⾼可⽤。

5、集群中的基本概念

RabbitMQ的集群节点包括内存节点、磁盘节点。顾名思义内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘。如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是安全的放在磁盘。

一个rabbitmq集 群中可以共享 user,vhost,queue,exchange等,所有的数据和状态都是必须在所有节点上复制的。

ConnectionFactory(连接管理器):应用程序与Rabbit之间建立连接的管理器,程序代码中使用;

Channel(信道):消息推送使用的通道;

Exchange(交换器):用于接受、分配消息;

Queue(队列):用于存储生产者的消息;

RoutingKey(路由键):用于把生成者的数据分配到交换器上;

BindingKey(绑定键):用于把交换器的消息绑定到队列上;

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

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

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

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

user:用户

单实例安装RabbitMQ

安装依赖

[root@localhost ~]# yum -y install vim lrasz
[root@localhost ~]# yum install -y epel-release gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel

安装erlang

方法一:
[root@localhost ~]# curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
方法二:
[root@localhost ~]# rz   #上传安装包

安装erlang
[root@localhost ~]# yum -y install erlang-21.3.8.21-1.el7.x86_64.rpm

测试:
[root@localhost ~]# erl
Erlang/OTP 21 [erts-10.3.5.16] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe]

Eshell V10.3.5.16  (abort with ^G)
1> 

安装rabbitmq

[root@localhost ~]# yum -y install rabbitmq-server-3.7.10-1.el7.noarch.rpm 
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start rabbitmq-server
[root@localhost ~]# systemctl enable rabbitmq-server

开启rabbitmq的web访问界面

[root@localhost ~]# rabbitmq-plugins enable rabbitmq_management

添加用户

[root@localhost ~]# rabbitmqctl add_user zx 123456
Adding user "zx" ...
[root@localhost ~]# rabbitmqctl set_user_tags zx administrator
Setting tags for user "zx" to [administrator] ...
[root@localhost ~]# rabbitmqctl list_users
Listing users ...
user    tags
zx      [administrator]
guest   [administrator]
[root@localhost ~]# rabbitmqctl set_permissions -p "/" zx ".*" ".*" ".*"
Setting permissions for user "zx" in vhost "/" ...

修改配置文件

[root@localhost rabbitmq]# cp /usr/share/doc/rabbitmq-server-3.7.10/rabbitmq.config.example /etc/rabbitmq/
[root@localhost rabbitmq]# cp rabbitmq.config.example rabbitmq.config
[root@localhost rabbitmq]# vim rabbitmq.config

重启服务

[root@localhost rabbitmq]# systemctl restart rabbitmq-server

浏览器访问


Rabbit-test

[root@localhost ~]# yun -y install unzip
[root@localhost ~]# lrzsz
[root@localhost ~]# ls
anaconda-ks.cfg                    
rabbitmq-test-main.zip

cd rabbitmq-test && yum install -y python3 python3-devel && \
pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple && \
export FLASK_ENV=development ; flask run --reload -p 80 -h 0.0.0.0

rabbitMQ集群

准备三台rabbitMQ服务器

hostname ip
rabbitmq-1 192.168.20.141
rabbitmq-2 192.168.20.142
rabbitmq-3 192.168.20.143

准备工作(三台)

[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
[root@rabbitmq-1 ~]# vim /etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_MNESIA_BASE=/data/rabbitmq/data
RABBITMQ_LOG_BASE=/data/rabbitmq/logs
# 重启服务
[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server

rabbitmq-1服务器

[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.20.142:/var/lib/rabbitmq/
[root@rabbitmq-1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.20.143:/var/lib/rabbitmq/

rabbitmq-2服务器

[root@rabbitmq-2 ~]# systemctl restart rabbitmq-server
#停止节点
[root@rabbitmq-2 ~]# rabbitmqctl stop_app 
#如果有数据需要重置,没有则不用
[root@rabbitmq-2 ~]# rabbitmqctl reset  
 #添加到磁盘节点,--ram内存节点
[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' ...

rabbitmq-3服务器

[root@rabbitmq-3 ~]# systemctl restart rabbitmq-server
[root@rabbitmq-3 ~]# rabbitmqctl stop_app
Stopping node 'rabbit@rabbitmq-3' ...
[root@rabbitmq-3 ~]# rabbitmqctl reset
Resetting node 'rabbit@rabbitmq-3' ...
[root@rabbitmq-3 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq-1
Clustering node 'rabbit@rabbitmq-3' with 'rabbit@rabbitmq-1' ...
[root@rabbitmq-3 ~]# rabbitmqctl start_app
Starting node 'rabbit@rabbitmq-3' ...

(1)默认rabbitmq启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,mq-1是磁盘节点。
(2)如果要使mq-2、mq-3都是磁盘节点,去掉--ram参数即可。
(3)如果想要更改节点类型,可以使⽤命令rabbitmqctl change_cluster_node_typedisc(ram),前提是必须停掉rabbit应⽤

查看集群状态

[root@rabbitmq-1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq-1 ...
[{nodes,[{disc,['rabbit@rabbitmq-1','rabbit@rabbitmq-3']},
         {ram,['rabbit@rabbitmq-2']}]},
 {running_nodes,['rabbit@rabbitmq-2','rabbit@rabbitmq-3','rabbit@rabbitmq-1']},
 {cluster_name,<<"rabbit@rabbitmq-1">>},
 {partitions,[]},
 {alarms,[{'rabbit@rabbitmq-2',[]},
          {'rabbit@rabbitmq-3',[]},
          {'rabbit@rabbitmq-1',[]}]}]

浏览器访问

安装配置负载均衡器

1.安装负载均衡器haproxy

yum -y install haproxy

2、修改 /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 *:89    #80端口冲突
    mode http
    option httplog
    option httpclose
    log 127.0.0.1 local0 err
    stats uri  /haproxy
    stats auth newrain:123456  #登录用户
    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.20.141:5672 check inter 2000s rise 2 fall 3
    server      rabbitmq2 192.168.20.142:5672 check inter 2000s rise 2 fall 3
    server      rabbitmq3 192.168.20.143:5672 check inter 2000s rise 2 fall 3
    [root@rabbitmq-1 ~]# systemctl start haproxy

浏览器访问

相关推荐
明达技术16 分钟前
物联优化汽车齿轮锻造
分布式·物联网
龙哥·三年风水3 小时前
群控系统服务端开发模式-应用开发-前端框架
分布式·vue·群控系统
P.H. Infinity10 小时前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
WX1870211287312 小时前
在分布式光伏电站如何进行电能质量的治理?
分布式
不能再留遗憾了15 小时前
RabbitMQ 高级特性——消息分发
分布式·rabbitmq·ruby
茶馆大橘15 小时前
微服务系列六:分布式事务与seata
分布式·docker·微服务·nacos·seata·springcloud
材料苦逼不会梦到计算机白富美18 小时前
golang分布式缓存项目 Day 1
分布式·缓存·golang
想进大厂的小王18 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构
Java 第一深情18 小时前
高性能分布式缓存Redis-数据管理与性能提升之道
redis·分布式·缓存
许苑向上19 小时前
【零基础小白】 window环境下安装RabbitMQ
rabbitmq