除了HAProxy,RabbitMQ集群還可以這樣用

2020-12-12 咔咔侃技術

全網最簡單的安裝手冊

// 安裝erlangwget https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.shbash script.rpm.shsudo yum install erlang// 安裝rabbitmq 3.7 版本wget https://antsentry-cloud-firmware.s3.cn-northwest-1.amazonaws.com.cn/raspberrypy/rabbitmq-server-3.7.26-1.el7.noarch.rpmsudo yum install rabbitmq-server-3.7.26-1.el7.noarch.rpmsudo service rabbitmq-server start

配置用戶

rabbitmqctl add_user username passwd // 添加用戶rabbitmqctl set_user_tags username administrator // 給用戶分配權限rabbitmqctl list_users // 查看系統中有哪些用戶

啟用web控制臺

sudo rabbitmq-plugins list // 查看啟用了哪些插件sudo rabbitmq-plugins enable rabbitmq_management // 啟用Web管理界面,默認埠是15672

經過上述幾個步驟,打開瀏覽器,輸入伺服器的ip和埠,就能看到久違的登錄界面了。

配置集群

至少需要兩個節點才能組成集群,簡單起見,就選兩臺啦。在另一臺服務上,重複上面的安裝過程,配置用戶和管理界面步驟可以略過。

複製前一臺伺服器上的cookie到新安裝的這臺伺服器,cookie所在目錄為:/var/lib/rabbitmq/.erlang.cookie。

Tips:如果copy,需要注意.erlang.cookie文件的權限必須是400。同時,不要用vim編輯器編輯,會留下換行符導致cookie不一致。cookie文件的大小為20位元組。上述兩個小問題,確實困擾了筆者挺長時間,導致安裝不成功。

sudo rabbitmqctl cluster_status // 查看集群狀態sudo rabbitmqctl stop_app // 停止appsudo rabbitmqctl join_cluster rabbit@ip-10-0-5-62 // 把當前節點添加到集群中sudo rabbitmqctl start_app // 啟動app

通過簡單的幾步,這兩臺伺服器已經組成集群了。登錄web控制臺,效果如下:

節點之間同步配置信息,關於集群的特點,這是最正確的描述。其他的一些特性,都是可配置的,例如內存節點、磁碟節點;鏡像模式等;持久化等等。在可用性和性能之間,用不同的配置,做相應的取捨。

代理中間件

在上一章節中介紹了集群的安裝,縱觀網上絕大多數的教程,到這裡並沒有結束,還有很重要的一步,那就是HAProxy+KeepAlived。筆者並沒有研究過HAProxy,更別提KeepAlive了,看到這樣的東東一臉懵逼。好在業務運行在雲上,雲服務上有TCP層的負載均衡(LB)組件,用LB代替HAProxy+KeepAlive是一樣的。結構如下:

從體系結構的角度考慮,集群中的節點是對等的,即客戶端連接任意一個節點都能正常工作,因為只有這樣,我們才能用粗暴的負載均衡器做代理。

從實現的細節看,也卻是如此。對生產者來說,發送給那個節點並不重要,路由到相應的queue master節點存儲即可。消費者若是連接到了master節點,直接取數據即可;如果連接到非master節點,創建一個master節點到目標節點的通道傳輸數據。

在軟體架構實踐中,這是非常普遍的一種模式,例如調用微服務的多個實例、例如訪問某個域名對應的多個IP位址,例如eureka註冊中心等,有些用了中心化的代理中間件,有些則是在客戶端實現的。同樣的道理,訪問rabbitmq集群,除了常見的代理中間件,也可採用客戶端代理實現。

客戶端代理

支持多個地址

通常,初始化ConnectionFactory只能接受一個地址。這麼看來,用官方SDK完成客戶端代理,要重寫基礎的訪問組件了,這條路肯定是沒有錯的,就像sharding-jdbc。仔細研究官方提供的API文檔,ConnnectionFactory有個newConnection函數,是可以傳入一個地址列表的,實現邏輯如下

factory.newConnection(addresses);

根據地址列表依次創建連接,直到創建成功為止。Tips:這段代碼並不優雅,如果直接用到這段代碼,會客戶端都連接到第一個正常的節點。

恢復連接

ConnectFactory個重要的功能,那就是自動恢復連接,代碼很簡單,在4.0版本以後是默認開啟的。按照官方的解釋,在連接失敗後,可以做到打開連接、恢復連接上的listeners、重新創建channel、恢復channel上的listeners以及配置信息。

factory.setAutomaticRecoveryEnabled(true);結合這兩個特性,經測試,集群中的節點宕機後,確實可以重新連接到另一個節點。但是,中間有一段時間連接是中斷的,生產者發送消息,會連續失敗!

補丁

為了解決這個問題,在生產者增加重試機制,問題得到解決。發送消息失敗後,要等待創建連接和channel,重新發送消息。

public void send(String exchange, MQMessage message) {try { sentMsg(exchange, message); } catch (Exception ex) { connnect(); }}

到此為止,驗證了通過客戶端代理模式訪問rabbitmq集群。但是,筆者在生產中真不敢這麼用。

相關焦點

  • 一種RabbitMQ網絡分區問題的解決方案
    中心節點」每次檢測結束會遠程各個節點生成狀態文件,xinted將狀態文件暴露出49203服務埠供haproxy進行判斷,通過haproxy實時反饋狀態結果。最後通過Keepalived來實現主備的監控切換。
  • 在K8S上部署rabbitmq集群-有狀態服務
    如果在商品服務和訂單服務之間使用消息中間件,既可以提高並發量,又降低服務之間的耦合度。RabbitMQ就是這樣一款我們苦苦追尋的消息隊列。RabbitMQ是一個開源的消息代理的隊列伺服器,用來通過普通協議在完全不同的應用之間共享數據。
  • 消息隊列:Rabbitmq如何保證不丟消息
    於是便整理了這篇文章來跟大家分享下,自己的理解,如有不準確的地方或者不同的意見,還請各位能夠給出反饋,我們可以討論,相互學習,相互成長。對於生產者來說,為了方便確認消息有沒有真正到達rabbitmq端,還需要在生產者端設置超時重發,畢竟網絡裡面是可能丟失消息的。
  • 詳解SpringCloud中RabbitMQ消息隊列原理及配置,一篇就夠!
    所以rabbitmq的依賴可以在spring cloud中直接使用。中,存儲的消息可以是任意的java類型的對象。 * 方便開發,一個類中可以定義若干個listener邏輯。 * 方法定義規範可能不合理。如:一個方法的處理邏輯太多,造成方法的bad smell。 * * @RabbitListener - 代表當前類型是一個rabbitmq的監聽器。
  • 常見Rabbitmq面試題及答案總結
    11、 RabbitMQ 的集群鏡像集群模式你創建的queue,無論元數據還是queue裡的消息都會存在於多個實例上,然後每 次你寫消息到queue的時候,都會自動把消息到多個實例的queue裡進行消息同 步。
  • PPT中的smart還可以這樣用,你知道了嗎?
    我們都知道PPT中的smart功能十分強大,可以幫助我們更快更方便的繪製各種流程圖或者是結構圖,我們經常在製作PPT時用到它,一般的操作就是將幾段文字轉化成smart圖形,如圖1。但是其實smart除了運用在幻燈片的內容表達上,還可以用來製作好看的封面和目錄。
  • 木板除了可以鋪地面,還可以這樣用效果也很贊
    木板除了可以鋪地面,還可以這樣用效果也很贊在現在居家裝修的過程裡面,大部分人都會選擇在地面上鋪上木質地板,因為木地板是由木頭做成的,在顏色上十分質樸,會給人一種特別自然的感覺,視覺上讓人覺得十分美觀,對整體的裝修格調也有一定程度的提升作用。從觸感上來說,要是把木質地板鋪在了居室裡面,腳踩上去會覺得挺舒適,並且在一定程度上能夠減少噪音,讓整環境更加安靜。
  • rabbitmq隊列之發送消息到指定隊列
    這裡是你的朝花夕拾、樂於分享動漫、生活小竅門、java程序小工具等給大家今天來分享一個:寫入消息到rabbitmq的java開發小工具類。(筆者已經製作成集MQ發送和接收並生成日誌文件的腳本小工具,需要的可以私聊我,我看到的話會第一時間回復給你。)
  • 黃奇帆:用集群思路破題「調結構」
    全國人大代表、重慶市長黃奇帆7日在北京接受記者採訪時,用集群模式破題「調結構」,並分析其產生的六大效應。2014年,重慶市GDP仍保持較高增長,達10.9%。更為值得注意的是,其產業發展格局打出「三二一」陣型,2014年第三產業增加值佔比超過第二產業。三大產業佔比優化調整為7.4:45.8:46.8。
  • 衣架除了掛衣服,還可以這樣用,一起來試試吧
    妙處一:防止衣服滑落我們的小背心或者是領口比較大的衣服,還有一些光滑布料的在晾曬的時候放在衣架上總是一點點風就會讓它滑落,還得重新清洗。我們可以把衣架兩邊向上彎曲這樣可以曬涼我們的小背心還可以曬我們的鞋是不是很實用呢,曬圍巾都會很方便,也可以在衣架兩側繞上比較粗的繩子多繞一些也可以增大摩擦從而達到防止衣服滑落的目的。
  • Redis的集群搭建,原來這麼簡單
    雖然整體來說薪資漲幅不大,但已經基本上達到大廠薪資的90%,還是可以的呀,重點人家是錢多活少還離家近,你說這氣人不氣人。他拿到這樣的offer證明肚子裡還是有點東西的哈。罷了罷了,啥也別想了,淦就完了。回歸正題,上篇主要說了下Redis的主從複製是如何做的,高可用集群有幾種方式部署(傳送門《原來你是這樣的高可用呀》)。
  • 深入理解:RabbitMQ的前世今生
    RabbitMQ RPC一般的異步服務間,可能會用兩組隊列實現兩個服務模塊之前的異步通信,有趣的是RabbitMQ就內建了這個功能。從實際結果看,RabbitMQ完成設計目標上並不十分出色,主要原因在於默認的模式下,RabbitMQ的隊列實例子只存在在一個節點上(雖然後續也支持了鏡像隊列),既不能保證該節點崩潰的情況下隊列還可以繼續運行,也不能線性擴展該隊列的吞吐量。
  • 除了21cake廿一客紅棗蛋糕,還可以這樣吃棗!
    (原標題:除了21cake廿一客紅棗蛋糕,還可以這樣吃棗!)紅棗是餐桌上常見的食材之一,而其做法也非常豐富,除了燉湯外還可以做成飲品和甜點。
  • 寶寶感冒還高燒?除了物理降溫,家長還可以這樣做
    導讀:寶寶感冒還高燒?除了物理降溫,家長還可以這樣做各位點開這篇文章的朋友們,想必都是很高的顏值吧,我們真的是很有緣哦,小編每天都會給大家帶來不一樣的育兒資訊,如果對小編的文章或者其他的什麼,有什麼一些意見的話歡迎在下方積極評論哦,小編每條都會認真看的。
  • Kind + Docker 一鍵部署K8s集群
    docker學習和實踐都很容易,但是K8S的由於集群化,部署需要較多的機器,環境搭建學習實踐比較費勁這一度影響了K8S技術的普及。所以業界也除了一些簡易版的K8s集群環境,比如K3S(5 less than k8s),本文蟲蟲給大家介紹也是這樣一個項目Kind,一鍵部署的單機K8S環境,可以用於學習、本地開發和CI環境。
  • Countif函數除了做統計,原來還可以這樣用
    如果你的工作中時常要對一些數據做統計工作,那你一定要會用countif函數。它可不只是表面強大,聰明的你只要把它稍加改動或是和其它函數簡單組合,它的能力超乎你的想像。不過相對於能力,我更看重它的效率,可以提早下班這事兒讓我想想就激動!