一:消息中間件的描述
1、簡介
消息中間件也可以稱消息隊列,是指用高效可靠的消息傳遞機制進行與平臺無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進行分布式系統(tǒng)的集成。通過提供消息傳遞和消息隊列模型,可以在分布式環(huán)境下擴展進程的通信。
當下主流的消息中間件有RabbitMQ、Kafka、ActiveMQ、RocketMQ等
站在用戶的角度思考問題,與客戶深入溝通,找到都江堰網(wǎng)站設(shè)計與都江堰網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋都江堰地區(qū)。
2、消息中間件主要作用
? 冗余(存儲)
? 擴展性
? 可恢復性
? 順序保證
? 緩沖
? 異步通信
? 削峰 :消息隊列中的常用場景,一般在秒殺或搶夠活動中使用廣泛。一般會因為流量過大,應(yīng)用系統(tǒng)配置承載不了這股瞬間流量,導致系統(tǒng)直接掛掉,即傳說中的“宕機”現(xiàn)象。為解決這個問題,我們會將那股巨大的流量拒在系統(tǒng)的上層,即將其轉(zhuǎn)移至 MQ 而不直接涌入我們的接口。
二.消息隊列之一RabbiMQ簡介
1, RabbiMQ是?Erang開發(fā)的,集群?常?便,因為Erlang天?就是??分布式語?,但其本身并不?持負載均衡,支持高并發(fā),支持可擴展。支持AJAX,持久化,用于在分布式系統(tǒng)中存儲轉(zhuǎn)發(fā)消息,在易用性、擴展性、高可用性等方面表現(xiàn)不俗。
2, RabbiMQ的特點
? 可靠性
? 擴展性
? 高可用性
? 多種協(xié)議
? 多語言客戶端
? 管理界面
? 插件機制
3.什么是消息隊列
MQ 全稱為Message Queue, 消息隊列。是一種應(yīng)用程序?qū)?yīng)用程序的通信方法。應(yīng)用程序通過讀寫出入隊列的消息(針對應(yīng)用程序的數(shù)據(jù))來通信,而無需專用連接來鏈接它們。
消息傳遞指的是程序之間通過在消息中發(fā)送數(shù)據(jù)進行通信,而不是通過直接調(diào)用彼此來通信。
4.RabbiMQ模式
注意:RabbitMQ模式?概分為以下三種:
(1)單?模式 (一臺主機部署rabbitmq)
(2)普通模式 (默認的集群模式)。
(3) 鏡像模式 (把需要的隊列做成鏡像隊列,存在于多個節(jié)點,屬于RabbiMQ的HA?案,在對業(yè)務(wù)可靠性要求較?的場合中?較適?)。要實現(xiàn)鏡像模式,需要先搭建?個普通集群模式,在這個模式的基礎(chǔ)上再配置鏡像模式以實現(xiàn)?可?,在鏡像模式中設(shè)置策略可以將主rabbitmq中的數(shù)據(jù)同步到集群中其他節(jié)點里
一:基礎(chǔ)部署,集群里的主機都需要實施的操作
1,若有三臺服務(wù)器作為三個節(jié)點,且都聯(lián)?,關(guān)閉防火墻,selinux,編輯域名解析/etc/hosts(ip與主機名稱應(yīng)該對應(yīng)好,要不然容易影響實驗)
[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,三個節(jié)點配置安裝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 ---查看狀態(tài)
[root@rabbitmq-1 ~]# /sbin/service rabbitmq-server start ---啟動
4,開啟rabbitmq的web訪問界面:
[root@rabbitmq-1 ~]# rabbitmq-plugins enable rabbitmq_management
5.創(chuàng)建用戶:
注意:創(chuàng)建用戶只需要在一臺主機上添加就可以,即把誰當作管理員就在哪兒創(chuàng)建
(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)權(quán)限
[root@rabbitmq-1 ~]# rabbitmqctl set_permissions -p "/" soho "." "." "."
Setting permissions for user "soho" in vhost "/" ...
...done.
此處設(shè)置權(quán)限時注意'.'之間需要有空格 三個'.*'分別代表了conf權(quán)限,read權(quán)限與write權(quán)限 例如:當沒有給
soho設(shè)置這三個權(quán)限前是沒有權(quán)限查詢隊列,在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.三臺機器都操作重啟服務(wù)服務(wù):
[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.三臺機器都操作重啟服務(wù)服務(wù):
[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server
查看端口
4369 -- erlang發(fā)現(xiàn)口
5672 --程序連接端口
15672 -- 管理界面ui端口
25672 -- server間內(nèi)部通信口
9,注意如果是云服務(wù)器,切記添加安全組端口放行。
web訪問:192.168.50.138:15672
這里需要注意:
rabbitmq默認管理員用戶:guest 密碼:guest
新添加的用戶為: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é)點是經(jīng)由?個cookie來實現(xiàn)的,所以必須保證各節(jié)點cookie?致,不然節(jié)點之間就?法通信.(cookie存放的位置:解壓縮方式安裝部署的rabbitmq存放于/home/.erlang.cookie。rpm等安裝包方式進行安裝的/var/lib/rabbitmq)
[root@rabbitmq-1 ~]# cat /var/lib/rabbitmq/.erlang.cookie
HOUCUGJDZYTFZDSWXTHJ
?scp的?式將rabbitmq-1節(jié)點的.erlang.cookie的值復制到其他兩個節(jié)點中。
[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é)點上執(zhí)行 rabbitmqctl cluster_status來查看是否集群配置成功。
[root@rabbitmq-1 ~]# rabbitmqctl cluster_status
每臺機器顯示出三臺節(jié)點,表示已經(jīng)添加成功!
5.登錄rabbitmq web管理控制臺,創(chuàng)建新的隊列
打開瀏覽器輸?http://192.168.50.138:15672,
輸?默認的Username:guest
輸?默認的Password:guest
根據(jù)界?提示創(chuàng)建?條隊列
++++++由以上RABBITMQ普通模式+鏡像模式+++++++++++++
三,添加鏡像模式的原因:
上面已經(jīng)完成RabbitMQ默認集群模式,但并不保證隊列的高可用性,隊列內(nèi)容不會復制。如果隊列節(jié)點宕機直接導致該隊列無法應(yīng)用,只能等待重啟,所以要想在隊列節(jié)點宕機或故障也能正常應(yīng)用,就要復制隊列內(nèi)容到集群里的每個節(jié)點,必須要創(chuàng)建鏡像隊列。 鏡像隊列是基于普通的集群模式的。
1,創(chuàng)建鏡像集群:三臺機器相同操作
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,再次查看隊列已經(jīng)同步到其他兩臺節(jié)點:
3,此時鏡像隊列設(shè)置成功。已經(jīng)部署完成,將所有隊列設(shè)置為鏡像隊列,即隊列會被復制到各個節(jié)點,各個節(jié)點狀態(tài)保持一致。``
++++++++rabbitmq默認的集群模式+鏡像模式+HA+負載均衡++++++++++++
RabbitMQ 高可用集群搭建完成,最后一個步驟就是搭建均衡器。
簡單安裝并配置負載均衡器HA
注意:如果使用阿里云,可以使用阿里云的內(nèi)網(wǎng)slb來實現(xiàn)負載均衡,不用自己搭建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
#---------------------------------------------------------------------
##監(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 (用戶+密碼)
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)。