进入下载目录
- cd /usr/local
下载ZooKeeper
- wget http://fnil.net/downloads/metaq-server-1.4.6.2.tar.gz
解压缩
- tar -zxvf metaq-server-1.4.6.2.tar.gz
配置Broker
默认server.ini提供了一个topic——test用于测试,你可以添加自己定义的topic
[topic=mytopic]
;是否启用统计
stat=true
;这个topic指定分区数目,如果没有设置,则使用系统设置
numPartitions=10
;删除策略的执行时间,cron表达式
deleteWhen=0 0 6,18 * * ?
大多数system参数都可以topic参数所覆盖。 另外我自己重新根据sample.server.ini文件写了一个新的,可以参考我的
brokerId=109留心dataPath=/var/metaq/data dataPath=/var/metaq/log确保你已经创建好了这两个目录
;;服务器hostname,可以为空,默认将取本机IP
hostName=
;;默认每个topic的分区数目,默认为1
numPartitions=1
;;服务器端口,必须
serverPort=8123
;;管理平台HTTP端口,必须
dashboardHttpPort=8120
;;数据文件路径,默认在user.home/meta下
dataPath=/var/metaq/data
;;日志数据文件路径,默认跟dataPath一样
dataLogPath=/var/metaq/log
;;是否启用并行记载数据,当数据过多的时候,启用此选项可加快启动速度,
;;但是会打乱启动的日志顺序,默认不启用。
loadMessageStoresInParallel=false
;最大允许的未flush消息数,超过此值将强制force到磁盘,默认1000
unflushThreshold=1000
;;最大允许的未flush间隔时间,毫秒,默认10秒
;unflushInterval=10000
unflushInterval=1000
;;单个文件的最大大小,实际会超过此值,默认1G
maxSegmentSize=1073741824
;;传输给客户端每次最大的缓冲区大小,默认1M
maxTransferSize=1048576
;;处理get请求的线程数,默认cpus*10
getProcessThreadCount=180
;;处理put请求线程数,默认cpus*10
putProcessThreadCount=180
;;数据删除策略,默认超过7天即删除,这里的168是小时,10s表示10秒,10m表示10分钟,10h表示10小时,默认为小时
deletePolicy=delete,48
;;删除策略的执行时间,cron表达式
deleteWhen=0 0 6,18 * * ?
;;事务相关配置
;;最大保存事务checkpoint数目,默认为3
maxCheckpoints=3
;事务checkpoint时间间隔,单位毫秒,默认1小时
checkpointInterval=3600000
;;最大事务超时事件数,用于监控事务超时
maxTxTimeoutTimerCapacity=30000
;;最大事务超时时间,单位秒
maxTxTimeoutInSeconds=60
;;事务日志的刷盘设置,0表示让操作系统决定,1表示每次commit都刷盘,2表示每隔1秒刷盘一次
flushTxLogAtCommit=1
;;是否接收消息,默认为true,可被topic配置覆盖
acceptPublish=true
;;是否接受订阅,默认为true,可被topic配置覆盖
acceptSubscribe=true
;;;当消费者的offset不在Broker的数据范围内,则强制更新消费者的offset为当前最大offset。
;;;在生产环境,请设置此选项为false,默认为false
;;;在开发和测试环境,建议设置为true,因为开发测试的时候,可能要经常删除消息数据,此选项可让消费者自动纠正offset。
updateConsumerOffsets=false
;; 是否启用实时统计,针对每个topic做实时的流量统计,可被topic配置覆盖。
stat=true
[zookeeper]
zk.zkConnect=localhost:2181
zk.zkSessionTimeoutMs=30000
zk.zkConnectionTimeoutMs=30000
zk.zkSyncTimeMs=5000
;; Topics section
[topic=test]
[topic=meta-test]
mkdir /var/metaq/data
mkdir /var/metaq/log
启动&验证
确保你的机器上安装了JDK并正确设置JAVA_HOME和PATH变量,启动服务器:
- /usr/local/taobao/metamorphosis-server-wrapper/bin/metaServer.sh start local
当然如果要关闭,则是stop
/usr/local/taobao/metamorphosis-server-wrapper/bin/metaServer.sh stop
如何验证呢,继续看吧
除了通过观察日志logs/metaServer.log外,你还可以通过stats命令来观察服务器运行状况。bin/metaServer.sh stats
=>
STATS
pid 7244
broker_id 0
port 8123
uptime 2057
version 1.4.2
curr_connections 1
threads 35
cmd_put 0
cmd_get 0
cmd_offset 0
tx_begin 0
tx_xa_begin 0
tx_commit 0
tx_rollback 0
get_miss 0
put_failed 0
total_messages 0
topics 2
config_checksum 718659887
END
开机自启动
首先请登陆你的linux服务器在/etc/rc.d/init.d/目录下创建一个文件
- touch /etc/init.d/metaq
给启动脚本赋予执行权限
- chmod +x /etc/init.d/metaq
接着用vi metaq来编辑这个文件
接着在metaq里面输入如下内容
#!/bin/bash
#chkconfig:2345 20 90
#description:zookeeper
#processname:zookeeper
case $1 in
start) /usr/local/taobao/metamorphosis-server-wrapper/bin/metaServer.sh start local;;
stop) /usr/local/taobao/metamorphosis-server-wrapper/bin/metaServer.sh stop;;
stats) /usr/local/taobao/metamorphosis-server-wrapper/bin/metaServer.sh stats;;
restart) /usr/local/taobao/metamorphosis-server-wrapper/bin/metaServer.sh restart;;
*) echo "require start|stop|stats|restart";;
esac
然后保存退出
先按esc
然后按:键盘
接这个输入wq即可保存退出
添加服务
- chkconfig --add metaq
设置开机启动
- chkconfig --level 35 metaq on
查看是否设置成功
- chkconfig --list | grep metaq
集群模式配置
上文提到的启动方式是以本地模式也就是单机模式启动,它将启动一个内置的zookeeper,并将broker注册到该zookeeper。这对于单机应用或者测试开发是最便捷方式的。
但是MetaQ是作为分布式软件设计的,更通常作为一个集群提供服务。MetaQ的集群管理是利用zookeeper实现的,因此首先需要配置zookeeper。 一个MetaQ集群必须使用同一个zookeeper集群。
Broker集群配置非常容易,假设你已经按照如何开始和服务器配置管理配置好并启用了你第一台broker,某一天你发现这个单台
broker无法支撑更大的消息量,那么你可能就需要
引入更多的broker作为集群来提供服务,你要做的事情很简单:
- 拷贝broker1的配置文件conf/server.ini到新的broker,假设为broker2。
- 修改broker2的server.ini,只要修改brokerId为另一个不同于broker1的值即可
- 启动broker2,这样一来broker2将和broker1组成一个服务器集群
- 在这个过程中你不需要重启任何现有的服务,包括生产者、消费者和broker1,他们都将自动感知到新的broker2
brokerId: 服务器集群中唯一的id,必须为整型0-1024之间。对服务器集群的定义是使用同一个zookeeper并且在zookeeper上的root
path相同,具体参见zookeeper配置。
也就是说和你的zookeeper中的/var/zookeeper/data/myid 中的id对应就好了
另外请记得修改conf/server.ini文件中的zookeeper配置,保证zookeeper地址正确:
zk.zkConnect=localhost:2181 修改为各个集群ip的地址,如
zk.zkConnect=192.168.1.101:2181,192.168.1.102:2181,192.168.1.103:2181
各个集群中的zookeeper配置都如此
停止local模式启动的broker1, 并重新以集群模式启动:
service metaq stop
service metaq start
高可用配置
Meta相比于kafka的一个重要特性就是消息高可用方案的实现,我们称之为HA方案。消息在发送到broker之后立即写入磁盘才返回客户端告诉消息生产者消息发送成功,通过unflushThreshold和unflushInterval两个参数的控制,可以保证单机消息数据的安全性,只要机器的磁盘没有永久损坏,消息总可以在重启后恢复并正常投递给消费者们。但是,如果遇到了磁盘永久损坏或者数据文件永久损坏的情况,那么该broker上的消息数据将可能永久丢失。为了防止这种情况的发生,一个可行的方案就是将消息数据复制到多台机器,类似mysql的主从复制功能
异步复制配置
配置slave文件。编辑conf/async_slave.properties:
#slave编号,大于等于0表示作为slave启动,同一个master下的slave编号应该设不同值.slaveId 和zookeeper的pid文件对应,切记
slaveId=0
#作为slave启动时向master订阅消息的group,如果没配置则默认为meta-slave-group
slaveGroup=meta-slave-group
#slave数据同步的最大延时,单位毫秒
slaveMaxDelayInMills=500
#是否自动从master同步server.ini
#第一次仍然需要自己拷贝server.ini,后续可以通过设置此选项为true来自动同步
autoSyncMasterConfig=true
执行下列命令启动slave:
bin/metaServer.sh start slave
那么作为从机对应的etc/init.d/metaq 文件的启动配置也要做相应的修改
第一次复制因为需要跟master完全同步需要耗费一定时间,你可以在数据文件的目录观察复制情况。
请注意,异步复制的slave将参与消费者的消费活动,消息消费者可以从slave中获取消息并消费,消费者会随机从master和slaves中挑选一台作为消费broker。
从1.4.2开始,可以通过autoSyncMasterConfig选项配置是否自动同步master的server.ini到异步复制的slave上,当master的server.ini文件变更并通过bin/metaServer.sh reload之后,slave将监控到这一变更并自动同步。