1. 消息隊列
1.1. MQ 的相關概念
1.1.1. 什么是MQ
-
MQ(message queue)
,從字面意思上看,本質是個隊列,F(xiàn)IFO 先入先出,只不過隊列中存放的內容是message 而已,還是一種跨進程的通信機制,用于上下游傳遞消息。在互聯(lián)網(wǎng)架構中,MQ 是一種非常常見的上下游“邏輯解耦+物理解耦”的消息通信服務。使用了 MQ 之后,消息發(fā)送上游只需要依賴 MQ,不用依賴其他服務。
1.1.2. 為什么要用 MQ
1. 流量消峰
- 舉個例子,如果訂單系統(tǒng)最多能處理一萬次訂單,這個處理能力應付正常時段的下單時綽綽有余,正常時段我們下單一秒后就能返回結果。但是在高峰期,如果有兩萬次下單操作系統(tǒng)是處理不了的,只能限制訂單超過一萬后不允許用戶下單。使用消息隊列做緩沖,我們可以取消這個限制,把一秒內下的訂單分散成一段時間來處理,這時有些用戶可能在下單十幾秒后才能收到下單成功的操作,但是比不能下單的體驗要好。
2. 應用解耦
- 以電商應用為例,應用中有訂單系統(tǒng)、庫存系統(tǒng)、物流系統(tǒng)、支付系統(tǒng)。用戶創(chuàng)建訂單后,如果耦合調用庫存系統(tǒng)、物流系統(tǒng)、支付系統(tǒng),任何一個子系統(tǒng)出了故障,都會造成下單操作異常。當轉變成基于消息隊列的方式后,系統(tǒng)間調用的問題會減少很多,比如物流系統(tǒng)因為發(fā)生故障,需要幾分鐘來修復。在這幾分鐘的時間里,物流系統(tǒng)要處理的內存被緩存在消息隊列中,用戶的下單操作可以正常完成。當物流系統(tǒng)恢復后,繼續(xù)處理訂單信息即可,中單用戶感受不到物流系統(tǒng)的故障,提升系統(tǒng)的可用性。
3. 異步處理
- 有些服務間調用是異步的,例如 A 調用 B,B 需要花費很長時間執(zhí)行,但是 A 需要知道 B 什么時候可以執(zhí)行完,以前一般有兩種方式,A 過一段時間去調用 B 的查詢 api 查詢?;蛘?A 提供一個 callback api,B 執(zhí)行完之后調用 api 通知 A 服務。這兩種方式都不是很優(yōu)雅,使用消息總線,可以很方便解決這個問題,A 調用 B 服務后,只需要監(jiān)聽 B 處理完成的消息,當 B 處理完成后,會發(fā)送一條消息給 MQ,MQ 會將此消息轉發(fā)給 A 服務。這樣 A 服務既不用循環(huán)調用 B 的查詢 api,也不用提供 callback api。同樣 B 服務也不用做這些操作。A 服務還能及時的得到異步處理成功的消息。
1.1.3. MQ 的分類
1. ActiveMQ
- 優(yōu)點:單機吞吐量萬級,時效性 ms 級,可用性高,基于主從架構實現(xiàn)高可用性,消息可靠性較低的概率丟失數(shù)據(jù)。
- 缺點:官方社區(qū)現(xiàn)在對 ActiveMQ 5.x 維護越來越少,高吞吐量場景較少使用。
2. Kafka
- 大數(shù)據(jù)的殺手锏,談到大數(shù)據(jù)領域內的消息傳輸,則繞不開 Kafka,這款為大數(shù)據(jù)而生的消息中間件,以其百萬級 TPS 的吞吐量名聲大噪,迅速成為大數(shù)據(jù)領域的寵兒,在數(shù)據(jù)采集、傳輸、存儲的過程中發(fā)揮著舉足輕重的作用。目前已經(jīng)被 LinkedIn,Uber, Twitter, Netflix 等大公司所采納。
- 優(yōu)點: 性能卓越,單機寫入 TPS 約在百萬條/秒,最大的優(yōu)點,就是吞吐量高。時效性 ms 級可用性非常高,kafka 是分布式的,一個數(shù)據(jù)多個副本,少數(shù)機器宕機,不會丟失數(shù)據(jù),不會導致不可用,消費者采用 Pull 方式獲取消息, 消息有序, 通過控制能夠保證所有消息被消費且僅被消費一次;有優(yōu)秀的第三方Kafka Web 管理界面 Kafka-Manager;在日志領域比較成熟,被多家公司和多個開源項目使用;功能支持:功能較為簡單,主要支持簡單的 MQ 功能,在大數(shù)據(jù)領域的實時計算以及日志采集被大規(guī)模使用
- 缺點:Kafka 單機超過 64 個隊列/分區(qū),Load 會發(fā)生明顯的飆高現(xiàn)象,隊列越多,load 越高,發(fā)送消息響應時間變長,使用短輪詢方式,實時性取決于輪詢間隔時間,消費失敗不支持重試;支持消息順序,但是一臺代理宕機后,就會產(chǎn)生消息亂序,社區(qū)更新較慢;
3. RocketMQ
-
RocketMQ 出自阿里巴巴的開源產(chǎn)品,用 Java 語言實現(xiàn),在設計時參考了 Kafka,并做出了自己的一些改進。被阿里巴巴廣泛應用在訂單,交易,充值,流計算,消息推送,日志流式處理,binglog 分發(fā)等場景。
-
優(yōu)點:單機吞吐量十萬級,可用性非常高,分布式架構,消息可以做到 0 丟失,MQ 功能較為完善,還是分布式的,擴展性好,支持 10 億級別的消息堆積,不會因為堆積導致性能下降,源碼是 java 我們可以自己閱讀源碼,定制自己公司的 MQ。
-
缺點:支持的客戶端語言不多,目前是 java 及 c++,其中 c++不成熟;社區(qū)活躍度一般,沒有在 MQ核心中去實現(xiàn) JMS 等接口,有些系統(tǒng)要遷移需要修改大量代碼。
4. RabbitMQ
-
2007 年發(fā)布,是一個在 AMQP(高級消息隊列協(xié)議)基礎上完成的,可復用的企業(yè)消息系統(tǒng),是當前最主流的消息中間件之一。
-
優(yōu)點:由于 erlang 語言的高并發(fā)特性,性能較好;吞吐量到萬級,MQ 功能比較完備,健壯、穩(wěn)定、易用、跨平臺、支持多種語言 如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持 AJAX 文檔齊全;開源提供的管理界面非常棒,用起來很好用,社區(qū)活躍度高;更新頻率相當高
-
https://www.rabbitmq.com/news.html。
-
缺點:商業(yè)版需要收費,學習成本較高。
1.1.4. MQ 的選擇
1. Kafka
- Kafka 主要特點是基于 Pull 的模式來處理消息消費,追求高吞吐量,一開始的目的就是用于日志收集和傳輸,適合產(chǎn)生大量數(shù)據(jù)的互聯(lián)網(wǎng)服務的數(shù)據(jù)收集業(yè)務。大型公司建議可以選用,如果有日志采集功能,肯定是首選 kafka 了。
2. RocketMQ
- 天生為金融互聯(lián)網(wǎng)領域而生,對于可靠性要求很高的場景,尤其是電商里面的訂單扣款,以及業(yè)務削峰,在大量交易涌入時,后端可能無法及時處理的情況。RoketMQ 在穩(wěn)定性上可能更值得信賴,這些業(yè)務場景在阿里雙 11 已經(jīng)經(jīng)歷了多次考驗,如果你的業(yè)務有上述并發(fā)場景,建議可以選擇 RocketMQ。
3. RabbitMQ
- 結合 erlang 語言本身的并發(fā)優(yōu)勢,性能好時效性微秒級,社區(qū)活躍度也比較高,管理界面用起來十分方便,如果你的數(shù)據(jù)量沒有那么大,中小型公司優(yōu)先選擇功能比較完備的 RabbitMQ。
1.2. RabbitMQ
1.2.1. RabbitMQ 的概念
- RabbitMQ 是一個消息中間件:它接受并轉發(fā)消息。你可以把它當做一個快遞站點,當你要發(fā)送一個包裹時,你把你的包裹放到快遞站,快遞員最終會把你的快遞送到收件人那里,按照這種邏輯 RabbitMQ 是一個快遞站,一個快遞員幫你傳遞快件。RabbitMQ 與快遞站的主要區(qū)別在于,它不處理快件而是接收,存儲和轉發(fā)消息數(shù)據(jù)。
1.2.2. 四大核心概念
-
生產(chǎn)者
- 產(chǎn)生數(shù)據(jù)發(fā)送消息的程序是生產(chǎn)者
-
交換機
- 交換機是 RabbitMQ 非常重要的一個部件,一方面它接收來自生產(chǎn)者的消息,另一方面它將消息推送到隊列中。交換機必須確切知道如何處理它接收到的消息,是將這些消息推送到特定隊列還是推送到多個隊列,亦或者是把消息丟棄,這個得有交換機類型決定。
-
隊列
- 隊列是 RabbitMQ 內部使用的一種數(shù)據(jù)結構,盡管消息流經(jīng) RabbitMQ 和應用程序,但它們只能存儲在隊列中。隊列僅受主機的內存和磁盤限制的約束,本質上是一個大的消息緩沖區(qū)。許多生產(chǎn)者可以將消息發(fā)送到一個隊列,許多消費者可以嘗試從一個隊列接收數(shù)據(jù)。這就是我們使用隊列的方式。
-
消費者
- 消費與接收具有相似的含義。消費者大多時候是一個等待接收消息的程序。請注意生產(chǎn)者,消費者和消息中間件很多時候并不在同一機器上。同一個應用程序既可以是生產(chǎn)者又是可以是消費者。
1.2.3. RabbitMQ 核心部分
1.2.4. 各個名詞介紹
-
Broker:接收和分發(fā)消息的應用,RabbitMQ Server 就是 Message Broker。
-
Virtual host:出于多租戶和安全因素設計的,把 AMQP 的基本組件劃分到一個虛擬的分組中,類似于網(wǎng)絡中的 namespace 概念。當多個不同的用戶使用同一個 RabbitMQ server 提供的服務時,可以劃分出多個 vhost,每個用戶在自己的 vhost 創(chuàng)建 exchange/queue 等。
-
Connection:publisher/consumer 和 broker 之間的 TCP 連接。
-
Channel:如果每一次訪問 RabbitMQ 都建立一個 Connection,在消息量大的時候建立 TCP Connection 的開銷將是巨大的,效率也較低。Channel 是在 connection 內部建立的邏輯連接,如果應用程序支持多線程,通常每個 thread 創(chuàng)建單獨的 channel 進行通訊,AMQP method 包含了 channel id 幫助客戶端和 message broker 識別 channel,所以 channel 之間是完全隔離的。Channel 作為輕量級的Connection 極大減少了操作系統(tǒng)建立 TCP connection 的開銷。
-
Exchange:message 到達 broker 的第一站,根據(jù)分發(fā)規(guī)則,匹配查詢表中的 routing key,分發(fā)消息到 queue 中去。常用的類型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)。
-
Queue:消息最終被送到這里等待 consumer 取走。
-
Binding:exchange 和 queue 之間的虛擬連接,binding 中可以包含 routing key,Binding 信息被保存到 exchange 中的查詢表中,用于 message 的分發(fā)依據(jù)。
2. Rabbitmq單機安裝部署
- 官網(wǎng)地址:https://www.rabbitmq.com/download.html
#準備gpgkey密鑰
rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
rpm --import https://packagecloud.io/rabbitmq/erlang/gpgkey
rpm --import https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
#配置yum倉庫
vim /etc/yum.repos.d/rabbitmq.repo
[rabbitmq_erlang]
name=rabbitmq_erlang
baseurl=https://packagecloud.io/rabbitmq/erlang/el/7/$basearch
repo_gpgcheck=1
gpgcheck=1
enabled=1
# PackageCloud's repository key and RabbitMQ package signing key
gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey
https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
[rabbitmq_erlang-source]
name=rabbitmq_erlang-source
baseurl=https://packagecloud.io/rabbitmq/erlang/el/7/SRPMS
repo_gpgcheck=1
gpgcheck=0
enabled=1
# PackageCloud's repository key and RabbitMQ package signing key
gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey
https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
##
## RabbitMQ server
##
[rabbitmq_server]
name=rabbitmq_server
baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/7/$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
# PackageCloud's repository key and RabbitMQ package signing key
gpgkey=https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
[rabbitmq_server-source]
name=rabbitmq_server-source
baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/7/SRPMS
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
#安裝rabbitmq和erlang
yum -y install erlang rabbitmq-server-3.9.15
systemctl start rabbitmq-server.service
systemctl enable rabbitmq-server.service
#安裝 RabbitMQ Web 插件
rabbitmq-plugins enable rabbitmq_management
systemctl restart rabbitmq-server
#創(chuàng)建賬號密碼并設置用戶的權限
rabbitmqctl add_user ys ys1234
rabbitmqctl set_permissions -p / ys ".*" ".*" ".*"
#創(chuàng)建web管理用戶
rabbitmqctl add_user admin admin1234
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
2.1. 訪問rabbitmq管理界面
3. RabbitMQ 集群
3.1. 使用集群的原因:
- 前面介紹了如何安裝及運行 RabbitMQ 服務,不過這些是單機版的,無法滿足目前真實應用的要求。如果 RabbitMQ 服務器遇到內存崩潰、機器掉電或者主板故障等情況,該怎么辦?單臺 RabbitMQ服務器可以滿足每秒 1000 條消息的吞吐量,那么如果應用需要 RabbitMQ 服務滿足每秒 10 萬條消息的吞吐量呢?購買昂貴的服務器來增強單機 RabbitMQ 務的性能顯得捉襟見肘,搭建一個 RabbitMQ 集群才是解決實際問題的關鍵。
3.2. Rabbitmq集群安裝部署
- RabbitMQ支持高可用性和可擴展性的集群部署。在RabbitMQ集群中,至少需要3個節(jié)點來確保高可用性和數(shù)據(jù)冗余。
- 主機
主機名 | IP地址 |
---|---|
node1 | 192.168.10.10 |
node2 | 192.168.10.20 |
node3 | 192.168.10.30 |
3.2.1. 修改主機名
#3臺主機操作一樣
#添加hosts解析
vim /etc/hosts
192.168.10.10 node1
192.168.10.20 node2
192.168.10.30 node3
#修改主機名
#每個節(jié)點執(zhí)行這條命令即可,注意這條命令網(wǎng)卡名需要根據(jù)實際情況填寫
hostname `cat /etc/hosts|grep $(ifconfig ens33|grep broadcast|awk '{print $2}')|awk '{print $2}'`;su
3.2.2. 以確保各個節(jié)點的 cookie 文件使用的是同一個值
- 在 node1 上執(zhí)行遠程操作命令
scp -r /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
3.2.3. 在node2、node3啟動服務
systemctl start rabbitmq-server.service
3.2.4. 在node2節(jié)點執(zhí)行以下操作
#rabbitmqctl stop 會將 Erlang 虛擬機關閉,rabbitmqctl stop_app 只關閉 RabbitMQ 服務
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node1
rabbitmqctl start_app
3.2.5. 在node3節(jié)點執(zhí)行以下操作
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node2
rabbitmqctl start_app
3.2.6. 查看集群狀態(tài):
rabbitmqctl cluster_status
3.2.7. 解除集群節(jié)點(node2 和 node3 機器分別執(zhí)行)
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
rabbitmqctl cluster_status
rabbitmqctl forget_cluster_node rabbit@node2(node1 機器上執(zhí)行)
3.3. 鏡像隊列
3.3.1. 使用鏡像的原因
- 如果 RabbitMQ 集群中只有一個 Broker 節(jié)點,那么該節(jié)點的失效將導致整體服務的臨時性不可用,并且也可能會導致消息的丟失??梢詫⑺邢⒍荚O置為持久化,并且對應隊列的durable屬性也設置為true,但是這樣仍然無法避免由于緩存導致的問題:因為消息在發(fā)送之后和被寫入磁盤井執(zhí)行刷盤動作之間存在一個短暫卻會產(chǎn)生問題的時間窗。通過 publisherconfirm 機制能夠確??蛻舳酥滥男┫⒓航?jīng)存入磁盤,盡管如此,一般不希望遇到因單點故障導致的服務不可用。
- 引入鏡像隊列(Mirror Queue)的機制,可以將隊列鏡像到集群中的其他 Broker 節(jié)點之上,如果集群中的一個節(jié)點失效了,隊列能自動地切換到鏡像中的另一個節(jié)點上以保證服務的可用性。
3.3.2. 搭建步驟
-
登錄rabbitmq管理界面
文章來源:http://www.zghlxwxcb.cn/news/detail-798564.html
-
點擊admin–>Policies添加以下內容:
文章來源地址http://www.zghlxwxcb.cn/news/detail-798564.html
4. Haproxy+Keepalive 實現(xiàn)高可用負載均衡
- 整體架構圖
4.1. Haproxy 實現(xiàn)負載均衡
- HAProxy 提供高可用性、負載均衡及基于 TCPHTTP 應用的代理,支持虛擬主機,它是免費、快速并且可靠的一種解決方案,包括 Twitter,Reddit,StackOverflow,GitHub 在內的多家知名互聯(lián)網(wǎng)公司在使用。HAProxy 實現(xiàn)了一種事件驅動、單一進程模型,此模型支持非常大的井發(fā)連接數(shù)。
4.2. 搭建步驟
# 10.40、10.50安裝軟件
yum -y install haproxy keepalived
#修改 10.40、10.50 的 haproxy.cfg
vim /etc/haproxy/haproxy.cfg
global
#定義了haproxy的日志輸出方式,這里使用了local0和local1兩個facility,其中l(wèi)ocal0表示輸出到syslog的local0日志文件中
#local1表示輸出到syslog的local1日志文件中,級別為notice。
log /dev/log local0
log /dev/log local1 notice
pidfile /var/run/haproxy.pid #定義了haproxy進程的pid文件路徑
chroot /var/lib/haproxy #定義了haproxy要使用的chroot目錄,這里使用了/var/lib/haproxy
#定義了haproxy的統(tǒng)計信息socket文件路徑和權限,這里指定了/var/run/haproxy-admin.sock,權限為660,級別為admin
stats socket /var/run/haproxy-admin.sock mode 660 level admin
stats timeout 30s #定義了haproxy統(tǒng)計信息的超時時間,這里設置為30秒
#定義了haproxy進程要使用的用戶和組,這里使用了haproxy用戶和haproxy組
user haproxy
group haproxy
daemon #定義了haproxy以守護進程方式運行
nbproc 1 #定義了haproxy的工作進程數(shù),這里設置為1
defaults
log global #定義了默認的日志輸出方式,這里使用了global,表示使用全局日志配置
timeout connect 5000 #定義了連接超時時間,這里設置為5000毫秒
timeout client 10m #定義了客戶端超時時間,這里設置為10分鐘
timeout server 10m #定義了服務器超時時間,這里設置為10分鐘
listen admin_stats
bind 0.0.0.0:10080 #定義了監(jiān)聽地址和端口,這里使用了0.0.0.0:10080,表示監(jiān)聽所有IP地址的10080端口
mode http #定義了監(jiān)聽模式,這里使用了http模式
log 127.0.0.1 local0 err #定義了日志輸出方式,這里將日志輸出到127.0.0.1的local0設備,級別為err
stats refresh 30s #定義了統(tǒng)計信息刷新時間,這里設置為30秒
stats uri /status #定義了統(tǒng)計信息頁面的URI,這里設置為/status
stats realm welcome login\ Haproxy #定義了統(tǒng)計信息頁面的realm,這里設置為"welcome login Haproxy"
stats auth admin:123456 #定義了統(tǒng)計信息頁面的用戶名和密碼,這里設置為admin和123456
stats hide-version #定義了是否隱藏haproxy的版本信息,這里設置為隱藏
stats admin if TRUE #定義了是否啟用統(tǒng)計信息頁面的管理功能,這里設置為啟用
listen rabbitmq
bind 0.0.0.0:5672 #定義了監(jiān)聽地址和端口,這里使用了0.0.0.0:8443,表示監(jiān)聽所有IP地址的8443端口
mode tcp #定義了監(jiān)聽模式,這里使用了tcp模式
option tcplog #定義了是否啟用TCP日志記錄,這里設置為啟用
balance source #定義了負載均衡算法,這里使用了source算法
#定義了后端服務器,這里定義了三個服務器,分別是master1、master2和master3
#它們的IP地址和端口分別為192.168.2.10:5672、192.168.2.20:5672和192.168.2.30:5672
#check表示啟用健康檢查,inter 2000表示每2秒進行一次健康檢查
#fall 2表示檢查失敗的閾值為2,rise 2表示檢查成功的閾值為2,weight 1表示權重為1
server node1 192.168.10.10:5672 check inter 2000 fall 2 rise 2 weight 1
server node2 192.168.10.20:5672 check inter 2000 fall 2 rise 2 weight 1
server node3 192.168.10.30:5672 check inter 2000 fall 2 rise 2 weight 1
listen rabbitmq_web
bind 0.0.0.0:15672 #定義了監(jiān)聽地址和端口,這里使用了0.0.0.0:8443,表示監(jiān)聽所有IP地址的8443端口
mode tcp #定義了監(jiān)聽模式,這里使用了tcp模式
option tcplog #定義了是否啟用TCP日志記錄,這里設置為啟用
balance source #定義了負載均衡算法,這里使用了source算法
server node1 192.168.10.10:15672 check inter 2000 fall 2 rise 2 weight 1
server node2 192.168.10.20:15672 check inter 2000 fall 2 rise 2 weight 1
server node3 192.168.10.30:15672 check inter 2000 fall 2 rise 2 weight 1
- 啟動haproxy
systemctl start haproxy.service
systemctl enable haproxy.service
4.3. 配置keepalived
#10.40修改配置文件keepalived.conf
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { #全局定義部分,用于設置全局參數(shù)
notification_email { #設置通知郵件的收件人郵箱
yangshuangsxy@163.com
}
notification_email_from root@localhost #設置通知郵件的發(fā)件人郵箱
smtp_server 127.0.0.1 #設置 SMTP 服務器的地址
smtp_connect_timeout 30 #設置 SMTP 連接超時時間
router_id LVS_DEVEL #設置路由器的標識符
}
vrrp_script chk_haproxy { #定義一個 VRRP 腳本,用于檢查 HAProxy 的狀態(tài)
script "/data/sh/check_haproxy.sh" #指定要執(zhí)行的腳本路徑
interval 2 #設置腳本執(zhí)行的間隔時間
weight 2 #設置腳本的權重
}
# VIP1
vrrp_instance VI_1 { #定義一個 VRRP 實例
state MASTER #設置實例的狀態(tài),可以是 MASTER 或 BACKUP
interface ens33 #指定 VRRP 實例綁定的網(wǎng)絡接口
virtual_router_id 51 #設置虛擬路由器的 ID
priority 100 #設置實例的優(yōu)先級
advert_int 5 #設置 VRRP 廣告間隔時間
nopreempt #禁止搶占模式,即不允許備用節(jié)點搶占主節(jié)點
authentication { #設置認證參數(shù)
auth_type PASS #設置認證類型,可以是 PASS 或 AH
auth_pass 1111 #設置認證密碼
}
virtual_ipaddress { #設置虛擬 IP 地址
192.168.10.100
}
track_script { #設置要跟蹤的腳本
chk_haproxy
}
}
#10.50修改配置文件keepalived.conf如下:
state BACKUP
priority 90
#其他的配置文件內容和上面的一樣
4.4. 創(chuàng)建檢測腳本,10.40和10.50都執(zhí)行以下操作
# 檢測是否安裝psmisc,如果沒有安裝,需要安裝
rpm -qa | grep psmisc
psmisc-22.20-17.el7.x86_64
vim /data/sh/check_haproxy.sh
#!/bin/bash
#auto check nginx process
#2024年1月16日15:16:29
#by author XiaoYuEr
killall -0 haproxy
if [[ $? -ne 0 ]];then
service keepalived stop
fi
#添加執(zhí)行權限
chmod +x /data/sh/check_haproxy.sh
4.5. 啟動服務,并驗證
systemctl restart haproxy.service
systemctl enable haproxy.service
systemctl restart keepalived.service
systemctl enable keepalived.service
#在10.40主機上驗證:
ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:de:b6:0a brd ff:ff:ff:ff:ff:ff
inet 192.168.10.40/16 brd 192.168.255.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.10.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::3cd3:afe6:494b:44e6/64 scope link noprefixroute
valid_lft forever preferred_lft forever
到了這里,關于消息中間件RabbitMQ的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!