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 集群