一:消息中间件的描述 1、简介 消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。 当下主流的消息中间件有RabbitMQ、Kafka、ActiveMQ、RocketMQ等
2、消息中间件主要作用 • 冗余(存储) • 扩展性 • 可恢复性 • 顺序保证 • 缓冲 • 异步通信 • 削峰 :消息队列中的常用场景,一般在秒杀或抢够活动中使用广泛。一般会因为流量过大,应用系统配置承载不了这股瞬间流量,导致系统直接挂掉,即传说中的“宕机”现象。为解决这个问题,我们会将那股巨大的流量拒在系统的上层,即将其转移至 MQ 而不直接涌入我们的接口。
二.消息队列之一RabbiMQ简介 1, RabbiMQ是⽤Erang开发的,集群⾮常⽅便,因为Erlang天⽣就是⼀⻔分布式语⾔,但其本身并不⽀持负载均衡,支持高并发,支持可扩展。支持AJAX,持久化,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
2, RabbiMQ的特点
• 可靠性
• 扩展性
• 高可用性
• 多种协议
• 多语言客户端
• 管理界面
• 插件机制
3.什么是消息队列 MQ 全称为Message Queue, 消息队列。是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。 消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信。
4.RabbiMQ模式 注意:RabbitMQ模式⼤概分为以下三种: (1)单⼀模式 (一台主机部署rabbitmq) (2)普通模式 (默认的集群模式)。 (3) 镜像模式 (把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA⽅案,在对业务可靠性要求较⾼的场合中⽐较适⽤)。要实现镜像模式,需要先搭建⼀个普通集群模式,在这个模式的基础上再配置镜像模式以实现⾼可⽤,在镜像模式中设置策略可以将主rabbitmq中的数据同步到集群中其他节点里
++++++++++++RabbitMQ 集 群 基 础 部 署 (普通模式)++++++++++++
一:基础部署,集群里的主机都需要实施的操作
1,若有三台服务器作为三个节点,且都联⽹,关闭防火墙,selinux,编辑域名解析/etc/hosts(ip与主机名称应该对应好,要不然容易影响实验) [root@rabbitmq-1 ~]# vim /etc/hosts 192.168.50.138 rabbitmq-1 192.168.50.139 rabbitmq-2 192.168.50.140 rabbitmq-3
2,三个节点配置安装rabbitmq软件
安装依赖:
[root@rabbitmq-1 ~]# yum install -y gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel
[root@rabbitmq-1 ~]# wget --content-disposition https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-20.3-1.el7.centos.x86_64.rpm/download.rpm
[root@rabbitmq-1 ~]# rpm -ivh erlang-20.3-1.el7.centos.x86_64.rpm
测试; [root@rabbitmq-1 ~]# erl
安装rabbitmq: [root@rabbitmq-1 ~]# wget https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.5/rabbitmq-server-3.7.5-1.el7.noarch.rpm [root@rabbitmq-1 ~]# yum install rabbitmq-server-3.7.5-1.el7.noarch.rpm
3.启动 启动方式一: [root@rabbitmq-1 ~]# systemctl daemon-reload [root@rabbitmq-1 ~]# systemctl start rabbitmq-server [root@rabbitmq-1 ~]# systemctl enable rabbitmq-server [root@rabbitmq-1 ~]# systemctl status rabbitmq-server 启动方式二: [root@rabbitmq-1 ~]# /sbin/service rabbitmq-server status ---查看状态 [root@rabbitmq-1 ~]# /sbin/service rabbitmq-server start ---启动
4,开启rabbitmq的web访问界面: [root@rabbitmq-1 ~]# rabbitmq-plugins enable rabbitmq_management
5.创建用户:
注意:创建用户只需要在一台主机上添加就可以,即把谁当作管理员就在哪儿创建
(1)添加用户和密码谁在
[root@rabbitmq-1 ~]# rabbitmqctl add_user soho 123
Creating user "soho" ...
...done.
(2)这是为管理员
[root@rabbitmq-1 ~]# rabbitmqctl set_user_tags soho administrator
Setting tags for user "soho" to [administrator] ...
...done.
(3)查看用户
[root@rabbitmq-1 ~]# rabbitmqctl list_users
Listing users ...
guest [administrator]
soho [administrator]
...done.
(4)权限
[root@rabbitmq-1 ~]# rabbitmqctl set_permissions -p "/" soho "." "." "."
Setting permissions for user "soho" in vhost "/" ...
...done.
此处设置权限时注意'.'之间需要有空格 三个'.*'分别代表了conf权限,read权限与write权限 例如:当没有给
soho设置这三个权限前是没有权限查询队列,在ui界面也看不见
6,所有机器都操作:开启用户远程登录:
[root@rabbitmq-1 ~]# cd /etc/rabbitmq/
[root@rabbitmq-1 rabbitmq]# cp /usr/share/doc/rabbitmq-server-3.7.5/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
[root@rabbitmq-1 rabbitmq]# ls
enabled_plugins rabbitmq.config
[root@rabbitmq-1 rabbitmq]# vim rabbitmq.config
修改如下:
7.三台机器都操作重启服务服务:
[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server
查看端口 所有机器都操作:开启用户远程登录:
[root@rabbitmq-1 ~]# cd /etc/rabbitmq/
[root@rabbitmq-1 rabbitmq]# cp /usr/share/doc/rabbitmq-server-3.7.5/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
[root@rabbitmq-1 rabbitmq]# ls
enabled_plugins rabbitmq.config
[root@rabbitmq-1 rabbitmq]# vim rabbitmq.config
修改如下:
8.三台机器都操作重启服务服务:
[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server
查看端口
4369 -- erlang发现口
5672 --程序连接端口
15672 -- 管理界面ui端口
25672 -- server间内部通信口
9,注意如果是云服务器,切记添加安全组端口放行。 web访问:192.168.50.138:15672 这里需要注意: rabbitmq默认管理员用户:guest 密码:guest 新添加的用户为:soho 密码:123
++++++++++++RabbitMQ 集 群 正 式 部 署 (普通模式)+++++++++++++
二,正式部署集群
1.首先创建好数据存放目录和日志存放目录 [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
2,创建配置文件: [root@rabbitmq-1 ~]# vim /etc/rabbitmq/rabbitmq-env.conf (添加如下内容) RABBITMQ_MNESIA_BASE=/data/rabbitmq/data RABBITMQ_LOG_BASE=/data/rabbitmq/logs
[root@rabbitmq-1 ~]# cat /etc/rabbitmq/rabbitmq-env.conf
3,重启服务 [root@rabbitmq-1 ~]# systemctl restart rabbitmq-server
4.拷⻉erlang.cookie 原因:集群中各节点是经由⼀个cookie来实现的,所以必须保证各节点cookie⼀致,不然节点之间就⽆法通信.(cookie存放的位置:解压缩方式安装部署的rabbitmq存放于/home/.erlang.cookie。rpm等安装包方式进行安装的/var/lib/rabbitmq)
[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.50.139:/var/lib/rabbitmq/ [root@rabbitmq-1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.50.140:/var/lib/rabbitmq/
3.将mq-2、mq-3作为内存节点加⼊mq-1节点集群中.mq-1用作磁盘节点,在RabbitMQ集群中,必须⾄少有⼀个磁盘节点,否则队列元数据⽆法写⼊到集群中,当磁盘节点宕掉时,集群将⽆法写⼊新的队列元数据信息。 在mq-2、mq-3执⾏如下命令: [root@rabbitmq-2 ~]# rabbitmqctl stop_app #停止节点,切记不是停止服务 [root@rabbitmq-2 ~]# rabbitmqctl reset #如果有数据需要重置,没有则不用 [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' ...
3.1.0此处节点问题解决方式:
(1)如果执行rabbitmqctl stop_app 这条命令报错:需要执行
#chmod 400 .erlang.cookie ⽂件是400的权限
#chown rabbitmq.rabbitmq .erlang.cookie
(2)由于更改hostname文件,在每次rabbitmqctl stop或者rabbitmqctl cluster_status等,只要是rabbitmq的命令就报错,提示大概如下
Cluster status of node rabbit@web2 ...
Error: unable to connect to node rabbit@web2: nodedown
..............
此时先ps aux | grep mq,然后kill -9 所有mq的进程,然后再rabbitmq-server -detached即可解决。(即先强杀,再重新启动)
(3)使用rabbitmqctl stop,rabbitmq-server -detached重新启动后,原先添加的用户admin、虚拟主机coresystem等均丢失,还需要重新添加。
(4) rabbitmqctl join_cluster --ram rabbit@rabbitmq-1报错时检查域名解析
(5)其他问题关于使用 rabbitmq-server -detached命令启动rabbitmq时,出现以下提示Warning: PID file not written; -detached was passed,此时使用
rabbitmqctl status提示服务已启动,可知此问题不用解决。
3.1.1节点补充:
(1)默认rabbitmq启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,
mq-1是磁盘节点。
( 2)如果要使mq-2、mq-3都是磁盘节点,去掉--ram参数即可。
(3)如果想要更改节点类型,可以使⽤命令rabbitmqctl change_cluster_node_type disc(ram),前提是必须停掉rabbit应⽤
注:
#如果有需要使用磁盘节点加入集群
[root@rabbitmq-2 ~]# rabbitmqctl join_cluster rabbit@rabbitmq-1
[root@rabbitmq-3 ~]# rabbitmqctl join_cluster rabbit@rabbitmq-1
4,查看集群状态,在任意节点上执行 rabbitmqctl cluster_status来查看是否集群配置成功。 [root@rabbitmq-1 ~]# rabbitmqctl cluster_status 每台机器显示出三台节点,表示已经添加成功!
5.登录rabbitmq web管理控制台,创建新的队列 打开浏览器输⼊http://192.168.50.138:15672, 输⼊默认的Username:guest 输⼊默认的Password:guest
根据界⾯提示创建⼀条队列
++++++由以上RABBITMQ普通模式+镜像模式+++++++++++++
三,添加镜像模式的原因:
上面已经完成RabbitMQ默认集群模式,但并不保证队列的高可用性,队列内容不会复制。如果队列节点宕机直接导致该队列无法应用,只能等待重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,必须要创建镜像队列。 镜像队列是基于普通的集群模式的。
1,创建镜像集群:三台机器相同操作 rabbitmq set_policy :设置策略 [root@rabbitmq-1 ~]#rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...
2,再次查看队列已经同步到其他两台节点:
3,此时镜像队列设置成功。已经部署完成,将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一致。``
++++++++rabbitmq默认的集群模式+镜像模式+HA+负载均衡++++++++++++ RabbitMQ 高可用集群搭建完成,最后一个步骤就是搭建均衡器。
简单安装并配置负载均衡器HA
注意:如果使用阿里云,可以使用阿里云的内网slb来实现负载均衡,不用自己搭建HA。 安装并配置负载均衡器HA 1、在192.168.50.138安装HAProxy yum -y install haproxy 2、修改 /etc/haproxy/haproxy.cfg [root@rabbitmq-1 ~]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak [root@rabbitmq-1 ~]# vim /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 *:80 mode http option httplog option httpclose log 127.0.0.1 local0 err stats uri /haproxy stats auth xingdian:123 (用户+密码) 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.50.138:5672 check inter 2000s rise 2 fall 3 server rabbitmq2 192.168.50.139:5672 check inter 2000s rise 2 fall 3 server rabbitmq3 192.168.50.140:5672 check inter 2000s rise 2 fall 3
[root@rabbitmq-1 ~]# systemctl restart haproxy
浏览器输入http://192.168.50.138/haproxy查看rabbitmq的状态。