Lily是什么java
Lily是一个可扩展的数据仓库。用于数据的存储和搜索。Lily是一个分布式系统,她并非白手起家的,她依赖于两个已有的OpenSource软件,一个是HBase, 另外一个是SOLR. 同时Lily对于使用者提供本身的操做接口,称做Lily API.架构
Lily的优点在于她强大的搜索能力,不管是文本匹配仍是全文索引,统统都能搞定。但我以为Lily在获取这些优点的同时付出了至关大的代价,最主要的代价就是系统的复杂性。想一想看,为了可以使用Lily,你须要安装并维护如下系统:HDFS, HBase, Zookeeper, SOLR, Lily. 这些系统任何一个均可能让Operation Team抓狂,更不用说他们混在一块儿了。异步
Lily的架构分布式
1.整体架构.net
Lily使用分布式的架构,这包括两方面:1) Lily拥有多个Node,不一样的Node完成不一样的工做,相互合做共同完成任务。2) Lily拥有多个Node,每一个Node都完成同样的工做,这样能够保证可扩展性和容错性。设计
Lily的大体架构可用这张图来表示:blog
先将这张图分红左右两边,左边是Lily的系统,右边是Lily依赖的系统,从上至下是HBase, HDFS, SOLR, Zookeeper. 后面咱们会分析每一个Lily Node的内部结构,如今咱们先来分析一下Lily的每一个依赖:索引
Zookeeper, 每一个Lily Node用Zookeeper来发布本身的存在,就好像HBase RegionServer同样。Client能够从Zookeeper获取当前有多少个Lily Node在提供服务。接口
SOLR,为全文索引提供服务,具体的使用方法是Lily Node将插入的内容同步输出到SOLR Node,SOLR本身生成全文索引,Client直接call SOLR(不通过Lily Node)获取搜索结果。get
HDFS,它和Lily Node其实没有直接联系,换句话说Lily能够忽视他的存在。HDFS的做用就是存储HBase的数据,或者直接供Client使用,但这和Lily没什么关联。
HBase,和Lily Node的联系最为紧密,Lily Node做为中间层,接到Client的写入请求之后将数据写入HBase,并加上本身的数据以实现Secondary Index. 这个实现能够说和GMS很类似,但Lily的设计更为复杂。
2. Lily Node的内部结构
多个Lily Node组成了Lily的系统,咱们经过观察每一个Node内部的结构来了解Lily的工做原理。这张图描述了每一个Lily Node的内部结构:
这张图稍微有点复杂,咱们略过依赖的module,看看Lily Node内部有哪些module: Repository, WAL, MQ(Message Queue), Indexer, LinkIndex.
Repository:
这个是Client操做的入口,Client使用基于Avro的协议(相似于PB)操做Repository,而Repository使用HBase标准的Java API操做HBase. 除了基本的HBase操做,Repository还有添加Secondary Index信息的任务。为了保证Index信息和原始信息的最终一致性,须要用到WAL. Repository在每次操做的最开始写WAL log, 而后原始操做,写WAL, 再Index操做,写WAL. 一步一标记,失败了就把没作的事情重作一遍. 都作完了写入MQ, 将任务转交个后续处理模块.
WAL:
前面已经介绍过了,这个模块是保证最终一致性用的. 它和HBase的WAL没什么联系,实现方式也不一样。不过我以为若是想让WAL有保证的化应该将log写入分布式文件系统中,好比HDFS. 但Lily的作法貌似更绝,使用HBase的一个Table来存储WAL,简单,可是加大了依赖性,并且可能会产生更多相互依赖的问题。
Message Queue:
为何要有Message Queue?由于有些操做不须要当时完成,丢到MQ里面由后续模块异步慢慢完成好了, 好比说将新的内容同步到SOLR. 所以MQ产生了,如何实现?仍是老办法,用HBase里面的一个Table来实现。
Indexer:
Indexer的主要功能是同步SOLR,进而实现全文索引。由于操做SOLR使用的是公开的API,且Lily无论查询工做,因此Indexer也不会很复杂。
LinkIndex:
根据Index来查找具体类容的模块,Repository和Indexer都会用到,具体实现细节还须要研究源码才能得知.
总结
说到这里你们对于Lily因该已经有大概的认识了. 我这里总结一下Lily的优缺点.
优势:支持多种搜索,设计上没有大的缺陷.
缺点:复杂,管理困难,client必须使用Lily的API才能享受其功能,对于HBase至关依赖却又不能融入其中。
对于咱们来讲也许作一个轻量级的Secondary Index真的有些意义。