linux下安装rocketMQ双Master集群

来源:互联网 发布:英国脱欧最新进展 知乎 编辑:程序博客网 时间:2024/06/05 04:35

title:linux下安装rocketMQ双Master集群

date:2017年11月2日09:24:27


我们需要选择两台虚拟机来完成双master的搭建,选用66,67

一.配置hosts文件

首先需要修改linux服务器上/etc/hosts文件

nano /etc/hosts

修改为

67更改为

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain410.18.3.67  vm0047 rocketmq-master210.18.3.66  rocketmq-master1

66更改为

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain410.18.3.66  vm0003 rocketmq-master110.18.3.67  rocketmq-master2

看到教程上说需要两台服务器上都需如下配置

10.18.3.66  rocketmq-nameserver-110.18.3.66  rocketmq-master-110.18.3.67  rocketmq-nameserver-210.18.3.67  rocketmq-master-2

经过试验,发现,只需要我如下配置就可以搭建起rocketMQ集群了。

其实一开始看教程的时候就对修改这个hosts文件有疑问,因为确实不知道为什么需要这样来配置。

所以还是先看一下hosts文件的作用,以及这些配置的含义把。先看一下相关基本概念。

  • hosts文件相关解释:

    • hosts:The static table lookup for host name(主机名查询静态表);

    • 用途: hosts文件是Linux系统中一个负责IP地址与域名快速解析的文件,在没有域名服务器的情况下,系统上的所有网络程序都通过查询该文件来解析对应于某个主机名的IP地址,否则就需要使用DNS服务程序来解决。通常可以将常用的域名和IP地址映射加入到hosts文件中,实现快速方便的访问。dns缓存 > hosts > dns服务

    • 内容:hosts文件包含了IP地址和主机名之间的映射,还包括主机名的别名。
    • 存储:以ASCII格式保存在“/etc”目录下,文件名为“hosts”(不同的linux版本,这个配置文件也可能不同。比如Debian的对应文件是/etc/hostname)。
  • 主机名:

    无论在局域网还是INTERNET上,每台主机都有一个IP地址,是为了区分此台主机和彼台主机,也就是说IP地址就是主机的门牌号。但IP地址不方便记忆,所以又有了域名。域名只是在公网(INTERNET)中存在(以实验为目的的局域网域网实验性除外),每个域名都对应一个IP地址,但一个IP地址可有对应多个域名。主机名就机器本身的名字,域名是用来解析到IP的。但值得一说的是在局域网中,主机名也是可以解析到IP上的;

    主机名是用于什么的呢?在一个局域网中,每台机器都有一个主机名用于主机与主机之间的便于区分,就可以为每台机器设置主机名,以便于以容易记忆的方法来相互访问。比如我们在局域网中可以为根据每台机器的功用来为其命名。

Linux下hosts的基本默认配置:hosts 配置文件是用来把主机名字映射到IP地址的方法,这种方法比较简单。但这种映射只是本地机的映射,也就是说每台机器都是独立的,所有的计算机都不能相互通过Hostname来访问。

一般情况下hosts的内容关于主机名(Hostname)的定义,每行为一个主机,每行由三部份组成,每个部份由空格隔开。其中#号开头的行做说明,不被系统解释。

第一部份:网络IP地址。

第二部份:主机名.域名,注意主机名和域名之间有个半角的点。

第二部份:主机名(主机名别名) ,其实就是主机名。

当然每行也可以是两部份,就是主机IP地址和主机名;比如 192.168.1.195 debian

所以上图,我们的

10.18.3.66  rocketmq-master1

就是主机IP地址和主机名的配置。

现在我们将66,67上都配置了对方的IP地址和主机名也就意味着我们这两台局域网的机器就可以通过Hostname来访问了。我们之所以要去修改hosts文件配置,目的也就是为了能够让这两台局域网的机器可以通过Hostname来互相访问,毕竟直接用ip实在是2b。

二.安装rocketmq

首先,去网络上下载alibaba-rocketmq-3.2.6.tar

然后上传到linux服务器相应路径下,然后开始解压

 tar -zxvf alibaba-rocketmq-3.2.6.tar.gz

当然,如果你不想让解压好的文件就放在当前压缩包存放的路径,你可以使用如下的命令来进行操作

 tar -zxvf alibaba-rocketmq-3.2.6.tar.gz -C  /....(你想要放的路径)

-C是一个很有用的参数,他可以将文件切换到指定目录。

在这里还想在多说一下tar命令(本人的linux功底十分差劲,所以每次有linux的东西都想多写两句)

tar 打包:将一大堆文件或目录变成一个总的文件

gzip,bzip2 压缩:将一个大的文件通过一些压缩算法变成一个小文件

Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)。我们的alibaba-rocketmq-3.2.6.tar.gz就是这样得到的。

习惯上以.tar后缀代表tar包,用xxx.tar.gz或.tgz代表gzip压缩过的tar文件,用.tar.bz2代表bzip2压缩过的tar文件。

安装好rocketmq后还需要新建数据存储位置:

 mkdir -p alibaba-rocketmq/store/{commitlog,consumequeue,index}

三.修改配置文件

安装好rocketmq后,我们需要修改相应的配置文件

我们需要进入rocketmq中的conf/2m-noslave目录下,该目录下有两个配置文件,分别为:broker-a.propertis,broker-b.properites。我们在一台服务器中修改broker-a.properties,另一台服务器中修改broker-b.properties

目前我都是使用nano命令来修改文件的,但是我看主流都是vi,下次也得使用vi了。

修改后的内容如下

#所属集群名字brokerClusterName=rocketmq-cluster#broker名字,注意此处不同的配置文件填写的不一样brokerName=broker-a|broker-b#0 表示 Master,>0 表示 SlavebrokerId=0#nameServer地址,分号分割namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数defaultTopicQueueNums=4#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭autoCreateTopicEnable=true#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭autoCreateSubscriptionGroup=true#Broker 对外服务的监听端口listenPort=10911#删除文件时间点,默认凌晨 4点deleteWhen=04#文件保留时间,默认 48 小时fileReservedTime=120#commitLog每个文件的大小默认1GmapedFileSizeCommitLog=1073741824#ConsumeQueue每个文件默认存30W条,根据业务情况调整mapedFileSizeConsumeQueue=300000#destroyMapedFileIntervalForcibly=120000#redeleteHangedFileInterval=120000#检测物理文件磁盘空间diskMaxUsedSpaceRatio=88#存储路径storePathRootDir=/usr/local/rocketmq/store#commitLog 存储路径storePathCommitLog=/usr/local/rocketmq/store/commitlog#消费队列存储路径存储路径storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue#消息索引存储路径storePathIndex=/usr/local/rocketmq/store/index#checkpoint 文件存储路径storeCheckpoint=/usr/local/rocketmq/store/checkpoint#abort 文件存储路径abortFile=/usr/local/rocketmq/store/abort#限制的消息大小maxMessageSize=65536#flushCommitLogLeastPages=4#flushConsumeQueueLeastPages=2#flushCommitLogThoroughInterval=10000#flushConsumeQueueThoroughInterval=60000#Broker 的角色#- ASYNC_MASTER  异步复制Master#- SYNC_MASTER  同步双写Master#- SLAVEbrokerRole=ASYNC_MASTER#刷盘方式#- ASYNC_FLUSH  异步刷盘#- SYNC_FLUSH  同步刷盘flushDiskType=ASYNC_FLUSH#checkTransactionMessageEnable=false#发消息线程池数量#sendMessageThreadPoolNums=128#拉消息线程池数量#pullMessageThreadPoolNums=128

四.修改日志配置文件

cd 到 2m-noslave

[ulimdev@vm0003 2m-noslave]$ clear[ulimdev@vm0003 2m-noslave]$ cd ../[ulimdev@vm0003 conf]$ ls2m-2s-async  2m-noslave          logback_filtersrv.xml  logback_tools.xml2m-2s-sync   logback_broker.xml  logback_namesrv.xml[ulimdev@vm0003 conf]$ sed -i 's#${user.home}#/ulic/ulimdev/rocketmq/alibaba-rocketmq#g' *.xml

这里用到了 sed命令,他是一个管道命令。sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作。

我们这里使用了 sed -i -i代表直接修改读取的档案内容,而不是由萤幕输出。

我们这里的要求是将所有的日志文件中出现的${user.home}都替换为我们的rocketmq所在的根目录。

我们为了实现这一要求进行了如下操作。

 sed -i 's#${user.home}#/ulic/ulimdev/rocketmq/alibaba-rocketmq#g' *.xml

当我们要替换一行中的某一个字符串时候,我们需要按如下格式编写。支持正则表达式

's/要替换的字符串/新的字符串/g'  

用/来分隔要替换的字符串和新的字符串,最后以g结尾,那么有g和没有g的区别在哪呢,如果没有g,使用g,代表只修改这一行出现的第一个原字符串,如果没有g,会将这一行中所有的原字符串全部替换掉。

修改配置文件后,还可以修改下启动脚本的参数,修改bin/runserver.sh bin/runbroker.sh文件

我这里目前没有修改

AVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:PermSize=128m -XX:MaxPermSize=320m"

四.启动NameServer和Broker

[ulimdev@vm0003 alibaba-rocketmq]$ cd bin[ulimdev@vm0003 bin]$ nohup sh mqnamesrv &

回车后会出现

[1] 25139[ulimdev@vm0003 bin]$ nohup: ignoring input and appending output to `nohup.out'^C

我们来看下

 nohup sh mqnamesrv &

这个命令行回车后会出现

首先我们可以知道 sh mqnamesrv是执行一个shell脚本的命令,这里可以启动NemeServer进程。
而最末尾的&的作用则是:在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 & 在程序结尾来让程序自动运行。即使terminal(终端)关闭,或者电脑死机程序依然运行(前提是你把程序递交到服务器上);

nohup命令则可以将原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用,实现了完整的守护进程功能。。所以,在我们执行完这个命令之后,我们会在 bin目录下发现nohup.out文件。

nohup 命令用途:不挂断地运行命令。语法:nohup Command [ Arg … ] [ & ]描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示”and”的符号)到命令的尾部。无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。退出状态:该命令返回下列出口值:126 可以查找但不能调用 Command 参数指定的命令。127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。nohup命令及其输出文件nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。该命令的一般形式为:nohup command &使用nohup命令提交作业如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:nohup command > myout.file 2>&1 &

启动完NameServer之后,我们需要启动broker

[ulimdev@vm0003 bin]$  nohup sh mqbroker -c /ulic/ulimdev/rocketmq/alibaba-rocketmq/conf/2m-noslave/broker-a.properties  >/dev/null 2>&1 &

这个命令行相比这前启动NameServer的命令行又复杂了,我们来分解下这个命令行

首先 nohup 和&这两个就不再说了。

我们看看

sh mqbroker -c /ulic/ulimdev/rocketmq/alibaba-rocketmq/conf/2m-noslave/broker-a.properties

这里sh mqbroker很好理解就是执行mqbroker脚本,那么这里的-c是什么意思呢,和之前tar命令中的-C是一个意思吗,这里的含义并不相同,首先linux中的参数都是大小写敏感的,而且在不同的命令中,相同的字母代表的参数意义也不一定相同。这里的-c相当于给mqbroker这个shell脚本的执行传递参数,这里的参数是/ulic/ulimdev/rocketmq/alibaba-rocketmq/conf/2m-noslave/broker-a.properties。

相应的英文解释如下:

-c string  If the -c option is present, then commands are read from  string.   If  there  are  arguments  after  the string, they are assigned to the positional parameters, starting with $0.

接下来看

>/dev/null 2>&1

这一块又是什么骚操作呢?

特别是这1和2到底是啥呀

我们知道操作系统中有三个常用的流:
  0:标准输入流 stdin
  1:标准输出流 stdout
  2:标准错误流 stderr

这1和2就分别代表标准输出流 stdout和标准错误流 stderr

2>&1的意思是是把标准错误(2)重定向到标准输出中(1),而标准输出又导入文件output(这里是/dev/null)里面,所以结果是标准错误和标准输出都导入文件output里面了。 至于为什么需要将标准错误重定向到标准输出的原因,那就归结为标准错误没有缓冲区,而stdout有。这就会导致文件output被两次打开,而stdout和stderr将会竞争覆盖,这肯定不是我门想要的。

/dev/null文件的作用,这是一个无底洞,任何东西都可以定向到这里,但是却无法打开。 所以一般很大的stdou和stderr当你不关心的时候可以利用stdout和stderr定向到这里。

其实这个启动broker的程序就是“command >/dev/null 2>&1 &”类型的

  • command: 表示shell命令或者为一个可执行程序
  • >:     表示重定向到哪里
  • /dev/null: 表示Linux的空设备文件
  • &1:   &表示等同于的意思, 2>&1表示2的输出重定向于1
  • &:   表示后台执行,即这条指令执行在后台运行
>/dev/null:表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,不显示任何信息。2>&1:表示标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。这条命令的意思就是在后台执行这个程序,并将错误输出2重定向到标准输出1,然后将标准输出1全部放到/dev/null文件,也就是清空.所以可以看出" > /dev/null 2>&1 "常用来避免shell命令或者程序等运行中有内容输出。

在另一台服务器上也启动NameServer和broker,另一台服务器上的sh mqbroker -c 的参数最后要定位到broker-b.properties

在两台服务器上都启动NameServer服务和broker后,我们使用jps命令来看一下是否启动成功了

jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。