RocketMQ集群部署方案(DLedger)
一、基本配置
1、准备三台虚拟机,root密码 root ;IP地址:
192.168.xxx.xxx worker1
192.168.xxx.xxx worker2
192.168.xxx.xxx worker3
并在对应的机器的/etc/hosts文件中设置对应的ip和机器名映射
2、每台机器上创建用户mq并设置密码
useradd mq
passwd mq 密码输入:Anji@1024
3、系统配置
1)免密登录,切换mq用户,在worker1、worker2、worker3上分别生成密钥:
su mq
ssh-keygen
2)同步公钥到其他服务器
ssh-copy-id worker1
ssh-copy-id worker2
ssh-copy-id worker3
- 通过命令验证免密登录配置是否成功
ssh worker1
ssh worker2
ssh worker2
4、在三台机器上分别配置JAVA环境
1)上传jdk8的tar包并解压到/app/jdk1.8目录
tar -zxvf jdk-8u171-linux-x64.tar.gz
mv jdk1.8.0_171/ /app/jdk1.8
2)配置环境变量。使用 vi ~/.bash_profile编辑文件,添加一下配置,并使用source ~/.bash_profile使环境变量生效,输入java -version查看是否配置成功
export JAVA_HOME=/app/jdk1.8/
PATH=$JAVA_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin
export PATH
5、上传rocketMQ的rocketmq-all-4.8.0-bin-release.zip包到/app/rocketMq目录下并解压
unzip rocketmq-all-4.8.0-bin-release.zip
6、把rocketmq的bin目录也配置到环境变量当中。 vi ~/.bash_profile,加入以下内容,并执行source ~/.bash_profile让环境变量生效:
export JAVA_HOME=/app/jdk1.8/
export ROCKETMQ_HOME=/app/rocketmq/rocketmq-all-4.7.1-bin-release
PATH=$ROCKETMQ_HOME/bin:$JAVA_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin
export PATH
二、集群配置
1、编写配置
每个 RocketMQ-on-DLedger Group 至少准备三台机器,
每台机器上一个节点,形成一个一主二从的机器,如果后期业务扩展,可以根据需求配置更多的主从节点
编写 3 个配置文件,建议参考 conf/dledger 目录下的配置文件样例。
关键配置介绍:
name | 含义 | 举例 |
---|---|---|
enableDLegerCommitLog 是否启动 DLedger | true | |
dLegerGroup | DLedger Raft Group的名字,建议和 brokerName 保持一致 | RaftNode00 |
dLegerPeers | DLedger Group 内各节点的端口信息,同一个 Group 内的各个节点配置必须要保证一致 | n0-127.0.0.1:40911;n1-127.0.0.1:40912;n2-127.0.0.1:40913 |
dLegerSelfId | 节点 id, 必须属于 dLegerPeers 中的一个;同 Group 内各个节点要唯一 | n0 |
sendMessageThreadPoolNums | 发送线程个数,建议配置成 Cpu 核数 | 16 |
其中单个节点的配置如下,具体参考集群信息:
brokerClusterName = RaftCluster
brokerName=RaftNode00
listenPort=30911
namesrvAddr=127.0.0.1:9876 ---配置多个nameserver地址,分别是worker1、worker2、worker3上的nameserver地址,如果开启了防火墙注意端口转发
storePathRootDir=/tmp/rmqstore/node00
storePathCommitLog=/tmp/rmqstore/node00/commitlog
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
dLegerPeers=n0-127.0.0.1:40911;n1-127.0.0.1:40912;n2-127.0.0.1:40913 ---为了集群安全可以将三个节点放到不同的worker1、worker2、worker3上,如果开启了防火墙注意端口转发
dLegerSelfId=n0
sendMessageThreadPoolNums=16
先启动三台机器上的nameserver:
nohup bin/mqnamesrv &
在启动对应brocker的节点
nohup sh bin/mqbroker -c conf/dledger/xxx-n0.conf &
nohup sh bin/mqbroker -c conf/dledger/xxx-n1.conf &
nohup sh bin/mqbroker -c conf/dledger/xxx-n2.conf &
三、配置管理页面
RocketMQ源代码中并没有提供控制台,但是有一个Rocket的社区扩展项目中提供了一个控制台,地
址: https://github.com/apache/rocketmq-externals,下载下来后,进入其中的rocket-console目录,使用maven进行编译:mvn clean package -Dmaven.test.skip=true
1、将对应的rocketmq-console-ng-1.0.1.jar 上传到对应的管理控制台机器的/app/rocketMq/rocketmq-console目录下,并在当前目录中新增application.properties文件,
在文件中添加对应nameserver的IP和端口(如果开启了防火墙注意端口转发):
rocketmq.config.namesrvAddr=worker1:9876;worker2:9876;worker3:9876
2、启动jar包
nohup java -jar rocketmq-console-ng-1.0.1.jar &
3、启动完成后,可以访问 http://IP:8080看到管理页面
调整系统参数
到这里,我们的整个RocketMQ的服务就搭建完成了。但是在实际使用时,我们说RocketMQ的吞吐量、性能都很高,那要发挥RocketMQ的高性能,还需要对RocketMQ以及服务器的性能进行定制
1、配置RocketMQ的JVM内存大小:
之前提到过,在runserver.sh中需要定制nameserver的内存大小,在runbroker.sh中需要定制broker的内存大小。这些默认的配置可以认为都是经过检验的最优化配置,但是在实际情况中都还需要根据服务器的实际情况进行调整。这里以runbroker.sh中对G1GC的配置举例,在runbroker.sh中的关键配置:
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:${GC_LOG_DIR}/rmq_broker_gc_%p_%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"
JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
-XX:+UseG1GC: 使用G1垃圾回收器, -XX:G1HeapRegionSize=16m 将G1的region块大小设为16M,-XX:G1ReservePercent:在G1的老年代中预留25%空闲内存,这个默认值是10%,RocketMQ把这个参数调大了。-XX:InitiatingHeapOccupancyPercent=30:当堆内存的使用率达到30%之后就会启动G1垃圾回收器尝试回收垃圾,默认值是45%,RocketMQ把这个参数调小了,也就是提高了GC的频率,但是避免了垃圾对象过多,一次垃圾回收时间太长的问题。
然后,后面定制了GC的日志文件,确定GC日志文件的地址、打印的内容以及控制每个日志文件的大小为30M并且只保留5个文件。这些在进行性能检验时,是相当重要的参考内容。
2、RocketMQ的其他一些核心参数
例如在conf/dleger/broker-n0.conf中有一个参数:sendMessageThreadPoolNums=16。这一个参数是表明RocketMQ内部用来发送消息的线程池的线程数量是16个,其实这个参数可以根据机器的CPU核心数进行适当调整,例如如果你的机器核心数超过16个,就可以把这个参数适当调大。
3、Linux内核参数定制
我们在部署RocketMQ的时候,还需要对Linux内核参数进行一定的定制。例如
ulimit,需要进行大量的网络通信和磁盘IO。
vm.extra_free_kbytes,告诉VM在后台回收(kswapd)启动的阈值与直接回收(通过分配进程)的阈值之间保留额外的可用内存。RocketMQ使用此参数来避免内存分配中的长延迟。(与具体内核版本相关)
vm.min_free_kbytes,如果将其设置为低于1024KB,将会巧妙的将系统破坏,并且系统在高负载下容易出现死锁。
vm.max_map_count,限制一个进程可能具有的最大内存映射区域数。RocketMQ将使用mmap加载CommitLog和ConsumeQueue,因此建议将为此参数设置较大的值。
vm.swappiness,定义内核交换内存页面的积极程度。较高的值会增加攻击性,较低的值会减少交换量。建议将值设置为10来避免交换延迟。
File descriptor limits,RocketMQ需要为文件(CommitLog和ConsumeQueue)和网络连接打开文件描述符。我们建议设置文件描述符的值为655350。
这些参数在CentOS7中的配置文件都在 /proc/sys/vm目录下。
另外,RocketMQ的bin目录下有个os.sh里面设置了RocketMQ建议的系统内核参数,可以根据情况进行调整。