• rocketmq Lock failed,MQ already started -c参数


    今天部署rocketmq集群时一台机器部署一个master 和slave,slave部署总是失败,通过查看日志显示下面的错误

    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:654)
    	at org.apache.rocketmq.broker.BrokerStartup.start(BrokerStartup.java:62)
    	at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:56)
    23:21:47.512 [main] ERROR RocketmqCommon - Failed to obtain the host name
    java.net.UnknownHostException: slave02: slave02: unknown error
    	at java.net.InetAddress.getLocalHost(InetAddress.java:1505) ~[na:1.8.0_65]
    	at org.apache.rocketmq.common.BrokerConfig.localHostName(BrokerConfig.java:202) [rocketmq-common-4.2.0.jar:4.2.0]
    	at org.apache.rocketmq.common.BrokerConfig.<init>(BrokerConfig.java:39) [rocketmq-common-4.2.0.jar:4.2.0]
    	at org.apache.rocketmq.broker.BrokerStartup.createBrokerController(BrokerStartup.java:101) [rocketmq-broker-4.2.0.jar:4.2.0]
    	at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:56) [rocketmq-broker-4.2.0.jar:4.2.0]
    Caused by: java.net.UnknownHostException: slave02: unknown error
    	at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) ~[na:1.8.0_65]
    	at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928) ~[na:1.8.0_65]
    	at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323) ~[na:1.8.0_65]
    	at java.net.InetAddress.getLocalHost(InetAddress.java:1500) ~[na:1.8.0_65]
    	... 4 common frames omitted
    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:654)
    	at org.apache.rocketmq.broker.BrokerStartup.start(BrokerStartup.java:62)
    	at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:56)
    23:22:32.218 [main] ERROR RocketmqCommon - Failed to obtain the host name
    java.net.UnknownHostException: slave02: slave02: unknown error
    	at java.net.InetAddress.getLocalHost(InetAddress.java:1505) ~[na:1.8.0_65]
    	at org.apache.rocketmq.common.BrokerConfig.localHostName(BrokerConfig.java:202) [rocketmq-common-4.2.0.jar:4.2.0]
    	at org.apache.rocketmq.common.BrokerConfig.<init>(BrokerConfig.java:39) [rocketmq-common-4.2.0.jar:4.2.0]
    	at org.apache.rocketmq.broker.BrokerStartup.createBrokerController(BrokerStartup.java:101) [rocketmq-broker-4.2.0.jar:4.2.0]
    	at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:56) [rocketmq-broker-4.2.0.jar:4.2.0]
    错误1.  slave02: unknown error是由于我启动的时候启动命令没有-c走的默认的代码中的配置
    public class BrokerConfig {
        private static final Logger log = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
    
        private String rocketmqHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV));
        @ImportantField
        private String namesrvAddr = System.getProperty(MixAll.NAMESRV_ADDR_PROPERTY, System.getenv(MixAll.NAMESRV_ADDR_ENV));
        @ImportantField
        private String brokerIP1 = RemotingUtil.getLocalAddress();
        private String brokerIP2 = RemotingUtil.getLocalAddress();
        @ImportantField
        private String brokerName = localHostName();
        @ImportantField
        private String brokerClusterName = "DefaultCluster";
        @ImportantField
        private long brokerId = MixAll.MASTER_ID;
        private int brokerPermission = PermName.PERM_READ | PermName.PERM_WRITE;
    错误2.  Lock failed,MQ already started也是走的代码默认的配置
    DefaultMessageStore.java
     1 public void start() throws Exception {
     2 
     3         lock = lockFile.getChannel().tryLock(0, 1, false);
     4         if (lock == null || lock.isShared() || !lock.isValid()) {
     5             throw new RuntimeException("Lock failed,MQ already started");
     6         }
     7 
     8         lockFile.getChannel().write(ByteBuffer.wrap("lock".getBytes()));
     9         lockFile.getChannel().force(true);
    10 
    11         this.flushConsumeQueueService.start();
    12         this.commitLog.start();
    13         this.storeStatsService.start();
    DefaultMessageStore.java
     1  public DefaultMessageStore(final MessageStoreConfig messageStoreConfig, final BrokerStatsManager brokerStatsManager,
     2         final MessageArrivingListener messageArrivingListener, final BrokerConfig brokerConfig) throws IOException {
     3         this.messageArrivingListener = messageArrivingListener;
     4         this.brokerConfig = brokerConfig;
     5         this.messageStoreConfig = messageStoreConfig;
     6         this.brokerStatsManager = brokerStatsManager;
     7         this.allocateMappedFileService = new AllocateMappedFileService(this);
     8         this.commitLog = new CommitLog(this);
     9         this.consumeQueueTable = new ConcurrentHashMap<>(32);
    10 
    11         this.flushConsumeQueueService = new FlushConsumeQueueService();
    12         this.cleanCommitLogService = new CleanCommitLogService();
    13         this.cleanConsumeQueueService = new CleanConsumeQueueService();
    14         this.storeStatsService = new StoreStatsService();
    15         this.indexService = new IndexService(this);
    16         this.haService = new HAService(this);
    17 
    18         this.reputMessageService = new ReputMessageService();
    19 
    20         this.scheduleMessageService = new ScheduleMessageService(this);
    21 
    22         this.transientStorePool = new TransientStorePool(messageStoreConfig);
    23 
    24         if (messageStoreConfig.isTransientStorePoolEnable()) {
    25             this.transientStorePool.init();
    26         }
    27 
    28         this.allocateMappedFileService.start();
    29 
    30         this.indexService.start();
    31 
    32         this.dispatcherList = new LinkedList<>();
    33         this.dispatcherList.addLast(new CommitLogDispatcherBuildConsumeQueue());
    34         this.dispatcherList.addLast(new CommitLogDispatcherBuildIndex());
    35 
    36         File file = new File(StorePathConfigHelper.getLockFile(messageStoreConfig.getStorePathRootDir()));
    37         MappedFile.ensureDirOK(file.getParent());
    38         lockFile = new RandomAccessFile(file, "rw");
    39     }

    BrokerController.java

     1 public BrokerController(
     2         final BrokerConfig brokerConfig,
     3         final NettyServerConfig nettyServerConfig,
     4         final NettyClientConfig nettyClientConfig,
     5         final MessageStoreConfig messageStoreConfig
     6     ) {
     7         this.brokerConfig = brokerConfig;
     8         this.nettyServerConfig = nettyServerConfig;
     9         this.nettyClientConfig = nettyClientConfig;
    10         this.messageStoreConfig = messageStoreConfig;
    .....剩余代码不贴了
    MessageStoreConfig.java
     1 public class MessageStoreConfig {
     2     //The root directory in which the log data is kept
     3     @ImportantField
     4     private String storePathRootDir = System.getProperty("user.home") + File.separator + "store";
     5 
     6     //The directory in which the commitlog is kept
     7     @ImportantField
     8     private String storePathCommitLog = System.getProperty("user.home") + File.separator + "store"
     9         + File.separator + "commitlog";
    10 
    11     // CommitLog file size,default is 1G
    12     private int mapedFileSizeCommitLog = 1024 * 1024 * 1024;
    13     // ConsumeQueue file size,default is 30W
    14     private int mapedFileSizeConsumeQueue = 300000 * ConsumeQueue.CQ_STORE_UNIT_SIZE;
    15     // enable consume queue ext
    16     private boolean enableConsumeQueueExt = false;
    17     // ConsumeQueue extend file size, 48M
    18     private int mappedFileSizeConsumeQueueExt = 48 * 1024 * 1024;
    19     // Bit count of filter bit map.
    20     // this will be set by pipe of calculate filter bit map.
    21     private int bitMapLengthConsumeQueueExt = 64;

    如果不加-c就是在默认路径下,自己可以去${user.dir}下去看看,肯定有这个目录

    所以多次启动不加-c参数就会报上面错误

     1 if (commandLine.hasOption('c')) {
     2                 String file = commandLine.getOptionValue('c');
     3                 if (file != null) {
     4                     configFile = file;
     5                     InputStream in = new BufferedInputStream(new FileInputStream(file));
     6                     properties = new Properties();
     7                     properties.load(in);
     8 
     9                     properties2SystemEnv(properties);
    10                     MixAll.properties2Object(properties, brokerConfig);
    11                     MixAll.properties2Object(properties, nettyServerConfig);
    12                     MixAll.properties2Object(properties, nettyClientConfig);
    13                     MixAll.properties2Object(properties, messageStoreConfig);
    14 
    15                     BrokerPathConfigHelper.setBrokerConfigPath(file);
    16                     in.close();
    17                 }
    18             }

    最后梳理一下启动流程

    nohup sh mqbroker -c ${mqdir}/conf/2m-2s-sync/broker-a.properties &的启动流程

    1.加载启动类BrokerStartup.java main方法

    2.createBrokerController方法加载启动参数并确定使用默认配置还是读取对应的配置文件 主要是-c参数的作用

    3.加载配置

    有错误之处望指正。

     
  • 相关阅读:
    Shell脚本
    数据结构 栈 java 自带的数据结构
    桃夭
    得道多助,失道寡助
    采薇
    离骚
    两小儿辩日
    鱼我所欲也
    生于忧患,死于安乐
    曹刿论战
  • 原文地址:https://www.cnblogs.com/javashare/p/10052736.html
Copyright © 2020-2023  润新知