rabbitmq

1、消息队列

1.1mq的相关概念

MQ(message quene),本质上是个队列,FIFO(先入先出),只不过队列中存放的内容是message而已,还是一种跨进程的通信机制,用于上下游传递消息,mq是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了mq之后,消息发送上游只需要依赖MQ,不用依赖其他服务

1.2RabbitMQ

1.2.1概念

rabbitmq是一个消息中间件:它接受并转发消息。可以把它当作一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这种逻辑RabbitMQ是一个快递站,一个快递员帮你传递快件。rabbitmq与快递站的主要区别在于,他不处理快件而是接收

 

 

 1.2.2四大核心概念

生产者:产生数据发送消息的程序是生产者

交换机:交换机是rabbitmq非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是把消息丢弃,这个由交换机类型决定

队列:队列是rabbitmq内部使用的一种数据结构,尽管消息流经rabbitmq和应用程序,但他们只能存储在队列中。队列仅受主机的内存和硬盘的限制的约束,本质上是一个大的消息缓冲区。许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。这是我们使用队列的方式

消费者:消费与接收具有相似的含义。消费者大多时侯是一个等待接收消息的程序。请注意生产者,消费者和中间件很多时候并不在同一机器上。同一个应用程序可以是生产者又可以是消费者

1.2.3 rabbitmq核心部分

 

 

 1.2.4 名词介绍

 

 

broker:接收和分发消息的应用

virtual host:出于多租户和安全因素设计的,把amqp的基本组件划分到一个虚拟的分组中,类似于网络中的namespace概念。当多个不同的用户使用同一个rabbitmq server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchage/quene等

connection:publisher /consumer和broker之间的tcp之间的连接

channel:如果每一次访问 RabbitMQ 都建立一个Connection,在消息量大的时候建立 TCP Connection 的开销将是巨大的,效率也较低。Channel 是在connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread 创建单独的channel 进行通讯,AMQP method 包含了channel id 帮助客户端和message broker 识别 channel,所以channel 之间是完全隔离的。Channel 作为轻量级的Connection 极大减少了操作系统建立TCP connection 的开销

exchange:message到达broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到quene中去.常用的类型有:direct(point-topoint),topic(publish-subscribe)andfanout(multicast)

queue:消息被发送到这里等待consumer取走

Binding:exchange 和queue之间的虚拟连接,binding中可以包含routing key,binding 信息被保存到exchange中的查询表中,用于message的分发依据

1.2.5安装

1、官网地址

https://www.rabbitmq.com/download.html

 

rabbitmq下载地址:https://www.rabbitmq.com/download.html
erlang下载:wget --content-disposition https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-23.3.4.5-1.el7.x86_64.rpm/download.rpm

 

2、文件上传并安装

上传到/usr/local/software 目录下(如果没有software 需要自己创建)
[root@localhost software]# ll
total 35312
-rw-r--r-- 1 root root 20346992 Jul 23 04:19 erlang-23.3.4.5-1.el7.x86_64.rpm
-rw-r--r-- 1 root root 15807209 Jul 24 11:13 rabbitmq-server-3.8.19-1.el7.noarch.rpm
[root@localhost software]# rpm -ivh erlang-23.3.4.5-1.el7.x86_64.rpm 
[root@localhost software]# yum -y install  socat
[root@localhost software]# rpm -ivh  rabbitmq-server-3.8.19-1.el7.noarch.rpm 

 3、常用命令(按照以下顺序执行)

添加开机启动rabiitmq服务
[root@localhost software]# systemctl enable rabbitmq-server
Created symlink from /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service to /usr/lib/systemd/system/rabbitmq-server.service.
启动服务并查看服务状态
[root@localhost software]# systemctl start  rabbitmq-server
[root@localhost software]# systemctl  status rabbitmq-server
● rabbitmq-server.service - RabbitMQ broker
   Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2021-07-24 14:15:35 CST; 49s ago
 Main PID: 2103 (beam.smp)
   Status: "Initialized"
   CGroup: /system.slice/rabbitmq-server.service
           ├─2103 /usr/lib64/erlang/erts-11.2.2.4/bin/beam.smp -W w -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -sbwt n...
           ├─2118 erl_child_setup 32768
           ├─2141 /usr/lib64/erlang/erts-11.2.2.4/bin/epmd -daemon
           ├─2162 inet_gethost 4
           └─2163 inet_gethost 4

Jul 24 14:15:29 localhost.localdomain rabbitmq-server[2103]: TLS Library: OpenSSL - OpenSSL 1.0.2k-fips  26 Jan 2017
Jul 24 14:15:29 localhost.localdomain rabbitmq-server[2103]: Doc guides:  https://rabbitmq.com/documentation.html
Jul 24 14:15:29 localhost.localdomain rabbitmq-server[2103]: Support:     https://rabbitmq.com/contact.html
Jul 24 14:15:29 localhost.localdomain rabbitmq-server[2103]: Tutorials:   https://rabbitmq.com/getstarted.html
Jul 24 14:15:29 localhost.localdomain rabbitmq-server[2103]: Monitoring:  https://rabbitmq.com/monitoring.html
Jul 24 14:15:29 localhost.localdomain rabbitmq-server[2103]: Logs: /var/log/rabbitmq/rabbit@localhost.log
Jul 24 14:15:29 localhost.localdomain rabbitmq-server[2103]: /var/log/rabbitmq/rabbit@localhost_upgrade.log
Jul 24 14:15:29 localhost.localdomain rabbitmq-server[2103]: Config file(s): (none)
Jul 24 14:15:35 localhost.localdomain rabbitmq-server[2103]: Starting broker... completed with 0 plugins.
停止服务(选择执行):[root@localhost software]# systemctl  stop  rabbitmq-server
开启web管理插件:[root@localhost ~]# rabbitmq-plugins enable  rabbitmq_management
Enabling plugins on node rabbit@localhost:
rabbitmq_management
The following plugins have been configured:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch
Applying plugin configuration to rabbit@localhost...
The following plugins have been enabled:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch

started 3 plugins.
用默认账号密码(guest)访问地址http://192.168.38.153:15672/出现权限问题

 

4、创建一个新的用户
  创建账号
     [root@localhost ~]# rabbitmqctl add_user admin 123
  设置用户角色
     [root@localhost ~]#  rabbitmqctl set_user_tags admin administrator
  设置用户权限
     set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
     [root@localhost ~]# rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
  用户user_admin具有/vhost1这个virtual host中所有资源的配置、写、读权限
  当前用户和角色
    rabbitmqctl list_users

5、再次利用admin用户登录

6、重置命令 
      关闭应用的命令为:rabbitmqctl  stop_app
      清楚的命令为:rabbitmqctl  reset
      重新启动命令为: rabbitmqctl  start_app

2、集群搭建步骤

1、修改3台机器的主机名称

[root@node3 ~]# cat /etc/hosts192.168.38.153 node1
192.168.38.156 node2
192.168.38.159 node3

2、确保各个节点的cookie文件使用的是同一个值

在node1 上执行远程操作命令
scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/.erlang.cookie 
scp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/.erlang.cookie 

4、启动RabbitMQ 服务,顺带启动Erlang 虚拟机和RbbitMQ 应用服务(在三台节点上分别执行以下命令)

 

rabbitmq-server -detached

 

5、在节点2执行

rabbitmqctl stop_app 
(rabbitmqctl stop 会将Erlang 虚拟机关闭,rabbitmqctl stop_app 只关闭RabbitMQ 服务) 
rabbitmqctl reset 
rabbitmqctl join_cluster rabbit@node1 
rabbitmqctl start_app(只启动应用服务)

6、在节点3执行

rabbitmqctl stop_app 
rabbitmqctl reset 
rabbitmqctl join_cluster rabbit@node2 
rabbitmqctl start_app

7、集群状态

rabbitmqctl cluster_status

8、需要重新设置用户

创建账号 
rabbitmqctl add_user admin 123 
设置用户角色 
rabbitmqctl set_user_tags admin administrator 
设置用户权限 
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

9、解除集群节点

rabbitmqctl stop_app 
rabbitmqctl reset 
rabbitmqctl start_app 
rabbitmqctl cluster_status 
rabbitmqctl forget_cluster_node rabbit@node2(node1 机器上执行)

2、haproxy+keepalive实现高可用负载均衡

2.1架构图

 

 

2.2haproxy实现负载均衡

HAProxy 提供高可用性、负载均衡及基于TCPHTTP 应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案,包括Twitter,Reddit,StackOverflow,GitHub 在内的多家知名互联网公司在使用。HAProxy 实现了一种事件驱动、单一进程模型,此模型支持非常大的井发连接数

2.3搭建步骤

 

1.下载haproxy(在node1 和node2) 
 yum -y install haproxy 
2.修改node1 和node2 的haproxy.cfg
cat /etc/haproxy/haproxy.cfg
server node1 192.168.38.153:5672 check inter 5000 rise 2 fall 3 weight 1
server node1 192.168.38.156:5672 check inter 5000 rise 2 fall 3 weight 1
server node1 192.168.38.159:5672 check inter 5000 rise 2 fall 3 weight 1
3、在两台节点启动haproxy
haproxy -f /etc/haproxy/haproxy.cfg
ps -ef | grep haproxy
4、访问地址
http://192.168.38.152:8888/stats

 

 2.4 keepalived实现双机(主备)热备

1.下载keepalived 
  yum -y install keepalived 
2.节点node1 配置文件 
  vim /etc/keepalived/keepalived.conf 
  把资料里面的keepalived.conf 修改之后替换 
3.节点node2 配置文件 
  需要修改global_defs 的router_id,如:nodeB 
  其次要修改vrrp_instance_VI 中state 为"BACKUP"; 
  最后要将priority 设置为小于100 的值
4.
添加haproxy_chk.sh
(为了防止HAProxy 服务挂掉之后Keepalived 还在正常工作而没有切换到Backup 上,所以这里需要编写一个脚本来检测HAProxy服务的状态,HAProxy 服务挂掉之后该脚本会自动重启
HAProxy 的服务,如果不成功则关闭Keepalived 服务,这样便可以切换到Backup 继续工作)
vim /etc/keepalived/haproxy_chk.sh(可以直接上传文件)
修改权限chmod 777 /etc/keepalived/haproxy_chk.sh
5、启动keepalive命令(node1和node2启动)
systemctl start keepalived
6.观察Keepalived 的日志
tail -f /var/log/messages -n 200
7.观察最新添加的vip
ip add show
8.node1 模拟keepalived 关闭状态
systemctl stop keepalived
9.使用vip 地址来访问rabbitmq 集群

 

posted @ 2021-07-28 16:21  西红柿要上天  阅读(318)  评论(0编辑  收藏  举报