<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

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

    然而,調(diào)試消息也是應(yīng)用程序開(kāi)發(fā)的一部分.在這種情況下,我們需要知道RabbitMQ和客戶之間交換的準(zhǔn)確信息.可以使用一個(gè)內(nèi)建代理工具(Java client API的一部分) (查看調(diào)試RabbitMQ的消息食譜)或者使用高級(jí)網(wǎng)絡(luò)監(jiān)視工具來(lái)檢查網(wǎng)絡(luò)狀況,正如我們將在使用Wireshark來(lái)調(diào)試食譜中看到的一樣。
    監(jiān)控RabbitMQ行為
    為了檢查RabbitMQ的正常行為,有一個(gè)監(jiān)控工具是很有用的,特別是在處理集群的時(shí)候.
    有許多不同的工具,商業(yè)的或免費(fèi)的, 
    這有助于讓它們受控于分布式系統(tǒng)如Nagios、Zabbix之下.
    在本食譜中,我們將展示如何配置Ganglia  RabbitMQ 插件(http://sourceforge.net/apps/trac/ganglia/wiki/ganglia_quick_start).
    準(zhǔn)備
    為了運(yùn)行此食譜,你需要啟用管理插件來(lái)配置RabbitMQ。同時(shí),你也需要安裝和配置Ganglia. 在本食譜中,我們使用的版本是3.6.0.
    如何做
    為了使用Ganglia監(jiān)控圖形來(lái)查看RabbitMQ統(tǒng)計(jì)數(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ù)正確性.實(shí)際上, 你可能需要通過(guò)只留下默認(rèn)的虛擬主機(jī)來(lái)解決以下條目:
    paramvhost {
    value = "/"
    }
    5.如果它已經(jīng)運(yùn)行了,使用下面的命令來(lái)重啟gmond:
    service gmond restart

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

    一旦它運(yùn)行起來(lái),你就可以從同一個(gè)web界面中,看到系統(tǒng)信息和RabbitMQ節(jié)點(diǎn)、隊(duì)列的相關(guān)信息,如下面的截圖所示:


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

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


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


    如何工作
    RabbitMQ log交換器amq.rabbitmq.log是一個(gè)topic交換器,RabbitMQ自身用來(lái)發(fā)布其日志消息.
    在我們的示例代碼中,我們使用#通配符來(lái)消費(fèi)所有topics的消息.
    例如,通過(guò)運(yùn)行另一份代碼,我們可運(yùn)行同一個(gè)broker的兩個(gè)連接,然后中斷它,我們將下面的輸出:
    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
    值得注意的是,在這里報(bào)告的信息,信息和警告不是自己的一部分,但是我們?cè)诿總€(gè)開(kāi)始打印的路由鍵消息(前一步驟的步驟2)。

    TIP
    如果我們只想收到警告和錯(cuò)誤消息,我們可以訂閱相應(yīng)的主題.

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

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

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

    為了消費(fèi)追蹤消息,你可以執(zhí)行Consumer.java中的主方法,你可在Chapter12/Recipe02/Java/src/rmqexample目錄中找到源碼.這里,我們高亮了主要步驟:
    1. 創(chuàng)建一個(gè)臨時(shí)隊(duì)列,并將其綁定到AMQP log交換器上:
    String tmpQueue = channel.queueDeclare().getQueue();
    channel.queueBind(tmpQueue,"amq.rabbitmq.trace","#");
    2.在消費(fèi)者回調(diào)(ActualConsumer.java)中, 可以獲取每個(gè)消息,并使用下面的代碼打印出來(lái):
    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命令控制臺(tái)(Windows)來(lái)激活firehose,其激活命令如下:
    rabbimqctl trace_on
    4. 此時(shí),你可以向broker啟動(dòng)生產(chǎn)和發(fā)送消息,然后你們會(huì)在標(biāo)準(zhǔn)輸出中看到追蹤信息.
    5. 可調(diào)用下面的命令來(lái)禁用firehose:
    rabbimqctl trace_off


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

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

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

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

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


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

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

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

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


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

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

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

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

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


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

    準(zhǔn)備
    要練習(xí)這個(gè)食譜,你需要運(yùn)行的RabbitMQ以及RabbitMQ Java client library.

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

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


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



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

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



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

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




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

    FeedBack:
    # re: RabbitMQ-CookBook-第12章-管理RabbitMQ錯(cuò)誤條件 2016-07-21 16:57 貝蒂斯橄欖油報(bào)價(jià)
    哇哦,看著好復(fù)雜的樣子,嘿嘿  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 亚洲日本va在线视频观看| 亚洲国产一级在线观看| 亚洲高清视频在线观看| 一级毛片成人免费看a| 亚洲狠狠爱综合影院婷婷| 又黄又大的激情视频在线观看免费视频社区在线 | 亚洲AV无码成人精品区在线观看| 国产精品免费久久久久影院| 亚洲精品网站在线观看不卡无广告| 男女猛烈无遮掩视频免费软件 | 亚洲精品美女久久久久| 84pao强力永久免费高清 | 亚洲国产成人综合| 成人AV免费网址在线观看| 亚洲人成网站18禁止| 国产美女被遭强高潮免费网站| 美女羞羞视频免费网站| 亚洲成A人片在线观看无码3D| 久久毛片免费看一区二区三区| 亚洲精品国产精品乱码在线观看 | 日本免费久久久久久久网站| 亚洲人成电影在在线观看网色| 日本亚洲免费无线码| 亚洲狠狠婷婷综合久久| 亚洲天堂免费在线视频| 成全视频高清免费观看电视剧 | 亚洲一区二区三区在线观看蜜桃| 成人免费网站在线观看| 一级毛片免费不卡| 亚洲综合色一区二区三区小说| 免费无码又爽又刺激毛片| 免费一级毛片在线播放放视频| 久久久久亚洲AV无码专区首| 免费人成在线观看69式小视频| 亚洲av无码一区二区三区天堂| 亚洲色婷婷综合久久| 在线观看H网址免费入口| 国产亚洲Av综合人人澡精品| 国产A在亚洲线播放| 在线精品免费视频| 最新国产乱人伦偷精品免费网站|