Skip to content

其他说明

gaoyf edited this page Nov 12, 2021 · 18 revisions
  1. 关于rocketmq.zip

    版本为4.6.1,建议使用4.x版本。下载来源https://archive.apache.org/dist/rocketmq/4.6.1/rocketmq-all-4.6.1-bin-release.zip

    其中做的修改如下:

    1. rocketmq/conf下的四个日志配置文件:logback_*.xml

      将${user.home}修改为了${ROCKETMQ_HOME},原因:默认RocketMQ往用户目录下打日志,而用户目录一般在根目录,往往分区比较小,所以改成了rocketmq所在目录。
      
    2. rocketmq/bin下的runserver.sh,runbroker.sh

      gc日志目录由/dev/shm改为了${BASE_DIR}/logs
      
    3. os.sh

      echo 'deadline' > /sys/block/${DISK}/queue/scheduler
      echo "---------------------------------------------------------------"
      sysctl vm.extra_free_kbytes
      sysctl vm.min_free_kbytes
      sysctl vm.overcommit_memory
      sysctl vm.drop_caches
      sysctl vm.zone_reclaim_mode
      sysctl vm.max_map_count
      sysctl vm.dirty_background_ratio
      sysctl vm.dirty_ratio
      sysctl vm.dirty_writeback_centisecs
      sysctl vm.page-cluster
      sysctl vm.swappiness
      su - admin -c 'ulimit -n'
      cat /sys/block/$DISK/queue/scheduler
      修改为:
      if [ ! $DISK ]; then
          echo 'deadline' > /sys/block/${DISK}/queue/scheduler
      fi
      if [ ! $DISK ]; then
          cat /sys/block/$DISK/queue/scheduler
      fi
      echo "`date +%Y%m%d-%H%M%S`" >> /opt/mqcloud/.mq_cloud_inited
      
  2. 关于nmon.zip

    用于收集和监控服务器状况,来自于http://nmon.sourceforge.net

  3. 模块介绍及编译

    1. 模块介绍

      1. mq-client-common-open与mq-client-open为客户端模块,它封装了rocketmq-client,客户端需要依赖它才能和MQCloud进行交互。
      2. mq-cloud-common与mq-cloud为MQCloud的web端,实现管理监控等一系列功能。
    2. 编译(maven需要在3.2.2及以上

      1. mq-client-common-open与mq-client-open最低依赖jdk1.7。

      2. mq-cloud依赖jdk1.8,其采用spring-boot实现。

      3. 编译:

        1. 在sohu-tv-mq/下,执行mvn clean install -pl "!mq-cloud"(linux系统请将"!mq-cloud"改成'!mq-cloud'执行),将编译并install mq-client-common-open,mq-client-open,mq-cloud-common模块

        2. 在sohu-tv-mq/mq-cloud/下,执行mvn clean package,将编译并打包mq-cloud.war

    因为mq-client-*相关模块会提供给业务端使用,所以如果涉及到mq-client-*中的代码修改,需要在父pom中修改version,然后执行mvn -N versions:update-child-modules ,这样所有的子模块的版本均会更新(com.sohu.tv.mq.util.Version中的版本号也会自动修改)。

  4. 邮件预警实现

    可以到管理后台中的通用配置模块进行mail开头相关选项的配置,便可以直接使用邮件预警机制。

  5. 登录实现

    默认的登录采用用户名密码:com.sohu.tv.mq.cloud.service.impl.DefaultLoginService。

    当然注册和登录都没有进行太多安全性考虑,主要是基于MQCloud要部署到内网使用。

    另外还支持sso登录,可以自行实现类似如下类:

        public class SSOLoginService extends AbstractLoginService {
       
            @Override
            protected void auth(HttpServletRequest request, HttpServletResponse response) {
                // 跳到sso去登录认证
            }
       
            @Override
            protected String getEmail(String ticketKey) {
                // sso回调并携带ticket,这里调用sso进行校验ticket,获取登录id(email)
                return null;
            }
       
            @Override
            public void init() {
                
            }
        }
    

    如果采用sso认证登录,auth和getEmail方法的作用参考如下: sso

  6. 我们对RocketMQ的源码进行了部分修改,并开源到了这里:4.7.1, 4.9.1

    关于部分源码修改说明:

    1. broker&nameserver支持开启管理员权限,具体参考wiki

    2. 配置文件日志等修改。

    3. 支持广播消费模式offset重置功能,具体参考wiki

    4. fix NameServer更新导致旧节点仍被使用的bug

    5. slave从master同步数据通信增加可信头校验

    6. 增加死消息统计;死消息不再存储到schedule队列;

    7. broker存储性能统计;支持远程获取broker统计的瞬时数据;

      此项统计在mqcloud里可以查看broker的存储性能,并支持预警:

    8. 消费线程名增加group

    9. broker僵死时支持客户端重试;fix 大量异常:No topic route info in name server for the topic: TBW102

    10. SUBSCRIPTION_NOT_LATEST异常改为warn级别并不打印异常堆栈。

    11. fix统计数据一直增长的bug

    12. micrometer暴露基础指标

      此指标可以访问 broker地址:9999/prometheus获取,支持cpu,内存,gc,线程等指标获取。

    如果配合MQCloud使用此版本RocketMQ还需要执行如下步骤

    1. clone RocketMQ下来,执行如下命令即可编译打包:

      mvn -Prelease-all -DskipTests -Dcheckstyle.skip=true clean package
      

      可执行包的位置在distribution/target/rocketmq-4.7.1-sohu.zip

    2. mqcloud代码修改

      1. 修改pom.xml中的<rocketmq.version>4.7.1</rocketmq.version>修改为<rocketmq.version>4.7.1-sohu</rocketmq.version>。

      2. com.sohu.tv.mq.cloud.util.MQCloudConfigHelper的方法isSohu修改返回为true。

      3. com.sohu.tv.mq.cloud.conf.TaskConfiguration中,搜索{"online-sohu"}替换为{"online"}

      4. com.sohu.tv.mq.cloud.mq.DefaultSohuMQAdmin修改如下两个方法:

        public BrokerStoreStat getBrokerStoreStats(String brokerAddr) throws RemotingConnectException,
                RemotingSendRequestException, RemotingTimeoutException, MQClientException, InterruptedException {
            PercentileStat percentileStat = fetchStoreStatsInBroker(brokerAddr);
            if (percentileStat == null) {
                return null;
            }
            BrokerStoreStat brokerStoreStat = new BrokerStoreStat();
            brokerStoreStat.setAvg(percentileStat.getAvg());
            brokerStoreStat.setCount(percentileStat.getCount());
            brokerStoreStat.setStatTime(percentileStat.getStatTime());
            brokerStoreStat.setMax(percentileStat.getMax());
            brokerStoreStat.setPercent99(percentileStat.getPercent99());
            brokerStoreStat.setPercent90(percentileStat.getPercent90());
            return brokerStoreStat;
        }
        
        public BrokerMomentStatsData getMomentStatsInBroker(String brokerAddr, String statsName, long minValue)
                throws RemotingConnectException, RemotingSendRequestException, RemotingTimeoutException, MQClientException,
                InterruptedException {
            org.apache.rocketmq.common.protocol.body.BrokerMomentStatsData rokerMomentStatsData = fetchMomentStatsInBroker(
                    brokerAddr, statsName, minValue);
            if (rokerMomentStatsData == null) {
                return null;
            }
            BrokerMomentStatsData tmp = new BrokerMomentStatsData();
            List<BrokerMomentStatsItem> tmpList = null;
            if (rokerMomentStatsData.getBrokerMomentStatsItemList() != null) {
                tmpList = new ArrayList<>();
                for (org.apache.rocketmq.common.protocol.body.BrokerMomentStatsItem item : rokerMomentStatsData
                        .getBrokerMomentStatsItemList()) {
                    BrokerMomentStatsItem brokerMomentStatsItem = new BrokerMomentStatsItem();
                    brokerMomentStatsItem.setKey(item.getKey());
                    brokerMomentStatsItem.setValue(item.getValue());
                    tmpList.add(brokerMomentStatsItem);
                }
                tmp.setBrokerMomentStatsItemList(tmpList);
            }
            tmp.setMaxAccessMessageInMemory(rokerMomentStatsData.getMaxAccessMessageInMemory());
            return tmp;
        }
        
    3. mqcloud管理后台,通用配置里,adminAccessKey和adminSecretKey要跟admin_broker_acl.ymladmin_ns_acl.yml配置成一样的。

    4. mqcloud管理后台,配置模板里,broker配置模板增加adminAclEnable选项,以便部署broker时开启管理员权限。