RabbitMQ基本操作: https://blog.csdn.net/Michael_lcf/article/details/124677268
RabbitMQ的5大核心概念: https://blog.csdn.net/Michael_lcf/article/details/126435452
RabbitMQ的队列模式:https://blog.csdn.net/Michael_lcf/article/details/139362674
RabbitMQ实现分布式WebSocket通信: https://blog.csdn.net/Michael_lcf/article/details/126403772
RabbitMQ基本操作
为什么要用MQ:1.流量消峰。2.应用解耦。3.异步处理。
1、windows安装rabbitmq
分别安装 erlang 和 rabbitmq
下载链接: https://download.csdn.net/download/Michael_lcf/85332315
Erlang_otp_win64_22.3.exe
rabbitmq-server-3.8.3.exe
浏览器访问:http://127.0.0.1:15672/.
guest/guest
2、linux单节点rabbitmq
2.2、安装rabbitmq
链接: https://download.csdn.net/download/Michael_lcf/86262885
=== 安装rabbitmq ===
rpm -ivh erlang-21.3-1.el7.x86_64.rpm
yum install socat -y
rpm -ivh rabbitmq-server-3.8.8-1.el7.noarch.rpm
=== 启动rabbitmq ===
systemctl enable rabbitmq-server
systemctl start rabbitmq-server
systemctl status rabbitmq-server
systemctl stop rabbitmq-server
=== 开启web管理插件 ===
rabbitmq-plugins enable rabbitmq_management
用默认账号密码(guest/guest)访问地址 http://192.168.168.101:15672/出现权限问题;
=== 添加一个新的用户
# 创建账号
rabbitmqctl add_user admin123 admin123
# 设置用户角色
rabbitmqctl set_user_tags admin123 administrator
# 设置用户权限
# set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
rabbitmqctl set_permissions -p "/" admin123 ".*" ".*" ".*"
用户 user_admin123 具有/vhost1 这个 virtual host 中所有资源的配置、写、读权限
# 当前用户和角色
rabbitmqctl list_users
# 创建一个vhost:vhost_name就是想要创建的vhost
rabbitmqctl add_vhost [vhost_name]
rabbitmqctl delete_vhost [vhost_name]
rabbitmqctl list_vhosts
用账号密码(admin123/admin123)访问地址 http://192.168.168.101:15672/正常访问;
=== 重置命令 ===
# 关闭应用的命令
rabbitmqctl stop_app
# 重置的命令
rabbitmqctl reset
# 重新启动命令
rabbitmqctl start_app
# 查看所有队列命令
rabbitmqctl list_queues
2.3、安装过程的小插曲
2.3.1、Error: unable to perform an operation on node ‘rabbit@michael’
Error: unable to perform an operation on node 'rabbit@michael'. Please see diagnostics information and suggestions below.
Most common reasons for this are:
* Target node is unreachable (e.g. due to hostname resolution, TCP connection or firewall issues)
* CLI tool fails to authenticate with the server (e.g. due to CLI tool's Erlang cookie not matching that of the server)
* Target node is not running
In addition to the diagnostics info below:
* See the CLI, clustering and networking guides on https://rabbitmq.com/documentation.html to learn more
* Consult server logs on node rabbit@michael
* If target node is configured to use long node names, don't forget to use --longnames with CLI tools
DIAGNOSTICS
===========
attempted to contact: [rabbit@michael]
rabbit@michael:
* connected to epmd (port 4369) on michael
* node rabbit@michael up, 'rabbit' application running
Current node details:
* node name: 'rabbitmqcli-3572-rabbit@michael'
* effective user's home directory: /var/lib/rabbitmq
* Erlang cookie hash: mXgl+uqZ4XzA9DXxrrbEyw==
在 /etc/hosts
文件中如下图添加 相关配置:
3、三节点rabbitmq集群
3.1、三节点集群安装rabbitmq
前提三节点 均已安装rabbitmq。
1.修改3台机器的主机名称
在第1台机器执行
echo node1 > /etc/hostname
在第2台机器执行
echo node2 > /etc/hostname
在第3台机器执行
echo node3 > /etc/hostname
2.配置各个节点的 hosts 文件,让各个节点都能互相识别对方
cat >> /etc/hosts << EOF
192.168.168.171 node1
192.168.168.172 node2
192.168.168.173 node3
EOF
3.以确保各个节点的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.在node2执行
此处 我们以node1为主,然后把node2加入到node1。
rabbitmqctl stop_app (只关闭RabbitMQ服务)
(rabbitmqctl stop 会将Erlang虚拟机关闭;rabbitmqctl stop_app 只关闭RabbitMQ服务;)
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node1
rabbitmqctl start_app (只启动应用服务)
6.在node3执行
此处 我们以node1为主,然后把node3加入到node2。(把node3加入到node1也可以。)
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node2
rabbitmqctl start_app
7.集群状态
rabbitmqctl cluster_status
8.需要重新设置用户
创建账号
rabbitmqctl add_user admin123 admin123
设置用户角色
rabbitmqctl set_user_tags admin123 administrator
设置用户权限
rabbitmqctl set_permissions -p "/" admin123 ".*" ".*" ".*"
9.解除集群节点(node2和node3机器分别执行)
(node2和node3机器分别执行)
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
rabbitmqctl cluster_status
(node1机器上执行)
rabbitmqctl forget_cluster_node rabbit@node2
rabbitmqctl forget_cluster_node rabbit@node3
3.2、配置集群镜像队列策略
如果RabbitMQ集群中只有一个Broker节点,那么该节点的失效将导致整体服务的临时性不可用,并且也可能会导致消息的丢失。可以将所有消息都设置为持久化,并且对应队列的durable属性也设置为true,但是这样仍然无法避免由于缓存导致的问题:因为消息在发送之后和被写入磁盘井执行刷盘动作之间存在一个短暂却会产生问题的时间窗。通过publisherconfirm机制能够确保客户端知道哪些消息己经存入磁盘,尽管如此,一般不希望遇到因单点故障导致的服务不可用。
引入镜像队列(Mirror Queue)的机制,可以将队列镜像到集群中的其他Broker节点之上,如果集群中的一个节点失效了,队列能自动地切换到镜像中的另一个节点上以保证服务的可用性。
-
启动三台集群节点。
-
随便找一个节点添加policy。
-
在node1上创建一个队列发送一条消息,队列存在镜像队列。
-
停掉node1之后发现node2成为镜像队列。
-
就算整个集群只剩下一台机器了 依然能消费队列里面的消息,说明队列里面的消息被镜像队列传递到相应机器里面了。
4、Haproxy+Keepalive实现高可用负载均衡
HAProxy提供高可用性、负载均衡及基于TCPHTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案,包括Twitter,Reddit,StackOverflow,GitHub在内的多家知名互联网公司在使用。HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的井发连接数。
扩展nginx,lvs,haproxy之间的区别: http://www.ha97.com/5646.html
4.1、Haproxy Install
1.下载haproxy(在node1和node2)
yum -y install haproxy
2.修改node1和node2的haproxy.cfg
vim /etc/haproxy/haproxy.cfg
backend app
balance roundrobin
server rabbitmq_node1 192.168.168.171:5672 check inter 5000 rise 2 fall 3 weight 1
server rabbitmq_node2 192.168.168.172:5672 check inter 5000 rise 2 fall 3 weight 1
server rabbitmq_node3 192.168.168.173: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.168.171:8888/stats
http://192.168.168.172:8888/stats
4.2、Keepalived实现双机(主备)热备
试想如果前面配置的HAProxy主机突然宕机或者网卡失效,那么虽然RbbitMQ集群没有任何故障但是对于外界的客户端来说所有的连接都会被断开结果将是灾难性的为了确保负载均衡服务的可靠性同样显得十分重要,这里就要引入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集群