MQ全称Messages Queue,即消息队列。是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。队列的使用除去了接收和发送应用程序,同时执行的要求。在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式,大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
MQ的分类:
P2P模式(安全):
P2P模式包含三个角色:
1.消息队列(Queue)、
2.发送者(Sender)、
3.接收者(Receiver)。
每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。
P2P的特点如下:
• 每个消息只有一个消费者(Consumer),即一旦被消费,消息就不再在消息队列中
• 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行它不会影响到消息被发送到队列
• 接收者在成功接收消息之后,需向队列应答成功。
• 如果希望发送的每个消息都会被成功处理的话,那么需要P2P模式
Pub/Sub模式(并发):
Pub/Sub模式包含三个角色:主题(Topic)、发布者(Publisher)、订阅者(Subscriber) 。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。Pub/Sub的特点如下:
• 每个消息可以有多个消费者
• 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息
• 为了消费消息,订阅者必须保持运行的状态
• 如果希望发送的消息可以不被做任何处理、或者只被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型
RabbitMQ介绍:
RabbitMQ从整体上来看是一个典型的生产者消费者模型,主要负责接收、存储和转发消息。
RabbitMQ的通信过程:
1. P1生产消息,发送给服务器端的Exchange
2. Exchange收到消息,根据ROUTINKEY,将消息转发给匹配的Queue1
3. Queue1收到消息,将消息发送给订阅者C1
4. C1收到消息,发送ACK给队列确认收到消息
5. Queue1收到ACK,删除队列中缓存的此条消息
开始部署、上菜!!!!
部署环境:
192.168.237.11 haproxy
192.168.237.12 rabbitmq1
192.168.237.13 rabbitmq2
192.168.237.14 rabbitmq3
为以上四台虚拟机做域名解析同上,配置主机名同上,关闭防火墙,关闭selinux
第一步:分别为 rabbitmq1、rabbitmq2、rabbitmq3安装Erlang、安装Rabbitmq(三台机器同步)
1.写erlang的yum源、安装erlang:
# vim /etc/yum.repos.d/erlang.repo
[rabbitmq-erlang]
name=rabbitmq-erlang
baseurl=https://dl.bintray.com/rabbitmq-erlang/rpm/erlang/21/el/7
gpgcheck=0
gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
repo_gpgcheck=0
enabled=1
# yum -y install erlang
2.安装RabbitMQ(rabbitmq-server的版本可以安装自己喜欢的,我的是3.7.12)
# wget https://dl.bintray.com/rabbitmq/rpm/rabbitmq-server/v3.7.x/el/8/noarch/rabbitmq-server-3.7.20-1.el8.noarch.rpm
# yum install https://dl.bintray.com/rabbitmq/rpm/rabbitmq-server/v3.7.x/el/7/noarch/rabbitmq-server-3.7.12-1.el7.noarch.rpm
3.修改rabbitmq的配置文件
# cp /usr/share/doc/rabbitmq-server-3.7.12/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
# vim /etc/rabbitmq/rabbitmq.config
修改第61行如下所示:
58 %%
59 %% Uncomment the following line if you want to allow access to the
60 %% guest user from anywhere on the network.
61 {loopback_users, []}
62
63
4.安装插件并启动服务(安装web界面管理工具,l服务开启后可以看到端口:15672被监听):
# rabbitmq-plugins enable rabbitmq_management
# systemctl start rabbitmq-server
# ss -tnl
5.查看节点状态(可以看到节点名同主机名)
# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq1 ...
[{nodes,[{disc,[rabbit@rabbitmq1]}]},
{running_nodes,[rabbit@rabbitmq1]},
{cluster_name,<<"rabbit@rabbitmq1">>},
{partitions,[]},
{alarms,[{rabbit@rabbitmq1,[]}]}]
6.浏览器访问测试(http://ip:15672):
http://192.168.237.12:15672
默认账号/密码: guest/guest
rabbitma2、rabbitmq3重复上述1-6步即可。
rabbitma1、rabbitma2、rabbitma3都安装了erlang、安装了rabbitmq后在执行下面操作!!!
7.设置erlang的运行节点:
首先要保证三台机器的cookied内容一致,即将rabbitmq1的cookie文件拷贝到rabbitmq2、rabbitmq3,我们rpm包部署的一般都在/var/lib/rabbitmq/.erlang.cookie。
cat /var/lib/rabbitmq/.erlang.cookie
scp -r /var/lib/rabbitmq/.erlang.cookie rabbitmq2:/var/lib/rabbitmq/.erlang.cookie
scp -r /var/lib/rabbitmq/.erlang.cookie rabbitmq3:/var/lib/rabbitmq/.erlang.cookie
8.添加用户并设置密码(3台都要哦!!!):
由于guest这个用户,只能在本地访问,所以我们要在每个节点上,新增一个用户并赋予对/的所有权限,然后添加到管理员组中,让此用户能够远程访问
rabbitmqctl add_user admin admin
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
rabbitmqctl set_user_tags admin administrator
9.测试访问(http://ip:15672 ):
http://192.168.237.12:15672
账号:admin
密码:admin
此时每个节点是单独的一台RabbitMQ,下面来将他们组成集群。
10.将rabbitmq2、rabbitmq3将加入到rabbitmq1中组成集群。
rabbitmq-server 启动时,会一起启动:节点和应用,它预先设置RabbitMQ应用为standalone(脱机)模式。要将一个节点加入到现有的集群中,你需要停止这个应用,并将节点设置为原始状态。如果使用systemctl stop rabbitmq-server,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。(即停应用,不停止节点)
rabbitmq2:
磁盘节点:
# rabbitmqctl stop_app
# rabbitmqctl join_cluster rabbit@rabitmq1
内存节点:
# rabbitmqctl join_cluster --ram rabbit@rabbitmq1
# rabbitmqctl start_app
rabbitmq2的操作同上(不在赘述)
11.在任意节点上查看集群状态:
[root@rabbitmq3 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq3 ...
[{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]}]},
{running_nodes,[rabbit@rabbitmq2,rabbit@rabbitmq1,rabbit@rabbitmq3]},
{cluster_name,<<"rabbit@rabbitmq1">>},
{partitions,[]},
{alarms,[{rabbit@rabbitmq2,[]},{rabbit@rabbitmq1,[]},{rabbit@rabbitmq3,[]}]}]
可以看到,此时集群已形成。
12.在任意节点上设置镜像队列策略
跟图走吧*_*-------->>>
图片小说明:在web界面登陆,点击“Admin–Virtual Hosts(页面右侧)”,在打开的页面上的下方的“Add a new virtual host”处增加一个虚拟主机,同时给用户“admin”和“guest”均加上权限(在页面直接设置、点点点即可);
然后在主机中设置(其中wiger52是我在web端设置的虚拟主机名,你可以换成自己的):
# rabbitmqctl set_policy -p wiger52 ha-all "^" '{"ha-mode":"all"}'
13.Rabbitmq+HAproxy
对虚拟机192.168.237.11进行操作:
# yum install epep-release -y
# yum install haproxy -y
你只需要改主机机ip即可,另外,代理服务器的端口尽量不要和其他服务冲突
[root@tubage ~]# cat /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
daemon
stats socket /var/lib/haproxy/stats
defaults
log global
mode tcp
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5s
clitimeout 120s
srvtimeout 120s
listen rabbitmq_cluster 0.0.0.0:85 #作为代理的服务器的IP和端口
mode tcp
balance roundrobin
server rabbit1 192.168.237.12:15672 check inter 5000 rise 2 fall 2
server rabbit2 192.168.237.13:15672 check inter 5000 rise 2 fall 2
server rabbit3 192.168.237.14:15672 check inter 2000 rise 2 fall 3
listen monitor
bind 0.0.0.0:8100#监控页面的访问端口
mode http
option httplog
stats enable
stats uri /rabbitmqstats
stats refresh 30s
stats auth admin:admin
# systemctl start haproxy
14.测试:
一切服务OK。
初来乍到,请多指教。