-
Notifications
You must be signed in to change notification settings - Fork 276
其他说明
-
关于rocketmq.zip
版本为4.6.1,建议使用4.x版本。下载来源https://archive.apache.org/dist/rocketmq/4.6.1/rocketmq-all-4.6.1-bin-release.zip。
其中做的修改如下:
-
rocketmq/conf下的四个日志配置文件:logback_*.xml
将${user.home}修改为了${ROCKETMQ_HOME},原因:默认RocketMQ往用户目录下打日志,而用户目录一般在根目录,往往分区比较小,所以改成了rocketmq所在目录。
-
rocketmq/bin下的runserver.sh,runbroker.sh
gc日志目录由/dev/shm改为了${BASE_DIR}/logs
-
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
-
-
关于nmon.zip
用于收集和监控服务器状况,来自于http://nmon.sourceforge.net。
-
模块介绍及编译
-
模块介绍
- mq-client-common-open与mq-client-open为客户端模块,它封装了rocketmq-client,客户端需要依赖它才能和MQCloud进行交互。
- mq-cloud-common与mq-cloud为MQCloud的web端,实现管理监控等一系列功能。
-
编译(maven需要在3.2.2及以上)
-
mq-client-common-open与mq-client-open最低依赖jdk1.7。
-
mq-cloud依赖jdk1.8,其采用spring-boot实现。
-
编译:
-
在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模块
-
在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
中的版本号也会自动修改)。
-
-
邮件预警实现
可以到
管理后台
中的通用配置
模块进行mail开头相关选项的配置,便可以直接使用邮件预警机制。
-
登录实现
默认的登录采用用户名密码: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方法的作用参考如下:
-
我们对RocketMQ的源码进行了部分修改,并开源到了这里:4.7.1, 4.9.1
关于部分源码修改说明:
-
配置文件日志等修改。
-
支持广播消费模式offset重置功能,具体参考wiki。
-
broker存储性能统计;支持远程获取broker统计的瞬时数据;。
此项统计在mqcloud里可以查看broker的存储性能,并支持预警:
-
broker僵死时支持客户端重试;fix 大量异常:No topic route info in name server for the topic: TBW102。
-
此指标可以访问 broker地址:9999/prometheus获取,支持cpu,内存,gc,线程等指标获取。
如果配合MQCloud使用此版本RocketMQ还需要执行如下步骤:
-
clone RocketMQ下来,执行如下命令即可编译打包:
mvn -Prelease-all -DskipTests -Dcheckstyle.skip=true clean package
可执行包的位置在distribution/target/rocketmq-4.7.1-sohu.zip
-
mqcloud代码修改
-
修改pom.xml中的<rocketmq.version>4.7.1</rocketmq.version>修改为<rocketmq.version>4.7.1-sohu</rocketmq.version>。
-
com.sohu.tv.mq.cloud.util.MQCloudConfigHelper的方法isSohu修改返回为true。
-
com.sohu.tv.mq.cloud.conf.TaskConfiguration中,搜索{"online-sohu"}替换为{"online"}
-
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; }
-
-
mqcloud管理后台,通用配置里,adminAccessKey和adminSecretKey要跟admin_broker_acl.yml和admin_ns_acl.yml配置成一样的。
-
mqcloud管理后台,配置模板里,broker配置模板增加adminAclEnable选项,以便部署broker时开启管理员权限。