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服务器
(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
浏览器访问