RocketMQ-記RocketMQ啟動後producer無法連線到broker的錯誤及解決方案
背景
最近在學習RocketMQ,第一步就是安裝部署並啟動RocketMQ.使用最新版本的RocketMQ,版本為4.2.0
,安裝後啟動相關服務.
啟動nameServer
:
nohup mqnamesrv &
由於broker
和nameServer
在同一臺機器上,啟動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:10909
是broker
的地址,即producer
嘗試連線broker
時失敗.
後來發現172.18.46.234
是我的阿里雲伺服器的內網地址,我們回憶下RocketMQ的工作流程:
- 啟動
nameServer
broker
啟動時使用-n localhost:9876
指定nameServer
,將自己的IP地址註冊到nameServer
producer
首先連線nameServer
,獲取可用的broker
地址producer
根據從nameServer
獲取的broker
地址,將資訊傳送給broker
因此錯誤的原因是broker
將自己內網地址傳送給了nameServer
,producer
從nameServer
獲取的是broker
的內網IP地址,自然無法連線broker
.
解決方案
由上可知,只要broker
將自己的外網地址註冊到nameServer
即可,查閱資料發現,broker
註冊到nameServer
的地址可以使用引數配置,引數為brokerIP1
和brokerIP2
(個人推測這兩個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 |
備註:
- 若選項需要引數,則引數是否可選為否時表示該選項後必須跟一個引數
- 若選項無需引數,則引數是否可選無意義
由上可知,啟動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
,且master
和slave
使用非同步方式同步資料;而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
其中brokerIP1
和brokerIP2
修改為自己雲伺服器的外網地址.
啟動broker
(假設當前工作目錄為$ROCKETMQ_HOME/bin
):
nohup mqbroker -c ../conf/broker.conf &
再次執行demo,即可成功向broker
傳送訊息.
總結
broker
向nameServer
註冊的地址是brokerIP1
,brokerIP2
,
@ImportantField
private String brokerIP1 = RemotingUtil.getLocalAddress();
private String brokerIP2 = RemotingUtil.getLocalAddress();
在阿里雲伺服器上獲取的是內網IP地址,因此producer
從nameServer
獲取的broker
地址是broker
的內網IP地址,無法向broker
傳送訊息.
可以通過-c
指定broker
啟動時的配置檔案,在配置檔案中新增brokerIP1
和brokerIP2
屬性,其值為阿里雲伺服器的外網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伺服器