1. 程式人生 > >千萬PV網站架構之RabbitMQ(消息隊列)安裝、集群

千萬PV網站架構之RabbitMQ(消息隊列)安裝、集群

-- sha bcd 直接 ssa stop The 節點 tex

RabbitMQ介紹:
  • MQ全稱為Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通信方法。應用程序通過讀寫出入隊列的消息(針對應用程序的數據)來通信,而無需專用連接來鏈接它們。消息傳遞指的是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是用於諸如遠程過程調用的技術。排隊指的是應用程序通過 隊列來通信。隊列的使用除去了接收和發送應用程序同時執行的要求。
  • RabbitMQ是一個在AMQP基礎上完成的,可復用的企業消息系統。他遵循Mozilla Public License開源協議。

RabbitMQ幾個關鍵概念:

  • Broker:簡單來說就是消息隊列服務器實體。
  • Exchange:消息交換機,它指定消息按什麽規則,路由到哪個隊列。
  • Queue:消息隊列載體,每個消息都會被投入到一個或多個隊列。
  • Binding:綁定,它的作用就是把exchange和queue按照路由規則綁定起來。
  • Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。
  • vhost:虛擬主機,一個broker裏可以開設多個vhost,用作不同用戶的權限分離。
  • producer:消息生產者,就是投遞消息的程序。
  • consumer:消息消費者,就是接受消息的程序。
  • channel:消息通道,在客戶端的每個連接裏,可建立多個channel,每個channel代表一個會話任務。

    結構示意圖:
    技術分享圖片
    消息隊列的使用過程如下:

    1.客戶端連接到消息隊列服務器,打開一個channel;
    2.客戶端聲明一個Exchange,並設置相關屬性;
    3.客戶端聲明一個Queue,並設置相關屬性;
    4.客戶端使用Routing Key,在Exchange和Queue之間建立好綁定關系;
    5.客戶端投遞消息到Exchange;
    6.Exchange收到消息後,就根據消息的Key和已經設置的Binding,進行消息路由,將消息投遞到一個或多個隊列裏;

    RabbitMQ的集群節點包括內存節點,磁盤節點。RabbitMQ支持的持久化,也就是數據寫在磁盤上,最合適的方案就是既有內存節點,又有磁盤節點;
    實現步驟:

  • 設計架構模式:在一個集群裏,有三臺服務器,其中一臺使用磁盤模式,另兩臺使用內存模式。兩臺內存模式的節點無疑速度很快,因此通過客戶端連接訪問它們。但是客戶端不可能分別連接兩個內存節點,肯定是通過前端反向代理去輪詢分發請求。如果擔心前端反向代理服務器故障,可以通過keepalived軟件做一個高可用架構。而磁盤模式的節點,由於磁盤IO相對較慢,因此僅作數據備份使用;
  • 環境準備:
主機名 操作系統 IP地址 防火墻和SELinux 用途
rabbitmq01 CentOS7 192.168.72.128 關閉 磁盤節點
rabbitmq02 CentOS7 192.168.72.150 關閉 內存節點
rabbitmq03 CentOS7 192.168.72.151 關閉 內存節點

安裝RabbitMQ:

* 需要配置三個節點的hosts文件,將如下的內容分別加入到三臺服務器上。
* vim /etc/hostname           //其他兩臺為rabbitmq02、rabbitmq03
    rabbitmq01.localdomain
* vim /etc/hosts       //添加下面三行
192.168.72.128 rabbitmq01
192.168.72.150 rabbitmq02
192.168.72.151 rabbitmq03
* init 6    //重啟
* systemctl stop firewalld.service 
* setenforce 0
* 三個節點都安裝rabbitmq軟件:
* yum install epel-release -y     //安裝epel源
* yum install -y rabbitmq-server  //安裝軟件
* ln -s /usr/lib/rabbitmq/bin/* /usr/bin/ //創建鏈接,使系統能夠識別RabbitMQ命令
* rabbitmq-plugins list     //查看插件安裝情況
* rabbitmq-plugins enable rabbitmq_management //啟用rabbitmq_management服務
* systemctl start rabbitmq-server.service   //啟動rabbitmq服務
* netstat -ntap | grep 5672    //如圖3個端口開啟 說明正常(15672,25672都是rabbitmq的管理端口,5672則是和生產者,消費者通信的端口)
* rabbitmqctl cluster_status  //檢查三臺的集群狀態,目前相互獨立,沒有形成集群。

技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
RabbitMQ的集群是依賴於erlang的集群來工作的,所以必須先構建起erlang的集群環境,在erlang的集群中,各節點是通過一個magic.cookie來實現的,這個cookie存放在/var/lib/rabbitmq/.erlang.cookie中,文件是400的權限。所以必須保證各節點cookie保持一致,否則節點之間就無法通信。

* 構建Erlang群集:
* systemctl stop rabbitmq-server.service       //停止三臺服務器
* vi /var/lib/rabbitmq/.erlang.cookie         //三臺值配置成一樣的,復制rabbitmq01的內容到其他兩臺
* systemctl start rabbitmq-server.service

技術分享圖片
技術分享圖片
技術分享圖片

* 在內存節點mq02,mq03上操作,先停掉rabbitmq應用,然後調用cluster命令,組成集群,最後再啟動rabbitmq應用:
* rabbitmqctl stop_app
* rabbitmqctl join_cluster --ram rabbit@rabbitmq01    //加入到磁盤節點
* rabbitmqctl start_app    
* rabbitmqctl cluster_status //驗證集群狀態

打開瀏覽器進入web頁面管理:

* 輸入:http://192.168.72.128:15672/
* 默認用戶名:guest 密碼:guest

技術分享圖片

* **添加策略:**
* Name:策略名稱
* Pattern:匹配的規則 
* Definition;使用ha-mode模式中的all,也就是同步所有匹配的隊列。
* Priority:優先級,默認是0,值越大優先級越大。
* 最後點擊添加Add policy按鈕,這樣就多了一個策略

技術分享圖片

* **以下簡單增加消息隊列:**
* Name:隊列名稱
* Durability:隊列是否持久化(durable 是支持)
* Auto delete:自動刪除
* Arguments:使用的策略類型
* 最後點擊Add queue按鈕,會出現添加的隊列

技術分享圖片

  • 在創建一個aaa 不填寫Arguments值,查看隊列消息:
    技術分享圖片
* 添加隊列消息:
* 2-Persistent:表示持久化,反之上面顯示非持久化。
* Headers: 隨便填寫
* Properties:點擊問號,現在一個ID號
* Payload:消息內容

技術分享圖片
再輸入網頁可以查看到新添加的 消息對列!

千萬PV網站架構之RabbitMQ(消息隊列)安裝、集群