1. 程式人生 > 實用技巧 >RockMQ雙主雙從搭建

RockMQ雙主雙從搭建

背景

修改配置檔案

將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)