一:消息中間件的描述
1、簡(jiǎn)介
消息中間件也可以稱(chēng)消息隊(duì)列,是指用高效可靠的消息傳遞機(jī)制進(jìn)行與平臺(tái)無(wú)關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來(lái)進(jìn)行分布式系統(tǒng)的集成。通過(guò)提供消息傳遞和消息隊(duì)列模型,可以在分布式環(huán)境下擴(kuò)展進(jìn)程的通信。
當(dāng)下主流的消息中間件有RabbitMQ、Kafka、ActiveMQ、RocketMQ等
2、消息中間件主要作用
? 冗余(存儲(chǔ))
? 擴(kuò)展性
? 可恢復(fù)性
? 順序保證
? 緩沖
? 異步通信
? 削峰 :消息隊(duì)列中的常用場(chǎng)景,一般在秒殺或搶夠活動(dòng)中使用廣泛。一般會(huì)因?yàn)榱髁窟^(guò)大,應(yīng)用系統(tǒng)配置承載不了這股瞬間流量,導(dǎo)致系統(tǒng)直接掛掉,即傳說(shuō)中的“宕機(jī)”現(xiàn)象。為解決這個(gè)問(wèn)題,我們會(huì)將那股巨大的流量拒在系統(tǒng)的上層,即將其轉(zhuǎn)移至 MQ 而不直接涌入我們的接口。
二.消息隊(duì)列之一RabbiMQ簡(jiǎn)介
1, RabbiMQ是?Erang開(kāi)發(fā)的,集群?常?便,因?yàn)镋rlang天?就是??分布式語(yǔ)?,但其本身并不?持負(fù)載均衡,支持高并發(fā),支持可擴(kuò)展。支持AJAX,持久化,用于在分布式系統(tǒng)中存儲(chǔ)轉(zhuǎn)發(fā)消息,在易用性、擴(kuò)展性、高可用性等方面表現(xiàn)不俗。
2, RabbiMQ的特點(diǎn)
? 可靠性
? 擴(kuò)展性
? 高可用性
? 多種協(xié)議
? 多語(yǔ)言客戶(hù)端
? 管理界面
? 插件機(jī)制
3.什么是消息隊(duì)列
MQ 全稱(chēng)為Message Queue, 消息隊(duì)列。是一種應(yīng)用程序?qū)?yīng)用程序的通信方法。應(yīng)用程序通過(guò)讀寫(xiě)出入隊(duì)列的消息(針對(duì)應(yīng)用程序的數(shù)據(jù))來(lái)通信,而無(wú)需專(zhuān)用連接來(lái)鏈接它們。
消息傳遞指的是程序之間通過(guò)在消息中發(fā)送數(shù)據(jù)進(jìn)行通信,而不是通過(guò)直接調(diào)用彼此來(lái)通信。
4.RabbiMQ模式
注意:RabbitMQ模式?概分為以下三種:
(1)單?模式 (一臺(tái)主機(jī)部署rabbitmq)
(2)普通模式 (默認(rèn)的集群模式)。
(3) 鏡像模式 (把需要的隊(duì)列做成鏡像隊(duì)列,存在于多個(gè)節(jié)點(diǎn),屬于RabbiMQ的HA?案,在對(duì)業(yè)務(wù)可靠性要求較?的場(chǎng)合中?較適?)。要實(shí)現(xiàn)鏡像模式,需要先搭建?個(gè)普通集群模式,在這個(gè)模式的基礎(chǔ)上再配置鏡像模式以實(shí)現(xiàn)?可?,在鏡像模式中設(shè)置策略可以將主rabbitmq中的數(shù)據(jù)同步到集群中其他節(jié)點(diǎn)里
一:基礎(chǔ)部署,集群里的主機(jī)都需要實(shí)施的操作
1,若有三臺(tái)服務(wù)器作為三個(gè)節(jié)點(diǎn),且都聯(lián)?,關(guān)閉防火墻,selinux,編輯域名解析/etc/hosts(ip與主機(jī)名稱(chēng)應(yīng)該對(duì)應(yīng)好,要不然容易影響實(shí)驗(yàn))
[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,三個(gè)節(jié)點(diǎn)配置安裝rabbitmq軟件
安裝依賴(lài):
[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
測(cè)試;
[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.啟動(dòng)
啟動(dòng)方式一:
[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
啟動(dòng)方式二:
[root@rabbitmq-1 ~]# /sbin/service rabbitmq-server status ---查看狀態(tài)
[root@rabbitmq-1 ~]# /sbin/service rabbitmq-server start ---啟動(dòng)
4,開(kāi)啟rabbitmq的web訪問(wèn)界面:
[root@rabbitmq-1 ~]# rabbitmq-plugins enable rabbitmq_management
5.創(chuàng)建用戶(hù):
注意:創(chuàng)建用戶(hù)只需要在一臺(tái)主機(jī)上添加就可以,即把誰(shuí)當(dāng)作管理員就在哪兒創(chuàng)建
(1)添加用戶(hù)和密碼誰(shuí)在
[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)查看用戶(hù)
[root@rabbitmq-1 ~]# rabbitmqctl list_users
Listing users ...
guest [administrator]
soho [administrator]
...done.
(4)權(quán)限
[root@rabbitmq-1 ~]# rabbitmqctl set_permissions -p "/" soho "." "." "."
Setting permissions for user "soho" in vhost "/" ...
...done.
此處設(shè)置權(quán)限時(shí)注意'.'之間需要有空格 三個(gè)'.*'分別代表了conf權(quán)限,read權(quán)限與write權(quán)限 例如:當(dāng)沒(méi)有給
soho設(shè)置這三個(gè)權(quán)限前是沒(méi)有權(quán)限查詢(xún)隊(duì)列,在ui界面也看不見(jiàn)
6,所有機(jī)器都操作:開(kāi)啟用戶(hù)遠(yuǎn)程登錄:
[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.三臺(tái)機(jī)器都操作重啟服務(wù)服務(wù):
[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server
查看端口 所有機(jī)器都操作:開(kāi)啟用戶(hù)遠(yuǎn)程登錄:
[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.三臺(tái)機(jī)器都操作重啟服務(wù)服務(wù):
[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server
查看端口
4369 -- erlang發(fā)現(xiàn)口
5672 --程序連接端口
15672 -- 管理界面ui端口
25672 -- server間內(nèi)部通信口
9,注意如果是云服務(wù)器,切記添加安全組端口放行。
web訪問(wèn):192.168.50.138:15672
這里需要注意:
rabbitmq默認(rèn)管理員用戶(hù):guest 密碼:guest
新添加的用戶(hù)為:soho 密碼:123
二,正式部署集群
1.首先創(chuàng)建好數(shù)據(jù)存放目錄和日志存放目錄
[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,創(chuàng)建配置文件:
[root@rabbitmq-1 ~]# vim /etc/rabbitmq/rabbitmq-env.conf (添加如下內(nèi)容)
RABBITMQ_MNESIA_BASE=/data/rabbitmq/data
RABBITMQ_LOG_BASE=/data/rabbitmq/logs
[root@rabbitmq-1 ~]# cat /etc/rabbitmq/rabbitmq-env.conf
3,重啟服務(wù)
[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server
4.拷?erlang.cookie
原因:集群中各節(jié)點(diǎn)是經(jīng)由?個(gè)cookie來(lái)實(shí)現(xiàn)的,所以必須保證各節(jié)點(diǎn)cookie?致,不然節(jié)點(diǎn)之間就?法通信.(cookie存放的位置:解壓縮方式安裝部署的rabbitmq存放于/home/.erlang.cookie。rpm等安裝包方式進(jìn)行安裝的/var/lib/rabbitmq)
[root@rabbitmq-1 ~]# cat /var/lib/rabbitmq/.erlang.cookie
HOUCUGJDZYTFZDSWXTHJ
?scp的?式將rabbitmq-1節(jié)點(diǎn)的.erlang.cookie的值復(fù)制到其他兩個(gè)節(jié)點(diǎn)中。
[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,查看集群狀態(tài),在任意節(jié)點(diǎn)上執(zhí)行 rabbitmqctl cluster_status來(lái)查看是否集群配置成功。
[root@rabbitmq-1 ~]# rabbitmqctl cluster_status
每臺(tái)機(jī)器顯示出三臺(tái)節(jié)點(diǎn),表示已經(jīng)添加成功!
5.登錄rabbitmq web管理控制臺(tái),創(chuàng)建新的隊(duì)列
打開(kāi)瀏覽器輸?http://192.168.50.138:15672,
輸?默認(rèn)的Username:guest
輸?默認(rèn)的Password:guest
根據(jù)界?提示創(chuàng)建?條隊(duì)列
++++++由以上RABBITMQ普通模式+鏡像模式+++++++++++++
三,添加鏡像模式的原因:
上面已經(jīng)完成RabbitMQ默認(rèn)集群模式,但并不保證隊(duì)列的高可用性,隊(duì)列內(nèi)容不會(huì)復(fù)制。如果隊(duì)列節(jié)點(diǎn)宕機(jī)直接導(dǎo)致該隊(duì)列無(wú)法應(yīng)用,只能等待重啟,所以要想在隊(duì)列節(jié)點(diǎn)宕機(jī)或故障也能正常應(yīng)用,就要復(fù)制隊(duì)列內(nèi)容到集群里的每個(gè)節(jié)點(diǎn),必須要?jiǎng)?chuàng)建鏡像隊(duì)列。 鏡像隊(duì)列是基于普通的集群模式的。
1,創(chuàng)建鏡像集群:三臺(tái)機(jī)器相同操作
rabbitmq set_policy :設(shè)置策略
[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,再次查看隊(duì)列已經(jīng)同步到其他兩臺(tái)節(jié)點(diǎn):
3,此時(shí)鏡像隊(duì)列設(shè)置成功。已經(jīng)部署完成,將所有隊(duì)列設(shè)置為鏡像隊(duì)列,即隊(duì)列會(huì)被復(fù)制到各個(gè)節(jié)點(diǎn),各個(gè)節(jié)點(diǎn)狀態(tài)保持一致。``
++++++++rabbitmq默認(rèn)的集群模式+鏡像模式+HA+負(fù)載均衡++++++++++++
RabbitMQ 高可用集群搭建完成,最后一個(gè)步驟就是搭建均衡器。
簡(jiǎn)單安裝并配置負(fù)載均衡器HA
注意:如果使用阿里云,可以使用阿里云的內(nèi)網(wǎng)slb來(lái)實(shí)現(xiàn)負(fù)載均衡,不用自己搭建HA。
安裝并配置負(fù)載均衡器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
#---------------------------------------------------------------------
##監(jiān)控查看本地狀態(tài)#####
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 (用戶(hù)+密碼)
stats refresh 30s
####################################
###反代監(jiān)控
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的狀態(tài)。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。