1.1 名词解释
术语和缩写 | 解释 |
nameServer | 专门为RocketMQ设计的轻量级名称服务 |
Producer | 消息生产者,负责生产消息,一般由业务系统负责生产消息 |
Consumer | 消息消费者,负责消费消息,一般是后台系统负责异步消息 |
Broker | 消息中转角色,负责存储消息,转发消息 |
Master | Broker中的主节点 |
Slave | Broker中的副节点 |
异步复制 | 消息写入master节点,再由master节点异步复制到slave节点 |
同步双写 | 消息同时写入master节点和slave节点 |
异步刷盘 | Broker的一种持久化策略,消息写入pagecache后,直接返回。由异步线程直接将pagecache写入硬盘 |
同步刷盘 | Broker的一种持久化策略,消息写入pagecache后,由同步线程直接将pagecache写入硬盘 |
TPS | 每秒发送消息个数 |
1.2 安装部署
1.2.1 硬件环境
Cpu4核、内存8g
软件环境
Linux环境
Jdk1.8或以上版本64位
Gradle 3.3或以上
1.2.2 单机部署
1、查看JAVA环境
(1)输入命令 Java -version
(2)显示jdk版本,如果jdk版本不低于1.8则继续下一步,如果低于1.8则需要安装jdk1.8或以上版本
2、下载rocketmq
可通过命令或者在官网下载:
wget http://mirrors.hust.edu.cn/apache/rocketmq/4.2.0/rocketmq-all-4.2.0-bin-release.zip下载
官网:http://rocketmq.apache.org/dowloading/releases
3、 解压rocketmq
输入命令 unzip rocketmq-all-4.6.0-bin-release.zip -d ./rocketmq
可将rocketmq解压到当前目录的rocketmq文件夹内
4、创建存储路径
mkdir -p ../rocketmq/store/{store,commitlog,consumequeue,index}
5、配置RocketMq环境变量
RockeMq一般部署于非root用户下,vi /home/${user}/.bash_profile 或 vi /etc/profile,添加如下内容:
export NAMESRV_ADDR=0.0.0.0(内网ip):9876
6、设置broker配置
(1)输入命令创建配置
vi rocketmq/conf/default-broker.properties
或 vi ../conf/broker.conf
(2)输入内容
#ip为服务器内网地址,port可自由设置一般为9876
namesrvAddr=ip(内网ip):port;
messageIndexSafe=true
#是否允许Broker 自动创建。Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
waitTimeMillsInSendQueue=5000
#发送消息线程池数量
sendMessageThreadPoolNums=64
useReentrantLockWhenPutMessage=true
defaultReadQueueNums = 16
defaultWriteQueueNums = 16
#ip设置外网ip,不需要连接外网的话,可以在参数前面加#注释掉
brokerIP1=ip(外网ip)
#默认值为DefaultCluster,可以修改为broker所属的哪个集群
brokerClusterName=DefaultCluster
#原始值为本机主机名,Broker名称
brokerName=broker-a
#BrokerId,必须是大等于 0 的整数,0 表示Master,>0 表示 Slave,一个 Master 可以挂多个 Slave,Master 与 Slave通过 BrokerName 来配对,原始值为0
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
#port可自由设置,一般设置10911
listenPort=port
storePathRootDir=/usr/local/rocketmq/store
storePathCommitLog= /usr/local/rocketmq/store/commitlog
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
storePathIndex=/usr/local/rocketmq/store/index
(3)最后按esc键,输入:wq保存配置
(4)实例:我自己本地的配置
namesrvAddr =#.#.#.#:9876
brokerClusterName = DefaultCluster
brokerName = broker-a
listenPort=10911
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
storePathRootDir=/opt/usr/rocketmq-4.6/store/store
storePathCommitLog= /opt/usr/rocketmq-4.6/store/commitlog
storePathConsumeQueue=/opt/usr/rocketmq-4.6/store/consumequeue
storePathIndex=/opt/usr/rocketmq-4.6/store/index
7、修改启动脚本参数,根据自己linux的配置进行调整
vi bin/runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:PermSize=128m -XX:MaxPermSize=320m"
vi bin/runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:PermSize=128m -XX:MaxPermSize=320m"
注意:Xms和Xmx至少是1G 否则启动不起来 Xmn一般是前者的一半,这边设置的内存不能大于机器实际的内存,根据实际情况调整
8、启动NameSrv
nohup sh mqnamesrv >/opt/usr/rocketmq/rocketmq4.6.0/logs/mqnamesrv.log 2>&1 &
9、启动broker
nohup sh mqbroker -c ../conf/broker.conf >/opt/usr/rocketmq/rocketmq4.6.0/logs/broker.log 2>&1 &
10、停止broker
其中default-broker.properties为上面第5步设置的broker配置文件名
sh mqshutdown broker
11、停止namesrv
sh mqshutdown namesrv
备注:停止这两个任务时不能用kill,如果用kill的话,重新启动的话,broker是启动不了的。
12、验证
(1)在ROCKETMQ_HOME路径下执行以下命令模拟Producer发消息:
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
(2)观察结果:会发出很多条下面的命令,说明发送成功:
(3)在ROCKETMQ_HOME路径下执行以下命令模拟Consumer发消息:
sh tools.sh org.apache.rocketmq.example.quickstart.Consumer
(4)观察结果:会收到和上面一样多的命令,说明接收成功,可证明RocketMQ部署成功。
1.3 安装过程中遇到的坑
问题一:Failed to obtain the host name
启动brokerserver任务时,会报以下错误:这是由于启动的时候找不到自己的主机名对应的ip地址而造成的。
解决上述问题只需修改/etc/hosts文件,在该文件中添加本机配置,就可以了
vim /etc/hosts
添加: 内网ip:主机名
问题二:connect to null failed
首先先检查下namesrvAdrr 是否为空,若为空,则rocketmq没连接上namesrv的ip地址,查看方式:
sh /bin/mqbroker -m
正常情况下,namesrvAddr=内网ip:9876,报上述错误时,namesrvAddr=后面是没有值的,这种情况下,需检查rocketmq的配置环境。
vim /etc/profile
export NAMESRV_ADDR=0.0.0.0(内网ip):9876 是否已经配置
问题三:connect to <121.41.110.225:10911> failed
配置文件中的内网地址时,测试时能测通。
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
修改为外网地址时,会报上述错误
查看防火墙,如果防火墙开启,则需关闭防火墙,重启后测试是否能通。若仍不能测通,可能是本服务器的外网ip没有对外开放,需要找运维开放或自己开放下。
查看防火墙的命令:
CentOS 6
vi /etc/sysconfig/iptables #编辑防火墙配置文件 systemctl status iptables
systemctl restart iptables.service #最后重启防火墙使配置生效
systemctl enable iptables.service #设置防火墙开机启动
CentOS 7
systemctl status firewalld #查看防火墙是否启动
systemctl start firewalld #启动防火墙
systemctl stop firewalld #关闭防火墙
cat /etc/firewalld/zones/public.xml #防火墙文件
firewall-cmd --list-all #防火墙端口list