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真的有些意義。