开源分布式存储系统:katta

jopen 10年前

Katta是一个可扩展的、故障容错的、分布式实施访问的数据存储。

Katta可用于大量、重复、索引的碎片,以满足高负荷和巨大的数据集。这些索引可以是不同的类型。当前该实现在LuceneHadoop mapfiles

  • 让大型高负荷的索引变简单
  • 能为许多具有大型Lucene或Hadoop Mapfile 的索引碎片的服务器提供服务
  • 在不同服务器上复制碎片以保证性能和容错性
  • 支持插件化的网络拓扑
  • 故障管理
  • 快速、轻量级、易于集成
  • 与Hadoop集群工作良好
  • Apache License,Version 2.0

Intro

Katta is a distributed application running on many commodity hardware servers very similar to Hadoop MapReduce, Hadoop DFS, HBase, Bigtable or Hypertable

Overview

master负责管理节点和索引分片。节点为索引分片服务。客户端可以去所有节点搜索并合并结果集。目录/分片种类可以不同,取决于节点服务器的内容服务器

Content Server

每个节点负责一个内容服务器。现在提供Lucene indices和 Hadoop mapfiles. 你可以实现自己的

数据结构

索引文件夹由子索引分片文件夹组成。如lucene的索引分片能用indexwriter创造,仅仅简单把lucene的索引集合起来。所以katta的目录能被mapreduce制造。你可以构造自己想要的索引

主节点通信

katta通过zk实现通信,把信息写在虚拟文件系统里。节点启动时写入临时文件/node/live
master订阅虚拟文件系统的任何改变,当节点失败的时候,zk移除虚拟文件并通知master。
主节点和次主节点也是通过类似方式,由活跃的master写在/master里
master和nodes都各自有个queue,用来处理自己的操作和任务,具体的:
       - 客户端分配索引部署任务给master queue
       - master布置分片任务给nodes
       - node做自己queue里的任务,比如去hdfs里拷文件加到lucene内容服务器里,成功后记录在zk下的“/shard-to-nodes”文件里
       - node成功或crash的结果通告给master,然后在zk里公布索引以及一些元数据,如“/indices/indexX”

       - 搜索客户端监视目录文件夹,会被通知更新.通过读取“/shard-to-nodes” 文件夹,获知哪些node在服务新的索引分片

客户端节点通信

客户端要和所有节点通信.使用hadoop RPC(很快且比较容易用java实现同步).对搜索请求,发送给所有需要去找索引分片搜索的nodes.请求是多线程处理的,而且hadoop RPC保持TCP/IP连接

给node装载分片

katta先把分片复制到node的硬盘驱动器。映射的时候是hdfs地址,也支持S3。为了不减慢搜索,为分片部署提供节流机制。

为lucene的评分实现分布式

由于term在分布式情况下在每个分片里不平均,所以每次请求进行两轮:
1. 从所有node里得到doc的频率
2. 把这个值和请求发给所有node去搜索

(意思是在第一算得总数,第二轮的时候各个node可以各自计算各自搜素结果的权重)

整合

DeployClient.java for deploying and un-deploying of indices.
ILuceneClient.java for querying lucene indices (uses Client.java).

IMapFileClient.java.java for querying hadoop mapfiles  (Client.java).

开源分布式存储系统:katta