隨筆 - 41  文章 - 7  trackbacks - 0
          <2016年7月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          在本章中,我們將涵蓋下面的主題:
          1. 監(jiān)控RabbitMQ的行為
          2. 使用RabbitMQ進行故障診斷
          3. 跟蹤RabbitMQ當前活動
          4. 調(diào)試RabbitMQ的消息
          5. 當RabbitMQ重啟失敗時該做什么
          6. 使用Wireshark來調(diào)試
          介紹
          每當我們開發(fā)一個應用程序的時候,一種常見的做法是開發(fā)一個診斷基礎設施. 這可以基于日志文件,SNMP 轉(zhuǎn)移以及其它手段.
          RabbitMQ提供了標準日志文件和內(nèi)建消息故障診斷解決方案.
          在前面三個食譜中,我們將看到如何來使用這三種特性.
          某些時候,會存在一些阻止RabbitMQ啟動的問題.在這種情況下,需要強制解決服務器上的問題并重啟服務器。這一點,我們將在RabbitMQ重啟失敗時該做什么食譜中講解。

          然而,調(diào)試消息也是應用程序開發(fā)的一部分.在這種情況下,我們需要知道RabbitMQ和客戶之間交換的準確信息.可以使用一個內(nèi)建代理工具(Java client API的一部分) (查看調(diào)試RabbitMQ的消息食譜)或者使用高級網(wǎng)絡監(jiān)視工具來檢查網(wǎng)絡狀況,正如我們將在使用Wireshark來調(diào)試食譜中看到的一樣。
          監(jiān)控RabbitMQ行為
          為了檢查RabbitMQ的正常行為,有一個監(jiān)控工具是很有用的,特別是在處理集群的時候.
          有許多不同的工具,商業(yè)的或免費的, 
          這有助于讓它們受控于分布式系統(tǒng)如Nagios、Zabbix之下.
          在本食譜中,我們將展示如何配置Ganglia  RabbitMQ 插件(http://sourceforge.net/apps/trac/ganglia/wiki/ganglia_quick_start).
          準備
          為了運行此食譜,你需要啟用管理插件來配置RabbitMQ。同時,你也需要安裝和配置Ganglia. 在本食譜中,我們使用的版本是3.6.0.
          如何做
          為了使用Ganglia監(jiān)控圖形來查看RabbitMQ統(tǒng)計數(shù)據(jù),你需要執(zhí)行下面的步驟:
          1. 在你的Linux發(fā)行版上,使用yum或apt-get安裝和配置Ganglia.你需要下面的包:
          ganglia-gmetad
          ganglia-gmond
          ganglia-gmond-python
          ganglia-web
          ganglia
          2. 從https://github.com/ganglia/gmond_python_modules/blob/master/rabbit/python_modules/rabbitmq.py拷貝Python Ganglia監(jiān)控插件到/usr/lib64/ganglia/python_modules.
          3. 從https://github.com/ganglia/gmond_python_modules/blob/master/rabbit/conf.d/rabbitmq.pyconf拷貝Python Ganglia 配置文件到/etc/ganglia/conf.d 

          4. 檢查配置文件中的參數(shù)正確性.實際上, 你可能需要通過只留下默認的虛擬主機來解決以下條目:
          paramvhost {
          value = "/"
          }
          5.如果它已經(jīng)運行了,使用下面的命令來重啟gmond:
          service gmond restart

          如何工作
          通過這個食譜, 你可以從Ganglia環(huán)境中來監(jiān)控RabbitMQ.
          TIP
          對于基本的故障診斷,你可以通過日志文件來進行,默認情況下,日志文件存儲于/var/log/rabbitmq.

          一旦它運行起來,你就可以從同一個web界面中,看到系統(tǒng)信息和RabbitMQ節(jié)點、隊列的相關信息,如下面的截圖所示:


          更多
          Ganglia是集群監(jiān)測一種廣泛的解決方案,但不是唯一的一個。其它的解決方案還包括Nagios (www.nagios.org), Zabbix (www.zabbix.com), 以及Puppet (puppetlabs.com).

          通過RabbitMQ排除故障
          正如前面食譜提到的, 我們可以通過一種便利的方式,即以日志文件的方式來監(jiān)控RabbitMQ行為.
          也可以使用RabbitMQ自身來訪問同種信息, 通過向AMQP client通知broker的活動.


          準備
          要運行本食譜,我們需要運行RabbitMQ以及Java client library.
          如何做
          為了消費日志消息,你可在Consumer.java中執(zhí)行主方法.你可在Chapter12/Recipe02/Java/src/rmqexample中找到源友. 下面,我們將高亮主要步驟:
          1. 創(chuàng)建一個臨時匿名隊列,并將其綁定到AMQP log交換器:
          String tmpQueue = channel.queueDeclare().getQueue();
          channel.queueBind(tmpQueue,"amq.rabbitmq.log","#");
          2. 在消費者回調(diào)(ActualConsumer.java)中,可以檢索消息和每個消息的路由鍵,并將它們打印出來:
          String routingKey = envelope.getRoutingKey();
          String message = new String(body);
          System.out.println(routingKey + ": " + message);
          3. 此時,你可以在broker上執(zhí)行任何RabbitMQ操作,并且你會看到日志輸出到標準輸出上。


          如何工作
          RabbitMQ log交換器amq.rabbitmq.log是一個topic交換器,RabbitMQ自身用來發(fā)布其日志消息.
          在我們的示例代碼中,我們使用#通配符來消費所有topics的消息.
          例如,通過運行另一份代碼,我們可運行同一個broker的兩個連接,然后中斷它,我們將下面的輸出:
          info: accepting AMQP connection <0.2737.0> (127.0.0.1:54698 ->127.0.0.1:5672)

          info: accepting AMQP connection <0.2753.0> (127.0.0.1:54699 ->127.0.0.1:5672)
          warning: closing AMQP connection <0.2737.0> (127.0.0.1:54698 ->127.0.0.1:5672):
          connection_closed_abruptly
          warning: closing AMQP connection <0.2753.0> (127.0.0.1:54699 ->127.0.0.1:5672):
          connection_closed_abruptly
          值得注意的是,在這里報告的信息,信息和警告不是自己的一部分,但是我們在每個開始打印的路由鍵消息(前一步驟的步驟2)。

          TIP
          如果我們只想收到警告和錯誤消息,我們可以訂閱相應的主題.

          更多
          默認情況下,日志交換器-amq.rabbitmq.log被創(chuàng)建在虛擬主機/中。通過在RabbitMQ配置文件中定義default_vhost從而設置其位置是可能的.

          追蹤RabbitMQ當前活動
          有時,為了分析和調(diào)試未知的應用程序行為,我們需要追蹤RabbitMQ接收和分發(fā)的所有消息.
          RabbitMQ提供追蹤這些消息的所謂的流水追蹤工具。
          追蹤活動可以在運行時啟用和禁用,并且它應該只用于調(diào)試,因為它規(guī)定了broker活動的開銷.

          準備
          要運行此食譜,我們需要運行此食譜,我們需要運行RabbitMQ和Java client library.
          如何做
          RabbitMQ使用與日志消息中同樣的機制來發(fā)送追蹤消息;因此,示例代碼與前一個食譜中的非常相似.

          為了消費追蹤消息,你可以執(zhí)行Consumer.java中的主方法,你可在Chapter12/Recipe02/Java/src/rmqexample目錄中找到源碼.這里,我們高亮了主要步驟:
          1. 創(chuàng)建一個臨時隊列,并將其綁定到AMQP log交換器上:
          String tmpQueue = channel.queueDeclare().getQueue();
          channel.queueBind(tmpQueue,"amq.rabbitmq.trace","#");
          2.在消費者回調(diào)(ActualConsumer.java)中, 可以獲取每個消息,并使用下面的代碼打印出來:
          String routingKey = envelope.getRoutingKey();
          String message = new String(body);
          Map<String,Object> headers = properties.getHeaders();
          LongStringexchange_name = (LongString)
          headers.get("exchange_name");
          LongString node = (LongString) headers.get("node");
          ...
          3. 可從root用戶(Linux)或在RabbitMQ命令控制臺(Windows)來激活firehose,其激活命令如下:
          rabbimqctl trace_on
          4. 此時,你可以向broker啟動生產(chǎn)和發(fā)送消息,然后你們會在標準輸出中看到追蹤信息.
          5. 可調(diào)用下面的命令來禁用firehose:
          rabbimqctl trace_off


          如何工作 
          默認情況下,amq.rabbit.trace topic交換器不會接收任何消息,但一旦激活firehose后(前面步驟的步驟3),所有流經(jīng)broker的消息將被按下面的規(guī)則拷貝:
          1.進入broker的消息,它們是通過路由鍵publish.exchange-name發(fā)布的, 這里的exchange-name是消息最初發(fā)布的交換器名稱.
          2.離開broker的消息,它們是通過路由鍵deliver.queuename發(fā)布的,這里的queue-name是消息最初被消費的隊列名稱.
          3.消息的body是從原始消息中拷貝過來的.

          4.原始消息的元數(shù)據(jù)會插入到拷貝消息的header屬性中. 在步驟2中,我們已經(jīng)看到了,如何獲取最初分發(fā)消息的交換器名稱,但獲取所有原始信息也是可以的,即,找到所有可有字段,并將它們插到消息屬性中.firehose的官方文檔鏈接位于:http://www.rabbitmq.com/firehose.html.

          調(diào)試RabbitMQ消息
          有時,通過在標準輸出中記錄通過broker的消息是有用的.通過RabbitMQ Java客戶端提供的簡單應用程序來追蹤消息,也是可行的.
          準備
          要運行此食譜,你需要運行的RabbitMQ(運行標準端口 5672),以及RabbitMQ Java client library
          如何做
          RabbitMQ的Java client library中包含了一個追蹤工具,你可以按下面的步驟來進行實際使用.
          1. 從http://www.rabbitmq.com/java-client.html頁面下載最新版本的RabbitMQ Java client library.
          2. 將其解壓,并進入其目錄
          .
          3. 通過下面的命令來運行Java tracer:
          ./runjava.sh com.rabbitmq.tools.Tracer
          4. 運行用于調(diào)試Java client,并將其連接到5673端口.對于本食譜,我們可以使用包含在Java client包中的另一個Java工具,其調(diào)用如下:
          ./runjava.sh com.rabbitmq.examples.PerfTest -h amqp://localhost:5673 -C 1 -D 1

          如何工作
          追蹤工具是一個簡單的AMQP代理;默認情況下,它監(jiān)聽5673端口,并會把所有的請求轉(zhuǎn)發(fā)到默認監(jiān)聽5672端口的RabbitMQ broker.
          所有生產(chǎn)或消費的消息,如同AMQP操作一樣,都會記錄到標準輸出中.
          運行前面步驟的步驟4,我們使用了包含在Java client包中另一個用于作RabbitMQ壓力測試的工具.
          在這里,我們只是限制了生產(chǎn)一個消息(-C 1) 并消費它(-D 1).
          TIP
          追蹤工具只在Java client API中可用.

          更多
          可以使用下面的代碼來為Java追蹤程序傳遞更多的參數(shù):
          ./runjava.sh com.rabbitmq.tools.Tracer listenPort connectHost connectPort
          listenPort指的是追蹤器監(jiān)聽的端口(默認為5673), connectHost/connectPort (默認為localhost/5672) 是用于連接并轉(zhuǎn)發(fā)收到請求的主機和端口。
          使用下面的命令,你可以找到所有PerfTest可用選項:
          ./runjava.sh com.rabbitmq.examples.PerfTest --help


          也可參考
          在http://www.rabbitmq.com/java-tools.html中,你可以找到Java追蹤工具以及PerfTest的文檔.

          當RabbitMQ重啟失敗時,需要做什么
          偶爾情況下, RabbitMQ 可能會重啟失敗。如果broker包含持久化數(shù)據(jù)時,這是一個嚴重的問題,否則,有足夠的能力重設其持久化狀態(tài)。
          準備
          要運行此食譜,你只需要一個測試RabbitMQ broker.
          TIP
          我們將銷毀所有之前定義的數(shù)據(jù)—以避免使用生產(chǎn)實例.

          如何做
          要清空RabbitMQ, 可執(zhí)行下面的簡單步驟:
          1. 如果RabbitMQ運行的話,停止它.
          2. 定位到Mnesia 數(shù)據(jù)庫目錄.默認是/var/lib/rabbitmq/mnesia (Linux) or %APPDATA%\RabbitMQ\db (Windows).
          3. 遞歸刪除其目錄和文件.
          4. 重啟RabbitMQ.

          如何工作
          Mnesia 數(shù)據(jù)庫包含了所有運行時的RabbitMQ定義信息: 隊列,交換器,用戶等等.
          通過刪除Mnesia數(shù)據(jù)庫 (或者通過重命名,這樣可以在需要的時候恢復某些數(shù)據(jù)), RabbitMQ會重置到出廠默認狀態(tài),當RabbitMQ啟動時,它會創(chuàng)建一個新的Mnesia數(shù)據(jù)庫,并使用默認值進行初始化.


          更多
          如果broker無法在第一時間啟動,有可能是某個系統(tǒng)目錄存在權限問題:即要么是Mnesia數(shù)據(jù)庫目錄,要么是日志目錄,要么是某些在配置文件中指定的臨時的或自定義的目錄.
          你可以在RabbitMQ故障排除頁頁找到詳盡的列表(http://www.rabbitmq.com/troubleshooting.html).

          也可參考
          在Mnesia API 文檔頁面(http://www.erlang.org/doc/man/mnesia.html),,你可以找到更多關于如何破解Mnesia數(shù)據(jù)庫的信息.

          使用Wireshark調(diào)試
          在調(diào)試RabbitMQ消息食譜中,我們已經(jīng)了解過了如何來追蹤RabbitMQ的消息.

          然而,以下情況并不總是可能的或可取的,即停止正在運行的客戶端(或RabbitMQ服務器),修改它的連接端口,指向一個不同的broker;我們只想監(jiān)控正在實時傳遞的消息,影響系統(tǒng)的活動應該盡可能的少。

          TIP
          但是,正如在前面食譜(追蹤RabbitMQ當前活動)中看到的一樣,激活firehose是可行的 .


          Wireshark是一個免費的有能力解碼AMQP消息的網(wǎng)絡分析工具.
          此工具既可用在客戶段,也可以用在服務端,從而
          無縫監(jiān)控AMQP交通狀況.

          準備
          要練習這個食譜,你需要運行的RabbitMQ以及RabbitMQ Java client library.

          如何做
          在下面的步驟中,我們將看到如何使用Wireshark來追蹤AMQP消息:
          1. 如果Wireshark在你的系統(tǒng)中尚不可用,那么需要從http://www.wireshark.org/下載和安裝Wireshark . 如果可能的話,你也可以從你的發(fā)行版中進行安裝,如:
          yum install wireshark-gnome
          2.在Linux系統(tǒng)中,以root用戶來啟動Wireshark.
          3.啟動從環(huán)回接口中捕獲消息.
          4.切換到Java client library路徑下,在終端中運行下面的命令:
          ./runjava.sh com.rabbitmq.examples.PerfTest -C 1 -D 1
          5.
          停止Wireshark GUI的采集,并分析抓到的AMQP交通狀況.
          如何工作
          使用Wireshark,可用于檢測AMQP交通的退出或進行一個持有RabbitMQ服務器或客戶端的服務器.
          在我們的例子中,我們捕獲了運行在同一臺機器上服務端和客戶端網(wǎng)絡交通狀況,因此連接是localhost中發(fā)生的.這也是為什么我們從環(huán)回接口中捕獲交通狀況的原因(前面步驟的步驟3).
          反之,我們應該從網(wǎng)絡接口中進行捕獲,這種網(wǎng)絡接口通常是eth0或其它相似的網(wǎng)絡接口.

          TIP
          在Linux上,可以直接捕獲localhost;但同樣的操作不能應用到Windows上.在這種情況下,客戶端和服務端必須位于不同的兩臺機器上, 并且在網(wǎng)絡接口上(要么是物理的,要么是虛擬的)必須激活捕獲, 這樣它們之間才可連接.


          所以,為了運行Wireshark的圖形用戶界面,如果RabbitMQ客戶端和服務器運行在同一個節(jié)點,你需要選擇環(huán)回接口,如圖下面的截圖所示:



          TIP
          在Linux上,當你安裝Wireshark軟件包,你通常只會有命令行界面,tshark。要安裝Wireshark的GUI,你必須安裝相應的軟件包. 例如,在Fedora中,你需要安裝wireshark-gnome包.

          一旦AMQP交通已穿過環(huán)回接口,它已經(jīng)被Wireshark捕獲。
          運行在步驟4的實驗實際上在兩個獨立的連接中開啟了一個生產(chǎn)者和一個消費者.
          為了高亮顯示,找到一個描述為Basic.PublishContent-Header的包,點擊它,并選擇Follow TCP stream.然后,您可以關閉顯示客戶端和服務器之間有效負載對話的窗口。在主窗口中,您現(xiàn)在可以看到在客戶端和服務器之間交換的網(wǎng)絡數(shù)據(jù)包,如下面的截圖所示:



          用同樣的方式,你可以選擇RabbitMQ server,如下面的截圖所示:

          在前面的兩個截圖中,我們已經(jīng)強調(diào)了消息AMQP的有效載荷,但由于Wireshark中包括了一個非常完整的AMQP解剖器,你會發(fā)現(xiàn)在AMQP交通的很多細節(jié)。
          更多
          如果RabbitMQ配置為使用SSL,并且你想要分析加密流量,在一定條件下,通過在Wireshark配置中合理配置SSL公共/私有密鑰也是可以的
          可在http://wiki.wireshark.org/SSL找到更多信息.
          也可參考
          http://wiki.wireshark.org/AMQP,你可以找到一些關于Wireshark AMQP 解剖器的一些指南.




          posted on 2016-07-20 11:39 胡小軍 閱讀(3970) 評論(1)  編輯  收藏 所屬分類: RabbitMQ

          FeedBack:
          # re: RabbitMQ-CookBook-第12章-管理RabbitMQ錯誤條件 2016-07-21 16:57 貝蒂斯橄欖油報價
          哇哦,看著好復雜的樣子,嘿嘿  回復  更多評論
            
          主站蜘蛛池模板: 麻江县| 山东| 海原县| 巩义市| 郴州市| 鄢陵县| 竹溪县| 曲阳县| 平昌县| 西乌珠穆沁旗| 连云港市| 新巴尔虎右旗| 新巴尔虎左旗| 巴林右旗| 中宁县| 太湖县| 南平市| 盈江县| 富宁县| 玛曲县| 谢通门县| 财经| 黄大仙区| 南宫市| 河间市| 城市| 凤冈县| 同德县| 措勤县| 新邵县| 宣城市| 民和| 南城县| 饶阳县| 柞水县| 沙洋县| 嘉义市| 泰来县| 甘泉县| 榆社县| 漳州市|