博客公告:
(1)本博客所有博客文章搬迁至《博客虫》http://blogchong.com/
(4)该博客内容还会继续更新,不过会慢一些。
该文档为实实在在的原创文档,转载请注明:
http://blog.sina.com.cn/s/blog_8c243ea30101iyqo.html
类型 |
详细 |
备注 |
该文档为MetaQ调研及安装部署文档,增加对MetaQ的理解,指导MetaQ的安装部署,在部署完MetaQ环境后,会把MetaQ集成到项目代码中,有兴趣的请继续关注。 |
相关描述 |
² ² ² ² |
目录
1 文档说明
该文档MetaQ的调研文档及安装部署文档。对一个新的开源项目进行学习,个人喜欢对其先进行详细的调研,虽然网上关于MetaQ的资料众多,但个人喜欢将其以自己习惯的方式整理出来,方便以后查询。
关于写该文档的目的,首先是想要了解更多关于MetaQ应用方面的技术,以前接触过一点点MetaQ,如今想要更加系统的学习一下它。
个人想在自己的电脑环境中部署一个MetaQ的环境,用于Storm与MetaQ的接口研究。
本文档大部分资料参考自Github的相关文档及其他网络上的资料。
2 MetaQ调研
2.1 开源项目来源及简介
Metamorphosis是淘宝开源项目的一个消息中间件,多数人又简称其为MetaQ。该项目据闻是当年淘宝的伯岩大神(庄晓丹)与无花大神大神等开发出来的。至今在Github有相关的开源代码及相关的搭配文档。
METAQ是一款完全的队列模型消息中间件,服务器使用Java语言编写,可在多种软硬件平台上部署。客户端支持Java、C++编程语言。单台服务器可支持1万以上个消息队列,通过扩容服务器,队列数几乎可任意横向扩展。每个队列都是持久化、长度无限(取决于磁盘空间大小)、并且可从队列任意位置开始消费。
基本概括:
(1) MetaQ是一个队列模式的消息中间件;
(2) 消费者、生产者及队列都可以分布式;
(3)生产者向一些队列轮流发送消息,队列集合称为Topic,消费者如果做一个广播消费,则一个消费者实例消费这个Topic对应的所有队列,如果做集群消费,则多个实例平均消费Topic对应的队列集合。
PS:在Github上找到无花大神写的metaq与storm接口及http接口的相关源码,顿时让我泪牛满面啊~~!
2.2 相关术语
Producer:
消息生产者,负责产生消息,一般由业务系统负责产生消息。
Consumer:
消息消费者,负责消费消息,一般是后台系统负责异步消费。
Consumer Group:
一类Consumer的集合名称,这类Consumer通常消费一类消息,且消费逻辑一致。
Topic:
消息的主题,由用户定义并在服务器端配置。Producer发送消息到某个Topic下,Consumer从Topic下消费消息。
Broker:
消息中转角色,负责存储消息,转发消息,一般也称为Server,在JMS规范中称为Provider。
同一个topic下面还分为多个分区,如meta-test这个topic我们可以分为10个分区,分别有两台服务器提供,那么可能每台服务器提供5个分区,假设服务器id分别为0和1,则所有分区为0-0、0-1、0-2、0-3、0-4、1-0、1-1、1-2、1-3、1-4。
消息在broker上的每个分区都是组织成一个文件列表,消费者拉取数据需要知道数据在文件中的偏移量,这个偏移量就是所谓offset。Offset是绝对偏移量,服务器会将offset转化为具体文件的相对偏移量。
广播消费:
一条消息被多个Consumer消费,即使这些Consumer属于同一个ConsumerGroup,消息也会被组中的每一个Consumer消费一次。
集群消费:
一个Consumer Group中的Consumer实例平均分摊消费消息。
主动消费:
Consumer主动向Broker发起获取消息请求,控制权完全在于Consumer应用。
被动消费:
Consumer注册一个Callback接口,由MetaQ后台自动从Broker接收消息,并回调Callback接口。
顺序消息:
消费消息的顺序要同发送消息的顺序一致,在MetaQ中,主要指的是局部顺序,即一类消息为满足顺序性,必须Producer单线程顺序发送,且发送到同一个队列中。
普通顺序消息:
顺序消息中的一种,正常情况下保证消息的顺序,但发生异常后,例如Broker重启,队列发生变化,产生短暂的消息顺序不一致。
严格顺序消息:
顺序消息的一种,无论什么情况下都能保证消息的顺序,牺牲了分布式的Failover的特性。
Message Queue:
在MetaQ中,所有的消息队列都是持久化,长度无限的数据结构,所谓长度无限是指队列中的每个存储单元都是定长,访问其中的存储单元使用Offset来访问,Offset为javalong类型,64位,理论上在100年内不溢出,所以认为是长度无限,队列中只保留几天的数据,之前的数据会被定时删除。
Messaging System:
消息中间件的统称,但不局限于消息中间件,与消息传输相关的类似系统。
2.3 MetaQ与Kafka的区别
MetaQ与Kafka的相似度还是挺高的,具体区别见下图:
总体来说,MetaQ的设计参照了Kafka,但又在这个基础上作了很多改进(开发者的原话)。
2.4 MetaQ的应用
(1) 日志传输,用于高吞吐量的日志传输;
(2) 消息广播,将消息放入Topic中,供所有的消费者消费;
(3) 数据的顺序同步功能,如mysql binlog复制;
(4)分布式环境下(broker、producer、consumer都为集群)的消息路由,对顺序和可靠性有极高的要求的应用场景;
(5) 作为一般的MQ来使用其功能。
3 安装部署
3.1 MetaQ服务器安装
MetaQ的安装比较简单,只需要将服务器包下载下来解压到指定位置就行。
例如,下载metaq-server-1.4.6.2.tar.gz
使用tar –zxvf metaq-server-1.4.6.2.tar.gz即可。
一般情况下,我们需要用到的是其bin下的几个服务器脚本。
(1)
(2)
(3)
(4)
3.2 关闭启动服务器
启动服务器:
Opt/bin/metaServer.sh start local
关闭服务器:
Opt/bin/metaServer.sh stop
查看服务器状态:
Opt/bin/metaServer.sh status
3.3 配置集群模式
3.3.1 配置zookeeper
关于ZK集群安装请查看个人文档《storm调研及安装部署》,在那个文档中由于storm安装部署用到了ZK,所有有相关的内容。
在opt/conf目录下打开server.ini文件,配置如下关联的ZK信息:
;zk的服务器列表
zk.zkConnect=zookeeperHost:2181
;zk心跳超时,单位毫秒,默认30秒
zk.zkSessionTimeoutMs=30000
;zk连接超时时间,单位毫秒,默认30秒
zk.zkConnectionTimeoutMs=30000
;zk数据同步时间,单位毫秒,默认5秒
zk.zkSyncTimeMs=5000
注:如果ZK部署成一个集群,在只需要写一个zookeeper路径即可,且每一个MetaQ集群节点都如上配置。
以上为基本配置,其他配置可以参考conf/server_sample.ini示范文件。
3.3.2 启动服务
在MetaQ集群的每一个节点上启动服务,如下:
metaServer.sh start
//后面不添加local则为集群模式启动。