十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
一:消息中间件的描述
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中的数据同步到集群中其他节点里
一:基础部署,集群里的主机都需要实施的操作
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
二,正式部署集群
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/
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的状态。
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。