RockMQ雙主雙從搭建
阿新 • • 發佈:2020-07-22
背景
修改配置檔案
將RocketMQ安裝到/usr/local/下
配置檔案所在目錄/usr/local/rocketmq-all-4.7.0-source-release/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/conf/
配置檔案修改及說明
#修改伺服器1的broker-a.properties、broker-a-s.properties,伺服器2的broker-b.properties、broker-b-s.properties #後面啟動會用到這4個檔案 /usr/local/rocketmq-all-4.7.0-source-release/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/conf/2m-2s-sync
配置:兩臺伺服器(ip1、ip2)
伺服器1(ip1)
#主 #如多網絡卡或者虛擬伺服器,需要暴露真實ip brokerIP1=ip1 namesrvAddr=ip1:9876;ip2:9876 brokerClusterName=DefaultCluster #主從brokerName值一樣,表明關係 brokerName=broker-a #為0表示主,大於0表示從 brokerId=0 #刪除檔案時間為凌晨4點 deleteWhen=04 #檔案保留時間 fileReservedTime=48 #同步雙寫Master brokerRole=SYNC_MASTER #同步刷盤 flushDiskType=SYNC_FLUSH #同一臺伺服器部署主從,需要不同埠來區分 listenPort=10911 #儲存路徑 storePathRootDir=/usr/local/rocketmq/store-a #從 brokerIP1=ip1 namesrvAddr=ip1:9876;ip2:9876 brokerClusterName=DefaultCluster brokerName=broker-a brokerId=1 deleteWhen=04 fileReservedTime=48 brokerRole=SYNC_MASTER flushDiskType=ASYNC_FLUSH listenPort=11011 storePathRootDir=/usr/local/rocketmq/store-a-slave
伺服器2(ip2)
#主 brokerIP1=ip2 namesrvAddr=ip1:9876;ip2:9876 brokerClusterName=DefaultCluster brokerName=broker-b brokerId=0 deleteWhen=04 fileReservedTime=48 brokerRole=SYNC_MASTER flushDiskType=SYNC_FLUSH listenPort=10911 storePathRootDir=/home/rocketmq/store-b #從 brokerIP1=ip2 namesrvAddr=ip1:9876;ip2:9876 brokerClusterName=DefaultCluster brokerName=broker-b brokerId=1 deleteWhen=04 fileReservedTime=48 brokerRole=SLAVE flushDiskType=ASYNC_FLUSH listenPort=11011 storePathRootDir=/home/rocketmq/store-b-slave
啟動
cd /usr/local/rocketmq-all-4.7.0-source-release/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/
#啟動nameserver
nohup sh bin/mqnamesrv &
#啟動broker,其他類似
./bin/mqbroker -c /usr/local/rocketmq-all-4.7.0-source-release/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/conf/2m-2s-sync/broker-b.properties &
問題及解決
問題1
java.lang.RuntimeException: Lock failed,MQ already started
at org.apache.rocketmq.store.DefaultMessageStore.start(DefaultMessageStore.java:214)
at org.apache.rocketmq.broker.BrokerController.start(BrokerController.java:827)
at org.apache.rocketmq.broker.BrokerStartup.start(BrokerStartup.java:64)
at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:58)
解決:將broker的master和slave節點放在同一臺機器上,配置的storePath相同導致的,修改配置檔案,改為不同的路徑即可解決。
問題2
預設RocketMQ佔用的記憶體較大,可修改為如下所示:
cd /usr/local/rocketmq/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/bin
vi runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
vi runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn256m"
問題3
如果是阿里雲伺服器存在安全組的限制時,需要放開對應的埠
問題4
Spring boot整合RocketMQ,啟動時報錯,更換spring boot版本或直接使用RocketMQ解決
使用如下配置報錯,改為直接使用rocketmq-client
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.6.RELEASE</version>
</parent>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
報錯資訊:
[ ERROR ] [2020-06-29 16:13:32] [main-org.springframework.boot.SpringApplication--821 line] - Application startup failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.rocketmq.spring.autoconfigure.ListenerContainerConfiguration': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.rocketmq.spring.autoconfigure.ListenerContainerConfiguration$$EnhancerBySpringCGLIB$$85647c72]: No default constructor found; nested exception is java.lang.NoSuchMethodException: org.apache.rocketmq.spring.autoconfigure.ListenerContainerConfiguration$$EnhancerBySpringCGLIB$$85647c72.<init>()
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1105)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1050)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:760)
at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:360)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:306)