1. 程式人生 > >RocketMQ-記RocketMQ啟動後producer無法連線到broker的錯誤及解決方案

RocketMQ-記RocketMQ啟動後producer無法連線到broker的錯誤及解決方案

背景

最近在學習RocketMQ,第一步就是安裝部署並啟動RocketMQ.使用最新版本的RocketMQ,版本為4.2.0,安裝後啟動相關服務.
啟動nameServer:

nohup mqnamesrv &

由於brokernameServer在同一臺機器上,啟動broker:

nohup mqbroker -n localhost:9876 &

接下來執行producer的demo,但是在執行demo的過程中出現了問題,異常堆疊如下:

org.apache.rocketmq.client.exception.MQClientException: Send [3
] times, still failed, cost [3004]ms, Topic: MQ-MSG-TOPICS-TEST, BrokersSent: [iZnqntg5t2znd7Z, iZnqntg5t2znd7Z, iZnqntg5t2znd7Z] See http://rocketmq.apache.org/docs/faq/ for further details. at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:544
) at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1069) at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1023) at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:214
) at core.RocketMQProducer.send(RocketMQProducer.java:44) at core.RocketMQProducerTest.main(RocketMQProducerTest.java:20) Caused by: org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to <172.18.46.234:10909> failed at org.apache.rocketmq.remoting.netty.NettyRemotingClient.invokeSync(NettyRemotingClient.java:388) at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessageSync(MQClientAPIImpl.java:351) at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:335) at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:298) at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendKernelImpl(DefaultMQProducerImpl.java:696) at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:463) ... 5 more

現將問題的排查及解決方法記錄如下.

排查

遇到這個問題後,根據異常資訊知道是無法連線到172.18.46.234:10909.那麼這個地址是nameServer的還是broker的呢?
在demo中配置的nameServer地址是阿里雲伺服器的公網地址,而且埠號是預設的9876,因此172.18.46.234:10909broker的地址,即producer嘗試連線broker時失敗.
後來發現172.18.46.234是我的阿里雲伺服器的內網地址,我們回憶下RocketMQ的工作流程:

  1. 啟動nameServer
  2. broker啟動時使用-n localhost:9876指定nameServer,將自己的IP地址註冊到nameServer
  3. producer首先連線nameServer,獲取可用的broker地址
  4. producer根據從nameServer獲取的broker地址,將資訊傳送給broker

因此錯誤的原因是broker將自己內網地址傳送給了nameServer,producernameServer獲取的是broker的內網IP地址,自然無法連線broker.

解決方案

由上可知,只要broker將自己的外網地址註冊到nameServer即可,查閱資料發現,broker註冊到nameServer的地址可以使用引數配置,引數為brokerIP1brokerIP2(個人推測這兩個IP應該一個是普通channel,一個是vip channel),但是如何在broker啟動時設定這兩個引數呢?

檢視RocketMQ中org.apache.rocketmq.broker.BrokerStartup原始碼可知,broker啟動選項如下:

短選項 長選項 是否必填 是否需要引數 引數是否可選 含義
n nameSrvAddr Name server address list, eg: 192.168.0.1:9876;192.168.0.2:9876
c configFile Broker config properties file
h help - Print help
p printConfigItem - Print all config item
m printImportantConfig - Print important config item

備註:

  1. 若選項需要引數,則引數是否可選為否時表示該選項後必須跟一個引數
  2. 若選項無需引數,則引數是否可選無意義

由上可知,啟動broker時共有5個選項,比較常用的是-n-c,-n用於指定nameServer的IP地址及埠號,-c用於指定配置檔案,同時nameServer的IP地址及埠號也可用nameSrvAddr在配置檔案中設定,這樣啟動broker時就不用使用選項指定nameServer了.
RocketMQ在$ROCKETMQ_HOME/conf下提供了幾個預設的配置檔案,如2m-2s-async資料夾中提供了4個配置檔案,分別是2個master和2個slave,且masterslave使用非同步方式同步資料;而broker.conf提供了叢集中只有一個master,無slave的配置檔案,在配置檔案中新增brokerIP1,brokerIP2,nameSrvAddr屬性,內容如下:

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# brokerIP1和brokerIP2預設獲取本地ip地址,在雲伺服器上會獲取內網ip地址,因此必須顯式設定
brokerIP1=*.*.*.*
brokerIP2=*.*.*.*
# 將namesrvAddr設定在configfile中
namesrvAddr=localhost:9876     

其中brokerIP1brokerIP2修改為自己雲伺服器的外網地址.
啟動broker(假設當前工作目錄為$ROCKETMQ_HOME/bin):

nohup mqbroker -c ../conf/broker.conf &

再次執行demo,即可成功向broker傳送訊息.

總結

brokernameServer註冊的地址是brokerIP1,brokerIP2,

    @ImportantField
    private String brokerIP1 = RemotingUtil.getLocalAddress();
    private String brokerIP2 = RemotingUtil.getLocalAddress();

在阿里雲伺服器上獲取的是內網IP地址,因此producernameServer獲取的broker地址是broker的內網IP地址,無法向broker傳送訊息.
可以通過-c指定broker啟動時的配置檔案,在配置檔案中新增brokerIP1brokerIP2屬性,其值為阿里雲伺服器的外網IP地址,即可解決上述問題.
除此之外,RocketMQ還提供了-h,-p,-m用於列印幫助,列印配置項和列印重要配置項供使用者參考.
還可將nameServer的地址通過nameSrvAddr屬性寫在配置檔案中,這樣啟動時就無需通過-n設定nameServer地址.

參考

相關推薦

RocketMQ-RocketMQ啟動producer無法連線broker錯誤解決方案

背景 排查 解決方案 總結 參考 背景 最近在學習RocketMQ,第一步就是安裝部署並啟動RocketMQ.使用最新版本的RocketMQ,版本為4.2.0,安裝後啟動相關服務. 啟動nameServer: nohup mqn

華為ENSP中AR啟動失敗錯誤程式碼40,42,43,啟動一直#的問題的一種解決方案

系統是64位win10安裝ensp510時不斷40.42.43的錯且在不報錯時開啟ar時一直輸出#  查閱網上各種方法 一 一嘗試後發現, 我的問題是虛擬機器不是最新版本,且虛擬機器中沒有配置網絡卡,檢視是否有網絡卡配置,在virtualbox中點選左上角的管理,選擇全域性設定,然後在

FileZilla無法連線ftp伺服器的解決方案

如果使用FileZilla預設設定連線ftp伺服器的話可能會報以下錯誤: 錯誤: 無法建立資料連線:ECONNREFUSED - Connection refused by server 錯誤: 連線超時 錯誤: 讀取目錄列表失敗 解決的辦法是把傳輸模式改為主動 點選連

Mac OS X 下部分Android手機無法連線adb問題之解決方案

時至當今,Android山寨手機廠商已如此之多,能修改和個性化定製Android OS的能人已是多如牛毛,有的牛人修改Android系統只會影響所修改的點,不會影響其它,然後還有的就不多說了,總之做的修改會造成很多影響其它方面功能的問題。對Android APP開發者來說最

eclipse adb 啟動失敗,無法匹配android裝置 的解決方案

原因 adb橋與devices之間失去了連線或者連線不匹配了,導致一直在查詢裝置連線。 方案 方法一: 在工作管理員中找到adb.exe的程序,結束程序。 重啟eclipse,重新插拔連線裝置

Hibernate annotation多對多中間表設為新類id無法成為主鍵的解決方案

問題背景: 眾所周知,在hibernate annotation 多對多對映中,若中間表有其他欄位,例如學生(T_Student)和課程(T_Course)之間的多對多關係,中間表Score(分數),

workbench無法連線mysql8.0.13解決方案

workbench提示: 2003 - Can't connect to MySQL server on '127.0.0.1' (61 "Connection refused") 你需要先用socket方式連線,需要配置socket的存放位置,我這裡是mac,預設位置是

win8.1 64bit下IIS8.5無法連線Access資料庫的解決方案

win8.1 64bit下IIS8.5無法連線Access資料庫,這個問題著實讓我搞了好多天啊,搞到淚奔了,專案催著呢,但伺服器搞不好,讓人痛苦了好一陣子啊,各種方法用盡就是連不上,但最終還是解決了,寫此博文以積累,也助和我遇到同樣問題的程式猿&&程式媛們。

Android模擬器或者真機無法連線內網的解決方案(當需要修改hosts的時候)

不管測試機還是模擬器,訪問不到內網地址時,很可能是電腦上修改hosts了,但是模擬器和測試機沒有修改hosts. 模擬器修改hosts 使用adb命令修改hosts: 1.先root. 執行命令: adb root 2.設定為可更改使用者賬戶.

Vue資料繫結文本閃爍問題分析解決方案

Vue文字閃爍問題 一、問題描述 程式碼示例: <div id="app"> <span>{{user.userName}}</span> </div> 頁面顯示: {{user.userName}} 問題詳情:在載

virtualbox安裝redhat,正常關閉需要重新安裝原因分析解決方案

環境:win10 virtualbox   X   redhat 裝了個虛擬機器,緊接著要給虛擬機器裝各種東西,然後yum install 發現因為沒有註冊環境,yum源是用不了的。 這當然是小嘍囉級的問題啦,配置一個本地yum源,然

啟動Pro/TOOLKIT程式的常見錯誤解決辦法

一、發生讀取錯誤’No such file or directory’ 錯誤原因:註冊檔案(一般為protk.dat)中exec_file指定的dll路徑不正確。 解決辦法:將註冊檔案中exec_file指定的路徑修改正確。 可以通過【輔助應用程式視窗

SQL Server連線失敗錯誤解決

單擊"別名"選項卡,還可以為伺服器配置別名。伺服器的別名是用來連線的名稱,連線引數中的伺服器是真正的伺服器名稱,兩者可以相同或不同。如下圖中,我們可以使用myserver來代替真正的伺服器名稱sql2kcn-02,並且使用網路庫 Named Pipes。別名的設定與使用HOSTS檔案有相似之處。     

從Eclipse啟動tomcat伺服器,訪問出現 404 錯誤解決方案

最近沒有新專案做,有空餘時間打算學習一下SpringMVC。由於工作模組所用技術的限制,已經好久沒有用過Tomcat了。以前用Tomcat都是在MyEclipse裡用的,不容易出什麼問題,用起來也特別方便。不過最近習慣了有Eclipse,然後這次學習SpringMVC直接用

CentOS 6.5開啟啟動無法進入原來的圖形終端介面,而是進入的命令介面

解決方法:1.檢視inittab檔案,一般預設情況下:cat /etc/inittab,其中“id:5 default``````” 沒有問題!若數字5被修改,請修改回來2.在這個命令介面,輸入roo

tomcat啟動本地無法訪問,區域網內的其他電腦可以訪問

1、問題描述: tomcat專案啟動後 ,沒有報什麼錯誤,但在本地訪問時出現 Internet Explorer 無法顯示該網頁,但是使用區域網其他的電腦通過區域網ip訪問可以訪問 2、環境: w

Windows Linux(Ubuntu)雙系統安裝無法引導進Linux的解決方案 調整啟動管理器順序和等待時間

Windows Ubuntu雙系統 無法引匯入Ubuntu: 原文參考:http://www.cnblogs.com/dolphin0520/archive/2012/03/11/2390175.html 作者:海子 本人近日首次接觸Linux系統 之前是裝在虛擬機器上

【hadoop】hadoop啟動jps無法檢視守護程序

按照各個教程配置完hadoop後,用如下指令啟動守護程序: $ sudo sbin/start-all.sh 用echo $?確認指令執行過程無誤,但jps指令就是看不到程序: $ jps 7542 Jps grep程序後確認守護程序實際上都已正常執行,偶然想起之前的配

mysql8 安裝 Navicat 無法連線的問題

無法連線的原因是mysql8與mysql5的加密方式不同。連線時會出現1251錯誤。解決辦法:1.先通過命令列進入mysql的root賬戶:PS C:\Windows\system32> mysql -uroot -p再輸入root的密碼:Enter password:

eclipse啟動tomcat無法訪問

症狀:tomcat在eclipse裡面能正常啟動,而在瀏覽器中訪問http://localhost:8080/不能訪問,且報404錯誤。同時其他專案頁面也不能訪問。關閉eclipse裡面的tomcat,在tomcat安裝目錄下雙擊startup.bat手動啟動tomcat伺服器