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

浏览器访问

相关推荐
大秦王多鱼4 小时前
Kafka ACL(访问控制列表)介绍
运维·分布式·安全·kafka·apache
40岁的系统架构师5 小时前
17 一个高并发的系统架构如何设计
数据库·分布式·系统架构
一张假钞15 小时前
Spark的基本概念
大数据·分布式·spark
一张假钞15 小时前
Spark On Yarn External Shuffle Service
大数据·分布式·spark
大秦王多鱼15 小时前
Kafka SASL/SCRAM介绍
分布式·安全·kafka·apache
优人ovo17 小时前
详解Kafka并行计算架构
分布式·架构·kafka
S-X-S1 天前
RabbitMQ持久化队列配置修改问题
分布式·rabbitmq
圣心1 天前
Kafka 使用说明(kafka官方文档中文)
分布式·kafka·linq
圣心1 天前
Kafka中文文档
分布式·kafka
gentle coder1 天前
Redis_Redission的入门案例、多主案例搭建、分布式锁进行加锁、解锁底层源码解析
java·redis·分布式