锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲综合色区中文字幕,亚洲AV无码专区国产乱码4SE ,亚洲va成无码人在线观看http://www.tkk7.com/sandy/archive/2012/03/21/leveldb11.html灝忔槑灝忔槑Wed, 21 Mar 2012 09:30:00 GMThttp://www.tkk7.com/sandy/archive/2012/03/21/leveldb11.htmlhttp://www.tkk7.com/sandy/comments/372372.htmlhttp://www.tkk7.com/sandy/archive/2012/03/21/leveldb11.html#Feedback1http://www.tkk7.com/sandy/comments/commentRss/372372.htmlhttp://www.tkk7.com/sandy/services/trackbacks/372372.html
鍏堢湅鐪婻eadOptions鏈夊摢浜涘弬鏁板彲浠ユ寚瀹氾細(xì)
// Options that control read operations
struct ReadOptions {
  
// 鏄惁媯(gè)鏌hecksum
  
// Default: false
  bool verify_checksums;

  
// 鏄惁灝嗘嬈$粨鏋滄斁鍏ache
  
// Default: true
  bool fill_cache;

  
//鏄惁鎸囧畾snapshot,鍚﹀垯璇誨彇褰撳墠鐗堟湰
  
// Default: NULL
  const Snapshot* snapshot;

  ReadOptions()
      : verify_checksums(
false),
        fill_cache(
true),
        snapshot(NULL) {
  }
};

涓嬮潰鐪嬬湅璇誨彇鐨勮緇嗚繃紼嬶細(xì)
鏌ヨmemtable=>鏌ヨprevious memtable(imm_)=>鏌ヨ鏂囦歡(緙撳啿錛?br />
Status DBImpl::Get(const ReadOptions& options,
                   
const Slice& key,
                   std::
string* value) {
  Status s;
  MutexLock l(
&mutex_);
  SequenceNumber snapshot;
  
//璁劇疆snapshot
  if (options.snapshot != NULL) {
    snapshot 
= reinterpret_cast<const SnapshotImpl*>(options.snapshot)->number_;
  } 
else {
    snapshot 
= versions_->LastSequence();
  }

  MemTable
* mem = mem_;
  MemTable
* imm = imm_;
  Version
* current = versions_->current();
  mem
->Ref();
  
if (imm != NULL) imm->Ref();
  current
->Ref();

  
bool have_stat_update = false;
  Version::GetStats stats;

  
// Unlock while reading from files and memtables
  {
    mutex_.Unlock();
    LookupKey lkey(key, snapshot);
    
//鍏堟煡璇emtable
    if (mem->Get(lkey, value, &s)) {
      
// Done
    } else if (imm != NULL && imm->Get(lkey, value, &s)) { //鐒跺悗鏌ヨprevious memtable:imm_
      
// Done
    } else {
      
//浠庢枃浠朵腑璇誨彇
      s = current->Get(options, lkey, value, &stats);
      have_stat_update 
= true;
    }
    mutex_.Lock();
  }

  
//鏄惁鏈夋枃浠墮渶瑕佽compaction,鍙傝allowed_seek
  if (have_stat_update && current->UpdateStats(stats)) {
    MaybeScheduleCompaction();
  }
  mem
->Unref();
  
if (imm != NULL) imm->Unref();
  current
->Unref();
  
return s;
}


閲嶇偣鏉ョ湅鐪嬩粠version涓鍙栵細(xì)
Status Version::Get(const ReadOptions& options,
                    
const LookupKey& k,
                    std::
string* value,
                    GetStats
* stats) {
  Slice ikey 
= k.internal_key();
  Slice user_key 
= k.user_key();
  
const Comparator* ucmp = vset_->icmp_.user_comparator();
  Status s;

  stats
->seek_file = NULL;
  stats
->seek_file_level = -1;
  FileMetaData
* last_file_read = NULL;
  
int last_file_read_level = -1;

  
//浠巐evel0鍚戦珮灞傛煡鎵撅紝濡傛灉鍐嶄綆綰evel涓煡鍒幫紝鍒欎笉鍐嶆煡璇?/span>
  std::vector<FileMetaData*> tmp;
  FileMetaData
* tmp2;
  
for (int level = 0; level < config::kNumLevels; level++) {
    size_t num_files 
= files_[level].size();
    
//鏈眰鏂囦歡鏁頒負(fù)絀猴紝鍒欒繑鍥?/span>
    if (num_files == 0continue;

    
// Get the list of files to search in this level
    FileMetaData* const* files = &files_[level][0];
    
if (level == 0) {
      
//level0鐗規(guī)畩澶勭悊錛屽洜涓簁ey鏄噸鍙狅紝鎵鏈夌鍚堟潯浠剁殑鏂囦歡蹇呴』琚煡鎵?/span>
      tmp.reserve(num_files);
      
for (uint32_t i = 0; i < num_files; i++) {
        FileMetaData
* f = files[i];
        
if (ucmp->Compare(user_key, f->smallest.user_key()) >= 0 &&
            ucmp
->Compare(user_key, f->largest.user_key()) <= 0) {
          tmp.push_back(f);
        }
      }
      
if (tmp.empty()) continue;

      std::sort(tmp.begin(), tmp.end(), NewestFirst);
      files 
= &tmp[0];
      num_files 
= tmp.size();
    } 
else {
      
// 浜屽垎娉曟煡鎵撅紝鏌愪釜key鍙彲鑳藉睘浜庝竴涓枃浠?/span>
      uint32_t index = FindFile(vset_->icmp_, files_[level], ikey);
      
//娌℃湁鏌ュ埌
      if (index >= num_files) {
        files 
= NULL;
        num_files 
= 0;
      } 
else {
        tmp2 
= files[index];
        
if (ucmp->Compare(user_key, tmp2->smallest.user_key()) < 0) {
          
// All of "tmp2" is past any data for user_key
          files = NULL;
          num_files 
= 0;
        } 
else {
          files 
= &tmp2;
          num_files 
= 1;
        }
      }
    }

    
for (uint32_t i = 0; i < num_files; ++i) { //閬嶅巻鏈眰絎﹀悎鏉′歡鐨勬枃浠?/span>
      if (last_file_read != NULL && stats->seek_file == NULL) {
        
//seek_file鍙褰曠涓涓?/span>
        stats->seek_file = last_file_read;
        stats
->seek_file_level = last_file_read_level;
      }

      FileMetaData
* f = files[i];
      last_file_read 
= f;
      last_file_read_level 
= level;
      
      
//浠巘able cache涓鍙?/span>
      Iterator* iter = vset_->table_cache_->NewIterator(
          options,
          f
->number,
          f
->file_size);
      iter
->Seek(ikey);
      
const bool done = GetValue(ucmp, iter, user_key, value, &s);
      
if (!iter->status().ok()) { //鏌ユ壘鍒?/span>
        s = iter->status();
        delete iter;
        
return s;
      } 
else {
        delete iter;
        
if (done) {
          
return s;
        }
      }
    }
  }

  
return Status::NotFound(Slice());  // Use an empty error message for speed
}

緇х畫(huà)璺熻釜錛歍ableCache

Iterator* TableCache::NewIterator(const ReadOptions& options,
                                  uint64_t file_number,
                                  uint64_t file_size,
                                  Table
** tableptr) {
  
if (tableptr != NULL) {
    
*tableptr = NULL;
  }

  
char buf[sizeof(file_number)];
  EncodeFixed64(buf, file_number);
  Slice key(buf, 
sizeof(buf));

  
//浠嶭RU cache涓煡鎵?/span>
  Cache::Handle* handle = cache_->Lookup(key);
  
if (handle == NULL) { 
    
/鍔犺澆鏂囦歡
    std::
string fname = TableFileName(dbname_, file_number);
    RandomAccessFile
* file = NULL;
    Table
* table = NULL;
    Status s 
= env_->NewRandomAccessFile(fname, &file);
    
if (s.ok()) {
      s 
= Table::Open(*options_, file, file_size, &table);
    }

    
if (!s.ok()) {
      assert(table 
== NULL);
      delete file;
      
// We do not cache error results so that if the error is transient,
      
// or somebody repairs the file, we recover automatically.
      return NewErrorIterator(s);
    }

    
//鎻掑叆Cache
    TableAndFile* tf = new TableAndFile;
    tf
->file = file;
    tf
->table = table;
    handle 
= cache_->Insert(key, tf, 1&DeleteEntry);
  }

  Table
* table = reinterpret_cast<TableAndFile*>(cache_->Value(handle))->table;
  
//浠嶵able瀵硅薄涓敓鎴恑terator
  Iterator* result = table->NewIterator(options);
  result
->RegisterCleanup(&UnrefEntry, cache_, handle);
  
if (tableptr != NULL) {
    
*tableptr = table;
  }
  
return result;
}




灝忔槑 2012-03-21 17:30 鍙戣〃璇勮
]]>
leveldb鐮旂┒10- 嫻佺▼鍒嗘瀽錛氬啓鏁版嵁http://www.tkk7.com/sandy/archive/2012/03/21/leveldb10.html灝忔槑灝忔槑Wed, 21 Mar 2012 06:41:00 GMThttp://www.tkk7.com/sandy/archive/2012/03/21/leveldb10.htmlhttp://www.tkk7.com/sandy/comments/372345.htmlhttp://www.tkk7.com/sandy/archive/2012/03/21/leveldb10.html#Feedback0http://www.tkk7.com/sandy/comments/commentRss/372345.htmlhttp://www.tkk7.com/sandy/services/trackbacks/372345.html
褰卞搷鍐欐ц兘鐨勫洜绱犳湁錛?br />1. write_buffer_size
2. kL0_SlowdownWritesTrigger and kL0_StopWritesTrigger.鎻愰珮榪欎袱涓鹼紝鑳藉澧炲姞鍐欑殑鎬ц兘錛屼絾鏄檷浣庤鐨勬ц兘

鐪嬬湅WriteOptions鏈夊摢浜涘弬鏁板彲浠ユ寚瀹?br />
struct WriteOptions {
  
//璁劇疆sync=true,leveldb浼?xì)璋冪敤fsync()錛岃繖浼?xì)闄嶄綆鎻掑叆鎬ц兘
  
//鍚屾椂浼?xì)澧炲姞鏁版嵁鐨勫畨鍏ㄦ?nbsp;
  
//Default: false
  bool sync;

  WriteOptions()
      : sync(
false) {
  }
};


棣栧厛鎶奒ey,value杞垚WriteBatch
Status DB::Put(const WriteOptions& opt, const Slice& key, const Slice& value) {
  WriteBatch batch;
  batch.Put(key, value);
  
return Write(opt, &batch);
}

鎺ヤ笅鏉ュ氨鏄湡姝g殑鎻掑叆浜?br />榪欓噷浣跨敤浜?jiǎn)涓ゆ妸閿佸Q屼富瑕佹槸鎯蟲(chóng)彁楂樺茍鍙戣兘鍔涳紝鍑忓皯涓婇攣鐨勬椂闂淬?br />棣栧厛鏄鏌ユ槸鍚﹀彲鍐欙紝鐒跺悗append log錛屾渶鍚庢槸鎻掑叆memtable
<db/dbimpl.cc>

Status DBImpl::Write(const WriteOptions& options, WriteBatch* updates) {
  Status status;
  
//鍔犻攣
  MutexLock l(&mutex_);
  LoggerId self;
  
//鎷垮埌鍐檒og鐨勬潈鍒?/span>
  AcquireLoggingResponsibility(&self);
  
//媯(gè)鏌ユ槸鍚﹀彲鍐?/span>
  status = MakeRoomForWrite(false);  // May temporarily release lock and wait
  uint64_t last_sequence = versions_->LastSequence();
  
if (status.ok()) {
    WriteBatchInternal::SetSequence(updates, last_sequence 
+ 1);
    last_sequence 
+= WriteBatchInternal::Count(updates);

    
// Add to log and apply to memtable.  We can release the lock during
    
// this phase since the "logger_" flag protects against concurrent
    
// loggers and concurrent writes into mem_.
    {
      assert(logger_ 
== &self);
      mutex_.Unlock();
      
//IO鎿嶄綔錛氬啓鍏OG
      status = log_->AddRecord(WriteBatchInternal::Contents(updates));
      
if (status.ok() && options.sync) {
        status 
= logfile_->Sync();
      }
      
//鎻掑叆memtable
      if (status.ok()) {
        status 
= WriteBatchInternal::InsertInto(updates, mem_);
      }
      mutex_.Lock();
      assert(logger_ 
== &self);
    }
    
//璁劇疆鏂扮殑seqence number
    versions_->SetLastSequence(last_sequence);
  }
  
//閲婃斁鍐橪OG閿?/span>
  ReleaseLoggingResponsibility(&self);
  
return status;
}

鍐欐祦閲忔帶鍒訛細(xì)
<db/dbimpl.cc>
Status DBImpl::MakeRoomForWrite(bool force) {
  mutex_.AssertHeld();
  assert(logger_ 
!= NULL);
  
bool allow_delay = !force;
  Status s;
  
while (true) {
    
if (!bg_error_.ok()) {
      
// Yield previous error
      s = bg_error_;
      
break;
    } 
else if ( 
        allow_delay 
&&
        versions_
->NumLevelFiles(0>= config::kL0_SlowdownWritesTrigger) {
      mutex_.Unlock();
      
//濡傛灉level0鐨勬枃浠跺ぇ浜巏L0_SlowdownWritesTrigger闃堝鹼紝鍒檚leep 1s錛岃繖鏍風(fēng)粰compaction鏇村鐨凜PU
      env_->SleepForMicroseconds(1000);
      allow_delay 
= false;  // Do not delay a single write more than once
      mutex_.Lock();
    } 
else if (!force &&
               (mem_
->ApproximateMemoryUsage() <= options_.write_buffer_size)) {
      
//鍙啓
      break;
    } 
else if (imm_ != NULL) {
      
// imm_:涔嬪墠鐨刴emtable 娌℃湁琚玞ompaction錛岄渶瑕佺瓑寰?/span>
      bg_cv_.Wait();
    } 
else if (versions_->NumLevelFiles(0>= config::kL0_StopWritesTrigger) {
      
// level0鏂囦歡涓暟澶т簬kL0_StopWritesTrigger,闇瑕佺瓑寰?/span>
      Log(options_.info_log, "waiting\n");
      bg_cv_.Wait();
    } 
else {
      
//鐢熸垚鏂扮殑棰漨emtable鍜宭ogfile錛屾妸褰撳墠memtable浼犵粰imm_
      assert(versions_->PrevLogNumber() == 0);
      uint64_t new_log_number 
= versions_->NewFileNumber();
      WritableFile
* lfile = NULL;
      s 
= env_->NewWritableFile(LogFileName(dbname_, new_log_number), &lfile);
      
if (!s.ok()) {
        
break;
      }
      delete log_;
      delete logfile_;
      logfile_ 
= lfile;
      logfile_number_ 
= new_log_number;
      log_ 
= new log::Writer(lfile);
      imm_ 
= mem_;
      has_imm_.Release_Store(imm_);
      mem_ 
= new MemTable(internal_comparator_);
      mem_
->Ref();
      force 
= false;   // Do not force another compaction if have room
      // 鍙戣搗compaction,dump imm_
      MaybeScheduleCompaction();
    }
  }
  
return s;
}



灝忔槑 2012-03-21 14:41 鍙戣〃璇勮
]]>
leveldb鐮旂┒9- 嫻佺▼鍒嗘瀽錛氭墦寮鏁版嵁搴?/title><link>http://www.tkk7.com/sandy/archive/2012/03/20/leveldb9.html</link><dc:creator>灝忔槑</dc:creator><author>灝忔槑</author><pubDate>Tue, 20 Mar 2012 08:02:00 GMT</pubDate><guid>http://www.tkk7.com/sandy/archive/2012/03/20/leveldb9.html</guid><wfw:comment>http://www.tkk7.com/sandy/comments/372251.html</wfw:comment><comments>http://www.tkk7.com/sandy/archive/2012/03/20/leveldb9.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/sandy/comments/commentRss/372251.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/sandy/services/trackbacks/372251.html</trackback:ping><description><![CDATA[     鎽樿: leveldb 鏄氳繃Open鍑芥暟鏉ユ墦寮/鏂板緩鏁版嵁搴撱侰ode highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->static Status Open(const Options& options, &nb...  <a href='http://www.tkk7.com/sandy/archive/2012/03/20/leveldb9.html'>闃呰鍏ㄦ枃</a><img src ="http://www.tkk7.com/sandy/aggbug/372251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/sandy/" target="_blank">灝忔槑</a> 2012-03-20 16:02 <a href="http://www.tkk7.com/sandy/archive/2012/03/20/leveldb9.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>leveldb鐮旂┒8- 鍐呭瓨?shù)腑鐨勬暟鎹l撴瀯Memtable/SkipListhttp://www.tkk7.com/sandy/archive/2012/03/19/leveldb8.html灝忔槑灝忔槑Mon, 19 Mar 2012 08:31:00 GMThttp://www.tkk7.com/sandy/archive/2012/03/19/leveldb8.htmlhttp://www.tkk7.com/sandy/comments/372177.htmlhttp://www.tkk7.com/sandy/archive/2012/03/19/leveldb8.html#Feedback0http://www.tkk7.com/sandy/comments/commentRss/372177.htmlhttp://www.tkk7.com/sandy/services/trackbacks/372177.html
鍏堢湅鐪婼kipList銆愯煩琛ㄣ戣繖涓暟鎹粨鏋勶細(xì)


SkipList鏈夊涓嬬壒鐐癸細(xì)
1. 鏈川涓婁竴涓帓搴忓ソ鐨勯摼琛?br />2. 鍒嗗眰錛屼笂灞傝妭鐐規(guī)瘮涓嬪眰鐨勫皯錛屾洿鍏鋒湁璺寵穬鎬?br />3. 鏌ヨ鐨勫鏉傚害鏄疧(logn)

SkipList璺熺孩榛戞爲(wèi)絳夎繕鏄瘮杈冨鏄撳疄鐜板拰鐞嗚В鐨勶紝涓昏闀垮鏄瘮杈冨鏄撳疄鐜癓ock free鍜岄亶鍘嗐?br />鎴戜滑鏉ョ湅鐪媗eveldb鐨勫疄鐜?br />鎻掑叆錛?br />
//鎻掑叆涓涓柊鐨刱ey
template<typename Key, class Comparator>
void SkipList<Key,Comparator>::Insert(const Key& key) {
  
//鏌ユ壘鎻掑叆鑺傜偣,prev涓哄悇灞傜殑鍓嶇疆鑺傜偣
  Node* prev[kMaxHeight];
  Node
* x = FindGreaterOrEqual(key, prev);

  
// Our data structure does not allow duplicate insertion
  assert(x == NULL || !Equal(key, x->key));

  
//鐢熸垚闅忔満楂樺害
  int height = RandomHeight();
  
if (height > GetMaxHeight()) {
    
for (int i = GetMaxHeight(); i < height; i++) {
      prev[i] 
= head_;
    }
    
//璁劇疆褰撳墠鏈澶ч珮搴?/span>
    max_height_.NoBarrier_Store(reinterpret_cast<void*>(height));
  }

  
//鐢熸垚鏂拌妭鐐?/span>
  x = NewNode(key, height);
  
for (int i = 0; i < height; i++) {
    
//璁劇疆鏂拌妭鐐圭殑鍚勫眰鐨勪笅涓璺?/span>
    x->NoBarrier_SetNext(i, prev[i]->NoBarrier_Next(i));
    
//璁劇疆鍓嶈妭鐐圭殑next涓哄綋鍓嶈妭鐐癸紝瀹屾垚鎻掑叆
    prev[i]->SetNext(i, x);
  }
}

鏌ヨ錛?br />
template<typename Key, class Comparator>
typename SkipList
<Key,Comparator>::Node* SkipList<Key,Comparator>::FindGreaterOrEqual(const Key& key, Node** prev)
    
const {
  Node
* x = head_;
  
int level = GetMaxHeight() - 1//浠庨珮灞傚紑濮嬫煡鎵撅紝渚濇鍒? level
  while (true) {
    Node
* next = x->Next(level); 
    
if (KeyIsAfterNode(key, next)) { //姣攏ext key 瑕佸ぇ
      
// Keep searching in this list
      x = next;
    } 
else { //姣攏ext key灝忥紝鏌ユ壘涓嬩竴灞?br />      //鏍囪褰撳墠level鐨勫墠緗妭鐐?/span>
      if (prev != NULL) prev[level] = x;
      
if (level == 0) {
        
return next;
      } 
else {
        level
--;
      }
    }
  }
}

template
<typename Key, class Comparator>
bool SkipList<Key,Comparator>::Contains(const Key& key) const {
  Node
* x = FindGreaterOrEqual(key, NULL);
  
if (x != NULL && Equal(key, x->key)) {
    
return true;
  } 
else {
    
return false;
  }
}


鎺ョ潃鎴戜滑鐪嬬湅leveldb MemTable鐨勫疄鐜幫紝寰堢畝鍗曚簡(jiǎn)錛屽熀鏈槸瀵筍kipList璁塊棶涓涓皝瑁?br /><db/memtable.h>
class MemTable {
 
public:
  
explicit MemTable(const InternalKeyComparator& comparator);

  
//澧炲姞寮曠敤璁℃暟
  void Ref() { ++refs_; }

  
//鍑忓皯寮曠敤璁℃暟
  void Unref() {
    
--refs_;
    assert(refs_ 
>= 0);
    
if (refs_ <= 0) {
      delete 
this;
    }
  }

  
//鍐呭瓨?shù)娇鐢ㄩ?/span>
  size_t ApproximateMemoryUsage();

  
//閬嶅巻鎿嶄綔
  Iterator* NewIterator();

  
//鎻掑叆
  void Add(SequenceNumber seq, ValueType type,
           
const Slice& key,
           
const Slice& value);

  
//鏌ヨ
  bool Get(const LookupKey& key, std::string* value, Status* s);

 
private:
  
~MemTable();  // Private since only Unref() should be used to delete it

  
//key compartor錛岀敤浜庢帓搴?/span>
  struct KeyComparator {
    
const InternalKeyComparator comparator;
    
explicit KeyComparator(const InternalKeyComparator& c) : comparator(c) { }
    
int operator()(const char* a, const char* b) const;
  };
  friend 
class MemTableIterator;
  friend 
class MemTableBackwardIterator;

  typedef SkipList
<const char*, KeyComparator> Table;

  KeyComparator comparator_;
  
int refs_; //寮曠敤璁℃暟
  Arena arena_; //鍐呭瓨鍒嗛厤鍣?/span>
  Table table_; //鏁版嵁瀛樻斁SkipList

  
// No copying allowed
  MemTable(const MemTable&);
  
void operator=(const MemTable&);
};

鍏堢湅鐪嬫彃鍏?br /><db/memtable.cc>
void MemTable::Add(SequenceNumber s, ValueType type,
                   
const Slice& key,
                   
const Slice& value) {
  
//鏁版嵁緇撴瀯錛?br />  //1.internal key size : Varint32 (length of 2+3)
  
//2.key data
  
//3.SequenceNumber+Key type: 8 bytes
  
//4 value size: Varint32
  
//5 value data
  size_t key_size = key.size();
  size_t val_size 
= value.size();
  size_t internal_key_size 
= key_size + 8;
  
const size_t encoded_len =
      VarintLength(internal_key_size) 
+ internal_key_size +
      VarintLength(val_size) 
+ val_size;
  
char* buf = arena_.Allocate(encoded_len);
  
char* p = EncodeVarint32(buf, internal_key_size);
  memcpy(p, key.data(), key_size);
  p 
+= key_size;
  EncodeFixed64(p, (s 
<< 8| type);
  p 
+= 8;
  p 
= EncodeVarint32(p, val_size);
  memcpy(p, value.data(), val_size);
  assert((p 
+ val_size) - buf == encoded_len);
  table_.Insert(buf);
}

鏌ヨ
<db/memtable.cc>
bool MemTable::Get(const LookupKey& key, std::string* value, Status* s) {
  Slice memkey 
= key.memtable_key();
  Table::Iterator iter(
&table_);
  iter.Seek(memkey.data());
  
if (iter.Valid()) {
    
// entry format is:
    
//    klength  varint32
    
//    userkey  char[klength]
    
//    tag      uint64
    
//    vlength  varint32
    
//    value    char[vlength]
    
// Check that it belongs to same user key.  We do not check the
    
// sequence number since the Seek() call above should have skipped
    
// all entries with overly large sequence numbers.
    const char* entry = iter.key();
    uint32_t key_length;
    
const char* key_ptr = GetVarint32Ptr(entry, entry+5&key_length);
    
if (comparator_.comparator.user_comparator()->Compare(
            Slice(key_ptr, key_length 
- 8),
            key.user_key()) 
== 0) {
      
// Correct user key
      const uint64_t tag = DecodeFixed64(key_ptr + key_length - 8);
      
switch (static_cast<ValueType>(tag & 0xff)) {
        
case kTypeValue: {
          Slice v 
= GetLengthPrefixedSlice(key_ptr + key_length);
          value
->assign(v.data(), v.size());
          
return true;
        }
        
case kTypeDeletion:
          
*= Status::NotFound(Slice());
          
return true;
      }
    }
  }
  
return false;
}


灝忔槑 2012-03-19 16:31 鍙戣〃璇勮
]]>
leveldb鐮旂┒7-Version/VersionSet/VersionEdithttp://www.tkk7.com/sandy/archive/2012/03/16/leveldb7.html灝忔槑灝忔槑Fri, 16 Mar 2012 09:10:00 GMThttp://www.tkk7.com/sandy/archive/2012/03/16/leveldb7.htmlhttp://www.tkk7.com/sandy/comments/372028.htmlhttp://www.tkk7.com/sandy/archive/2012/03/16/leveldb7.html#Feedback0http://www.tkk7.com/sandy/comments/commentRss/372028.htmlhttp://www.tkk7.com/sandy/services/trackbacks/372028.html
鍏堢湅鐪嬩竴涓噸瑕佺殑鏁版嵁緇撴灉錛宻st file鐨凪ETA info
<db/version_edit.h>

struct FileMetaData {
  
int refs; //寮曠敤璁℃暟
  int allowed_seeks; //鍏佽鐨剆eeks嬈℃暟
  uint64_t number;//鏂囦歡緙栧彿
  uint64_t file_size;  //鏂囦歡澶у皬
  InternalKey smallest;    //鏈灝忕殑key
  InternalKey largest;      //鏈澶х殑key 

  FileMetaData() : refs(
0), allowed_seeks(1 << 30), file_size(0) { }
};

榪欓噷闈㈡湁涓涓緢鏈夋剰鎬濈殑瀛楁: allowed_seeks,浠h〃浜?jiǎn)鍙互seek鐨勬鏁幫紝涓?鐨勬椂鍊欒〃紺鴻繖涓枃浠墮渶瑕佽compaction.濡備綍璁劇疆seeks嬈℃暟鍛紵鏂囦歡澶у皬闄や互16k錛屼笉鍒?00綆?00銆?br />
      f->allowed_seeks = (f->file_size / 16384);
      
if (f->allowed_seeks < 100) f->allowed_seeks = 100;

鍘熷洜錛岃鐪媗eveldb鐨勬敞閲婏細(xì)

// We arrange to automatically compact this file after a certain number of seeks.  Let's assume:
      //   (1) One seek costs 10ms
      //   (2) Writing or reading 1MB costs 10ms (100MB/s)
      //   (3) A compaction of 1MB does 25MB of IO:
      //         1MB read from this level
      //         10-12MB read from next level (boundaries may be misaligned)
      //         10-12MB written to next level
      // This implies that 25 seeks cost the same as the compaction
      // of 1MB of data.  I.e., one seek costs approximately the
      // same as the compaction of 40KB of data.  We are a little
      // conservative and allow approximately one seek for every 16KB
      // of data before triggering a compaction.


鎺ヤ笅鏉ョ湅Version鐨勫畾涔夛紝version鍏跺疄灝辨槸涓緋誨垪鐨凷ST file鐨勯泦鍚堛?br />
class Version {
 
public:
  
//鐢熸垚iterator鐢ㄤ簬閬嶅巻
  void AddIterators(const ReadOptions&, std::vector<Iterator*>* iters);

  
//鏍規(guī)嵁key鏉ユ煡璇紝鑻ユ病鏈夋煡鍒幫紝鏇存柊GetStats
  struct GetStats {
    FileMetaData
* seek_file;
    
int seek_file_level;
  };
  Status Get(
const ReadOptions&const LookupKey& key, std::string* val,
             GetStats
* stats);

  
//鏄惁闇瑕佽繘琛宑ompaction
  bool UpdateStats(const GetStats& stats);

  
//寮曠敤璁$畻錛岄伩鍏嶅湪琚紩鐢ㄦ椂鍊欏垹闄?/span>
  void Ref();
  
void Unref();

  
//鏌ヨ鍜宬ey range鏈夊叧鐨刦iles
  void GetOverlappingInputs(
      
int level,
      
const InternalKey* begin,         // NULL means before all keys
      const InternalKey* end,           // NULL means after all keys
      std::vector<FileMetaData*>* inputs);

  
//璁$畻鏄惁level瀵規(guī)煇涓猭ey range鏄惁鏈塷verlap
  bool OverlapInLevel(int level,
                      
const Slice* smallest_user_key,
                      
const Slice* largest_user_key);

  
//memtable output搴旇鏀懼埌鍝釜level
  int PickLevelForMemTableOutput(const Slice& smallest_user_key,
                                 
const Slice& largest_user_key);

  
//鏌愪釜level鐨勬枃浠朵釜鏁?/span>
   int NumFiles(int level) const { return files_[level].size(); }

  
// Return a human readable string that describes this version's contents.
  std::string DebugString() const;

 
private:
  friend 
class Compaction;
  friend 
class VersionSet;

  
class LevelFileNumIterator;
  Iterator
* NewConcatenatingIterator(const ReadOptions&int level) const;

  VersionSet
* vset_;            // VersionSet to which this Version belongs
  Version* next_;               // Next version in linked list
  Version* prev_;               // Previous version in linked list
  int refs_;                    // Number of live refs to this version

  
//sst files 
  std::vector<FileMetaData*> files_[config::kNumLevels];

  
//涓嬩竴涓琚玞ompaction鐨勬枃浠?/span>
  FileMetaData* file_to_compact_;
  
int file_to_compact_level_;

  
//compaction score:>1琛ㄧず瑕乧ompaction
  double compaction_score_;
  
int compaction_level_;

  
explicit Version(VersionSet* vset)
      : vset_(vset), next_(
this), prev_(this), refs_(0),
        file_to_compact_(NULL),
        file_to_compact_level_(
-1),
        compaction_score_(
-1),
        compaction_level_(
-1) {
  }

  
~Version();

  
// No copying allowed
  Version(const Version&);
  
void operator=(const Version&);
};


閭ersionSet鍛紵VersionSet 鏄痸ersion緇勬垚涓涓弻鍚戝驚鐜摼琛ㄣ?br />
class VersionSet{
//. . .
Env* const env_;
  
const std::string dbname_;
  
const Options* const options_;
  TableCache
* const table_cache_;
  
const InternalKeyComparator icmp_;
  uint64_t next_file_number_;
  uint64_t manifest_file_number_;
  uint64_t last_sequence_;
  uint64_t log_number_;

  WritableFile
* descriptor_file_;
  log::Writer
* descriptor_log_;
  Version dummy_versions_;  
// Head of circular doubly-linked list of versions.
  Version* current_;        // == dummy_versions_.prev_

  
//姣忓眰閮芥湁涓涓猚ompact pointer鐢ㄤ簬鎸囩ず涓嬫浠庡摢閲屽紑濮媍ompact,浠ョ敤浜庡疄鐜板驚鐜痗ompact
  std::string compact_pointer_[config::kNumLevels];
//. . .
}


VersionEdit鏄痸ersion瀵硅薄鐨勫彉鏇磋褰曪紝鐢ㄤ簬鍐欏叆manifest.榪欐牱閫氳繃鍘熷鐨剉ersion鍔犱笂涓緋誨垪鐨剉ersionedit鐨勮褰曪紝灝卞彲浠ユ仮澶嶅埌鏈鏂扮姸鎬併?br />
class VersionEdit {
 
public:
  VersionEdit() { Clear(); }
  
~VersionEdit() { }

  
void Clear();

  
void SetComparatorName(const Slice& name) {
    has_comparator_ 
= true;
    comparator_ 
= name.ToString();
  }
  
void SetLogNumber(uint64_t num) {
    has_log_number_ 
= true;
    log_number_ 
= num;
  }
  
void SetPrevLogNumber(uint64_t num) {
    has_prev_log_number_ 
= true;
    prev_log_number_ 
= num;
  }
  
void SetNextFile(uint64_t num) {
    has_next_file_number_ 
= true;
    next_file_number_ 
= num;
  }
  
void SetLastSequence(SequenceNumber seq) {
    has_last_sequence_ 
= true;
    last_sequence_ 
= seq;
  }
  
void SetCompactPointer(int level, const InternalKey& key) {
    compact_pointers_.push_back(std::make_pair(level, key));
  }

  
//娣誨姞meta file
  void AddFile(int level, uint64_t file,
               uint64_t file_size,
               
const InternalKey& smallest,
               
const InternalKey& largest) {
    FileMetaData f;
    f.number 
= file;
    f.file_size 
= file_size;
    f.smallest 
= smallest;
    f.largest 
= largest;
    new_files_.push_back(std::make_pair(level, f));
  }

  
//鍒犻櫎鐗瑰畾鐨勬枃浠?/span>
  void DeleteFile(int level, uint64_t file) {
    deleted_files_.insert(std::make_pair(level, file));
  }

  
//緙栫爜錛岃В鐮侊細(xì)鐢ㄤ簬鍐欏叆manifest
  void EncodeTo(std::string* dst) const;
  Status DecodeFrom(
const Slice& src);

  std::
string DebugString() const;

 
private:
  friend 
class VersionSet;

  typedef std::
set< std::pair<int, uint64_t> > DeletedFileSet;

  std::
string comparator_;
  uint64_t log_number_;
  uint64_t prev_log_number_;
  uint64_t next_file_number_;
  SequenceNumber last_sequence_;
  
bool has_comparator_;
  
bool has_log_number_;
  
bool has_prev_log_number_;
  
bool has_next_file_number_;
  
bool has_last_sequence_;

  std::vector
< std::pair<int, InternalKey> > compact_pointers_;
  DeletedFileSet deleted_files_;
  std::vector
< std::pair<int, FileMetaData> > new_files_;
};




灝忔槑 2012-03-16 17:10 鍙戣〃璇勮
]]>
leveldb鐮旂┒6- Level鍜孋ompactionhttp://www.tkk7.com/sandy/archive/2012/03/15/leveldb6.html灝忔槑灝忔槑Thu, 15 Mar 2012 09:28:00 GMThttp://www.tkk7.com/sandy/archive/2012/03/15/leveldb6.htmlhttp://www.tkk7.com/sandy/comments/371848.htmlhttp://www.tkk7.com/sandy/archive/2012/03/15/leveldb6.html#Feedback0http://www.tkk7.com/sandy/comments/commentRss/371848.htmlhttp://www.tkk7.com/sandy/services/trackbacks/371848.html闃呰鍏ㄦ枃

灝忔槑 2012-03-15 17:28 鍙戣〃璇勮
]]>
leveldb鐮旂┒5- Snapshothttp://www.tkk7.com/sandy/archive/2012/03/13/leveldb5.html灝忔槑灝忔槑Tue, 13 Mar 2012 08:54:00 GMThttp://www.tkk7.com/sandy/archive/2012/03/13/leveldb5.htmlhttp://www.tkk7.com/sandy/comments/371812.htmlhttp://www.tkk7.com/sandy/archive/2012/03/13/leveldb5.html#Feedback0http://www.tkk7.com/sandy/comments/commentRss/371812.htmlhttp://www.tkk7.com/sandy/services/trackbacks/371812.html
鍏堝啓涓涓祴璇曠▼搴忔潵鐪嬬湅snapshot鐨勪嬌鐢細(xì)

#include <iostream>
#include 
"leveldb/db.h"

using namespace std;
using namespace leveldb;


int main() {
    DB 
*db ;
    Options op;
    op.create_if_missing 
= true;
    Status s 
= DB::Open(op,"/tmp/testdb",&db);

    
if(s.ok()){
        cout 
<< "create successfully" << endl;
        s 
= db->Put(WriteOptions(),"abcd","1234");
        
if(s.ok()){
            cout 
<< "put successfully" << endl;
            
string value;
            s 
= db->Get(ReadOptions(),"abcd",&value);
            
if(s.ok()){
                cout 
<< "get successfully,value:" << value << endl;
            }
        }
        
if(s.ok()){
            
string value;
            
const Snapshot * ss =db->GetSnapshot();
            ReadOptions rop;
            db
->Put(WriteOptions(),"abcd","123456");
            db
->Get(rop,"abcd",&value);
            
if(s.ok()){
                    cout 
<< "get successfully,value:" << value << endl;
            }
            rop.snapshot 
= ss;
            db
->Get(rop,"abcd",&value);
            
if(s.ok()){
                    cout 
<< "get from snapshot successfully,value:" << value << endl;
            }
            db
->ReleaseSnapshot(ss);
        }
    }
    delete db;
    
return 0;
}

紼嬪簭榪愯鐨勮緭鍑虹粨鏋滄槸錛?br />
create successfully
put successfully
get successfully,value:1234
get successfully,value:123456
get from snapshot successfully,value:1234

鍙互鐪嬪嚭錛屽嵆浣垮湪鏁版嵁鏇存柊鍚庯紝鎴戜滑浠嶇劧鍙互浠巗napshot涓鍒版棫鐨勬暟鎹?br />
涓嬮潰鎴戜滑鏉ュ垎鏋恖eveldb涓璼napshot鐨勫疄鐜般?br />
SequenceNumber(db/dbformat.h)
SequenceNumber鏄痩eveldb寰堥噸瑕佺殑涓滆タ錛屾瘡嬈″鏁版嵁搴撹繘琛屾洿鏂版搷浣滐紝閮戒細(xì)鐢熸垚涓涓柊鐨凷equenceNumber,64bits錛屽叾涓珮8浣嶄負(fù)0錛屽彲浠ヨ窡key鐨勭被鍨?8bits)榪涜鍚堝茍鎴?4bits銆?/div>
typedef uint64_t SequenceNumber;

// We leave eight bits empty at the bottom so a type and sequence#
// can be packed together into 64-bits.
static const SequenceNumber kMaxSequenceNumber =
    ((0x1ull << 56) - 1);

SnapShot(db/snapshot.h),錛屽彲浠ョ湅鍑簊napshot鍏跺疄灝辨槸涓涓猻equence number
class SnapshotImpl : public Snapshot {
 
public:
  
//鍒涘緩鍚庝繚鎸佷笉鍙?/span>
  SequenceNumber number_;  

 
private:
  friend 
class SnapshotList; 

  
//鍙屽悜寰幆閾捐〃
  SnapshotImpl* prev_;
  SnapshotImpl
* next_;

  SnapshotList
* list_;                 // just for sanity checks
};

鍒涘緩snapshot:
const Snapshot* DBImpl::GetSnapshot() {
  MutexLock l(
&mutex_);
  
return snapshots_.New(versions_->LastSequence());
}

鍒犻櫎snapshot:
void DBImpl::ReleaseSnapshot(const Snapshot* s) {
  MutexLock l(
&mutex_);
  snapshots_.Delete(reinterpret_cast
<const SnapshotImpl*>(s));
}






灝忔槑 2012-03-13 16:54 鍙戣〃璇勮
]]>leveldb鐮旂┒4- 鏁版嵁鏂囦歡鐨勬牸寮忓拰鐢熸垚http://www.tkk7.com/sandy/archive/2012/03/12/leveldb4.html灝忔槑灝忔槑Mon, 12 Mar 2012 10:21:00 GMThttp://www.tkk7.com/sandy/archive/2012/03/12/leveldb4.htmlhttp://www.tkk7.com/sandy/comments/371712.htmlhttp://www.tkk7.com/sandy/archive/2012/03/12/leveldb4.html#Feedback1http://www.tkk7.com/sandy/comments/commentRss/371712.htmlhttp://www.tkk7.com/sandy/services/trackbacks/371712.html闃呰鍏ㄦ枃

灝忔槑 2012-03-12 18:21 鍙戣〃璇勮
]]>
leveldb鐮旂┒3-鏁版嵁搴撴棩蹇楁枃浠舵牸寮?/title><link>http://www.tkk7.com/sandy/archive/2012/03/09/leveldb3.html</link><dc:creator>灝忔槑</dc:creator><author>灝忔槑</author><pubDate>Fri, 09 Mar 2012 08:00:00 GMT</pubDate><guid>http://www.tkk7.com/sandy/archive/2012/03/09/leveldb3.html</guid><wfw:comment>http://www.tkk7.com/sandy/comments/371582.html</wfw:comment><comments>http://www.tkk7.com/sandy/archive/2012/03/09/leveldb3.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/sandy/comments/commentRss/371582.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/sandy/services/trackbacks/371582.html</trackback:ping><description><![CDATA[     鎽樿: leveldb鍦ㄦ瘡嬈℃暟鎹簱鎿嶄綔涔嬪墠閮戒細(xì)鎶婃搷浣滆褰曚笅鏉ャ?涓昏瀹炵幇鍦╠b\log_format.h,db\log_reader.h,db\log_reader.cc,db\log_write.h,db\log_write.cc涓傛垜浠潵鍏蜂綋鐪嬬湅瀹炵幇銆? 鏃ュ織鏍煎紡 db\log_format.h log鏄垎鍧楃殑錛屾瘡鍧椾負(fù)32K,姣忔潯璁板綍鐨勮褰曞ご涓?涓瓧鑺傦紝鍓嶅洓涓負(fù)CRC錛岀劧鍚庢槸闀垮害錛?涓瓧鑺傦級(jí)...  <a href='http://www.tkk7.com/sandy/archive/2012/03/09/leveldb3.html'>闃呰鍏ㄦ枃</a><img src ="http://www.tkk7.com/sandy/aggbug/371582.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/sandy/" target="_blank">灝忔槑</a> 2012-03-09 16:00 <a href="http://www.tkk7.com/sandy/archive/2012/03/09/leveldb3.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>leveldb鐮旂┒2- 瀛樺偍鍒嗘瀽http://www.tkk7.com/sandy/archive/2012/03/09/leveldb2.html灝忔槑灝忔槑Fri, 09 Mar 2012 03:44:00 GMThttp://www.tkk7.com/sandy/archive/2012/03/09/leveldb2.htmlhttp://www.tkk7.com/sandy/comments/371533.htmlhttp://www.tkk7.com/sandy/archive/2012/03/09/leveldb2.html#Feedback1http://www.tkk7.com/sandy/comments/commentRss/371533.htmlhttp://www.tkk7.com/sandy/services/trackbacks/371533.html闃呰鍏ㄦ枃

灝忔槑 2012-03-09 11:44 鍙戣〃璇勮
]]>
leveldb鐮旂┒ - 緙栬瘧/璋冭瘯http://www.tkk7.com/sandy/archive/2012/03/08/leveldb1.html灝忔槑灝忔槑Thu, 08 Mar 2012 03:44:00 GMThttp://www.tkk7.com/sandy/archive/2012/03/08/leveldb1.htmlhttp://www.tkk7.com/sandy/comments/371423.htmlhttp://www.tkk7.com/sandy/archive/2012/03/08/leveldb1.html#Feedback1http://www.tkk7.com/sandy/comments/commentRss/371423.htmlhttp://www.tkk7.com/sandy/services/trackbacks/371423.html
鎴戠殑緙栬瘧鐜:ubuntu 32&g++ 4.6

1.瀹夎git騫朵笅杞戒唬鐮?br />
sudo apt-get install git-core
git clone https:
//code.google.com/p/leveldb/

2. 緙栬瘧leveldb

cd leveldb
.
/build_detect_platform
make

涓轟簡(jiǎn)鑳藉璋冭瘯錛屼慨鏀筂akefile涓篸ebug mode(B妯″紡)
OPT ?= -g2

緙栬瘧鍚庝細(xì)鐢熸垚搴撴枃浠訛細(xì)libleveldb.a

3. 緙栧啓嫻嬭瘯紼嬪簭
ldbtest.cpp
#include <iostream>
#include 
"leveldb/db.h"

using namespace std;
using namespace leveldb;

int main() {
    DB 
*db ;
    Options op;
    op.create_if_missing 
= true;
    Status s 
= DB::Open(op,"/tmp/testdb",&db);

    
if(s.ok()){
        cout 
<< "create successfully" << endl;
        s 
= db->Put(WriteOptions(),"abcd","1234");
        
if(s.ok()){
            cout 
<< "put successfully" << endl;
            
string value;
            s 
= db->Get(ReadOptions(),"abcd",&value);
            
if(s.ok()){
                cout 
<< "get successfully,value:" << value << endl;
            }
            
else{
                cout 
<< "get failed" << endl;
            }
        }
        
else{
            cout 
<< "put failed" << endl;
        }
    }
    
else{
        cout 
<< "create failed" << endl;
    }
    delete db;
    
return 0;
}
娉ㄦ剰link鐨勬椂鍊欓渶瑕佸姞涓?lpthread.

榪愯鍚庡緱鍒扮粨鏋滐細(xì)(Eclipse涓繍琛岋級(jí)



灝忔槑 2012-03-08 11:44 鍙戣〃璇勮
]]>
Learn From HBase/Bigtablehttp://www.tkk7.com/sandy/archive/2012/03/07/Learn_From_HBase.html灝忔槑灝忔槑Wed, 07 Mar 2012 02:42:00 GMThttp://www.tkk7.com/sandy/archive/2012/03/07/Learn_From_HBase.htmlhttp://www.tkk7.com/sandy/comments/371379.htmlhttp://www.tkk7.com/sandy/archive/2012/03/07/Learn_From_HBase.html#Feedback0http://www.tkk7.com/sandy/comments/commentRss/371379.htmlhttp://www.tkk7.com/sandy/services/trackbacks/371379.html

瀛︿範(fàn)杞歡鏈変笁涓鐣岋紝絎竴涓鐣屾槸浼?xì)鋴社敤瀹冨Q岀浜屼釜澧冪晫鏄噦寰楄儗鍚庣殑鍘熺悊錛屾槑鐧藉畠鐨勬灦鏋勪綋緋伙紝絎笁涓鐣屽涔?fàn)浠栫殑鎵闀匡紝涓烘垜鎵鐢ㄣ傜爺絀禜Base/BigTable鏋舵瀯鍜屾簮鐮佷竴孌墊椂闂村悗錛屾垜鎬葷粨浜?jiǎn)涓浜涗笢瑗垮彲浠ヤ緵鎴戜滑鍦ㄨ璁″垎甯冨紡緋葷粺鍊熼壌浣跨敤銆?/p>

1. 浣跨敤鍙俊浠葷殑鍒嗗竷寮忕粍浠舵潵鎼緩鑷繁鐨勫垎甯冨紡緋葷粺銆?/strong>
璁?璁′竴涓彲闈狅紝鍋ュ.鐨勫垎甯冨紡緋葷粺鏄瘮杈冨洶闅劇殑銆傛垜浠煡閬擄紝涓轟簡(jiǎn)闃叉SPOF(Single Point Of Failure)闂錛屾垜浠鍒嗘暎椋庨櫓錛屾妸鏁版嵁鏀懼湪澶氫釜nodes涓婇潰鍘伙紝浣嗘槸榪欐牱甯︽潵浜?jiǎn)鏄暟鎹殑鍚屾闂鍜岀増鏈棶棰樺Q岃В鍐寵繖涓棶棰橀渶瑕佽繍鐢ㄥ鏉傜殑 Paxos鍗忚錛岀郴緇熺殑澶嶆潅搴﹁嚜鐒跺氨鍗囬珮?shù)簡(jiǎn)銆傚彟澶栦竴涓渶瑕佽В鍐崇殑闂鏄垎甯冨紡閿佸拰浜嬩歡閫氱煡鏈哄埗錛屼互鍙?qiáng)鍏ㄥ眬淇℃伅鍏變韓錛岃璁¤繖浜涢兘闇瑕佸ぇ閲忕殑綺懼姏鍜屼粩緇嗙殑鐮? 絀躲?/p>

HBase灝變笉鐢ㄨ冭檻榪欎簺闂錛屽畠鎶婃暟鎹殑鍚屾鍜屽啑浣欓棶棰樹(shù)氦緇欎簡(jiǎn)Hadoop,鎶婇攣鏈哄埗鍜屽叏灞鍏變韓浜ょ粰浜?jiǎn)Zookeeper,榪欏ぇ澶х畝鍖栦簡(jiǎn)HBase鐨勮璁°?/p>

鎵浠ユ垜浠璁$郴緇熺殑鏃跺欙紝涔熻灝介噺鍒╃敤榪欎簺鍙潬錛岀ǔ瀹氱殑緇勪歡銆傜洰鍓嶆瘮杈冩祦琛屽拰紼沖畾鐨勬湁錛?br /> 鍒嗗竷寮忔枃浠剁郴緇?nbsp;- HDFS
鍒嗗竷寮忛攣鍜岀洰褰?nbsp;- Zookeeper
緙撳瓨 - MemCached
娑堟伅闃熷垪 - ActiveMQ

2.閬垮厤鍗曠偣闂(SPOF)
璁捐鍒嗗竷寮忕郴緇熻鏃跺埢鑰冭檻鍒板け璐ワ紝涓嶅崟鏄蔣浠跺彲鑳藉け璐ワ紝紜歡涔熷彲鑳芥寕鎺夛紝鎵浠ユ垜浠郴緇熼噷闈㈠氨涓嶈兘鏈変笉鍙浛浠g殑瑙掕壊銆?/p>

HBase 浣跨敤Master Server鏉ョ洃鎺ф墍鏈夌殑Region Server,涓鏃﹀叾涓殑涓鍙板嚭鐜伴棶棰橈紝鍦ㄥ叾涓婄殑Region灝嗕細(xì)琚漿縐誨埌鍏朵粬鐨凴egion Server錛岄伩鍏嶄簡(jiǎn)鏈嶅姟涓柇銆傝孧aster Server涔熷彲浠ュ鍙板閫夛紝涓鍙版寕鎺変箣鍚庯紝鍏朵粬鐨勫鑳庡垯浼?#8221;緇ф壙閬楀織“錛屼粠鑰岃鏁翠釜緋葷粺寰椾互鐢熷瓨銆?/p>

閭? HBase濡備綍鍋氬埌榪欎釜鍛紝涓涓槸浣跨敤”蹇?jī)锜╂満鍒?#8221;錛屽嵆Region Server瑕佷富鍔ㄥ畾鏈熷悜Master姹囨姤鐘跺喌錛屽彟澶栦竴涓槸鍒╃敤zookeeper閲岄潰鐨?#8221;鐢熷懡鑺傜偣“錛屾瘡涓猻erver鍦ㄥ惎鍔ㄥ悗瑕佸湪ZK閲岄潰娉ㄥ唽錛屼竴鏃? 榪欎釜server鎸傛帀錛屽畠鍦╖K閲岄潰鐨勮妭鐐瑰氨浼?xì)娑堝け锛岀洃鍚瑯q欎釜鑺傜偣鐨剆erver灝變細(xì)寰楀埌閫氱煡銆?/p>

3.鍒╃敤涓嶅彉鎬ф彁楂樼郴緇熺殑鍚炲悙閲?/strong>
鎴戜滑鐭ラ亾錛屽緢澶氳繘紼?綰跨▼淇敼鍚屼竴涓笢瑗跨殑鏃跺欙紝鎴戜滑灝遍渶瑕侀攣鏈哄埗鏉ラ伩鍏嶅啿紿併備絾鏄攣甯︽潵鐨勯棶棰樻槸緋葷粺鎬ц兘涓嬮檷銆傚鏋滃浜庝竴涓彧璇葷殑瀵硅薄錛屽氨涓嶉渶瑕侀攣浜?jiǎn)銆?/p>

HBase 鍦ㄨ璁″瓨鍌ㄧ殑鏃跺欒冭檻鍒拌繖涓鐐癸紝鏈鏂扮殑鏁版嵁鏄斁鍦╩emory閲岄潰錛屼互鎻愰珮鎬ц兘銆備絾鏄痬emory鏄湁闄愮殑錛屾垜浠笉鍙兘璁╂暟鎹竴鐩存斁鍦╩emory閲岄潰錛? 鎵浠ユ垜浠渶瑕佸畾鏃舵妸榪欎簺鏁版嵁鍐欏埌HDFS/紓佺洏?shù)笂闈€備竴縐嶈璁℃槸鍐欏埌涓涓彲淇敼鐨勫ぇ鏂囦歡涓幓錛岃繖鏍峰榪欎釜鏂囦歡鐨勮鍐欏氨闇瑕佸姞閿佷簡(jiǎn)銆侶Base鏄瘡嬈¢兘鍐欏埌 涓涓柊鐨勬枃浠朵腑錛屼竴鏃︽枃浠跺垱寤哄悗錛岃繖涓枃浠跺皢涓嶈兘琚慨鏀癸紝灝辨槸鎵璋撶殑create-one-read-many銆傚綋鐒惰繖鏍蜂篃鏈変竴涓棶棰橈紝灝辨槸鏃墮棿闀夸簡(jiǎn)錛屼細(xì) 鏈夊緢澶氱殑灝忔枃浠訛紝姣忔鏌ユ壘錛岄渶瑕佹煡鎵捐繖鎵鏈夌殑鏂囦歡錛岄檷浣庝簡(jiǎn)緋葷粺鐨勬ц兘錛孒Base浼?xì)瀹氭椂鐨勫悎迤垬q欎簺灝忔枃浠剁敓鎴愪竴涓ぇ鏂囦歡銆?/p>

4.鍒╃敤绱㈠紩鍧楁彁楂樻枃浠剁殑鏌ヨ閫熷害
HBase鐨勫瓨鍌ㄦ枃浠?HFile)鏄敤鏉ュ瓨鍌ㄥ緢澶氭帓搴忓悗鐨凨ey-Value鐨勶紝濡備綍璁捐涓縐嶆敮鎸佸揩閫熼殢鏈烘煡璇㈠拰鍘嬬緝鐨勬枃浠舵槸涓涓湁鎰忔濈殑璇濋銆?/p>

HFile 鍦ㄦ枃浠剁殑灝鵑儴澧炲姞浜?jiǎn)鐑?chǔ)寮曞潡錛屼絾鏄笉鍙兘瀵逛換浣曚竴涓猺owkey閮藉仛绱㈠紩錛岃繖鏍風(fēng)殑璇濈儲(chǔ)寮曞潡浼?xì)寰堝ぇ锛岃屼笖涔熶笉鍒╀簬鍘嬬緝銆侶File鐨勫仛娉曟槸瀹氫箟涓涓狣ata Block鐨勫ぇ灝忥紝榪欐牱灝辨妸鏁版嵁鍒掑垎浜?jiǎn)涓涓竴涓殑Block錛岀儲(chǔ)寮曞彧閽堝榪欎簺block鍋氾紝Block鏄彲浠ヨ鍘嬬緝鐨勩傚綋鏌ヨ涓涓猺owkey鐨勬椂鍊欙紝濡? 鏋滄病鏈塩ache鐨勮瘽錛岄鍏堜嬌鐢ㄤ簩鍒嗘硶瀹氫綅鍒板叿浣撶殑block錛岀劧鍚庡啀瑙e帇錛岄亶鍘嗘煡璇㈠叿浣撶殑key銆?/p>

HFile榪欐牱鐨勮璁″吋欏句簡(jiǎn)閫熷害鍜屾枃浠跺ぇ灝忕殑騫寵 銆?/p>

5.鑷畾涔塕PC鏈哄埗鎻愪緵鏇村ぇ鐨勭伒媧繪?/strong>
HBase/Hadoop 閮芥病鏈夊埄鐢ㄦ爣鍑嗙殑Java榪滅▼璋冪敤瑙勮寖RMI,鑰屾槸鑷繁鎼炰簡(jiǎn)涓濂椼傝繖鏍峰仛鐨勫ソ澶勬湁鍑犵偣錛屼竴鏄噺灝戠綉緇滄祦閲忥紝鎴戜滑鐭ラ亾錛宩ava RMI浣跨敤浜?jiǎn)java serlizable鏉ヤ紶閫掑弬鏁幫紝java搴忓垪鍖栨湁寰堝鏃犲叧鐨勭被淇℃伅錛岄兘鍗犵敤涓嶅皯鐨勭┖闂達(dá)紝鑰屼笖榪欎細(xì)甯︽潵瀵筳ava鐗堟湰鐨勪緷璧栥備簩鏄甫鏉ユ洿澶х殑鐏墊椿鎬э紝浣犲彲 浠ュ湪鍏朵腑鍔犲叆鐗堟湰媯(gè)鏌ワ紝鏉冮檺璁よ瘉絳夈?/p>

閭? HBase鏄庝箞璁捐榪欎釜RPC鍛紵棣栧厛瀹冨畾涔変簡(jiǎn)涓涓獁ritable鎺ュ彛錛屾潵浠f浛java搴忓垪鍖栵紝瀹炵幇榪欎釜鎺ュ彛灝辯瓑浜庡憡璇塇Base錛屾庝箞鎶婅繖涓璞″啓 鍒癛PC嫻佷腑鍘匯備嬌鐢≧PC鐨勬椂鍊欙紝闇瑕佸厛鍐欎竴涓湇鍔″櫒绔拰瀹㈡埛绔叡鐢ㄧ殑interface,榪欎釜interface蹇呴』緇ф壙 VersionedProtocol鏉ュ鐞嗙増鏈棶棰?nbsp;銆侶Base鍒╃敤Java鐨勫姩鎬佸弽灝勬満鍒?Proxy.newProxyInstance)鏉ョ敓鎴愪唬 鐞嗗璞★紝榪欐牱褰揅lient璋冪敤浠g悊瀵硅薄鐨勬椂鍊欙紝Client灝變細(xì)鎶婂弬鏁版墦鍖咃紝鍙戦佸埌鏈嶅姟鍣ㄧ錛岀劧鍚庣瓑寰呰繑鍥炵粨鏋溿傛湇鍔″櫒浼?xì)鏍规嵁interface鏌ユ壘鍒? 鍏蜂綋鐨勫疄鐜扮殑瀵硅薄錛岃皟鐢ㄨ瀵硅薄鐨勬柟娉曟潵鎵ц榪滅▼璋冪敤銆傝緇嗙殑鍋氭硶鍙互鍙傝僅Base/Hadoop鐨勬簮鐮併?/p>

6.鍐呭祵W(xué)eb Server澧炲己緋葷粺鐨勯忔槑搴?/strong>
褰撲竴涓悗鍙拌繘紼嬪惎鍔ㄤ箣鍚庯紝鎴戜滑濡備綍浜?jiǎn)瑙q欎釜榪涚▼鐨勫唴閮ㄧ姸鎬佸憿錛熶紶緇熸柟娉曟槸閫氳繃榪涚▼綆$悊鍣ㄦ垨鑰匘ebug log鏉ョ湅榪涚▼鐨勬儏鍐碉紝浣嗘槸榪欎簺淇℃伅寰堟湁闄愩?/p>

HBase鍒╃敤jetty鍦ㄨ繘紼嬪唴閮ㄥ惎鍔ㄤ簡(jiǎn)涓涓獁eb server錛屽氨鍙互鍗蟲(chóng)椂鐨勬樉紺轟竴浜涚郴緇熷唴閮ㄧ殑淇℃伅錛岄潪甯哥殑鏂逛究銆?/p>

鍒? 鐢↗etty鏀寔jsp闈炲父鐨勫鏄擄紝涓嬮潰鏄竴涓ず渚嬬殑浠g爜銆傛敞鎰忕殑鏄紝闇瑕佹妸jasper-runtime-5.5.12.jar,jasper- compiler-5.5.12.jar,jasper-compiler-jdt-5.5.12.jar,jsp-2.1.jar,jsp-api- 2.1.jar絳塲ar鍖呮斁鍦╟lasspath閲岄潰錛屽惁鍒欎細(xì)鍑虹幇欏甸潰瑙f瀽閿欒銆?/p>

server = new Server(port);

server.setSendServerVersion(false);
server.setSendDateHeader(false);
server.setStopAtShutdown(true);

WebAppContext wac = new WebAppContext();
wac.setContextPath("/");
wac.setWar("./webapps/job");
server.setHandler(wac);
server.setStopAtShutdown(true);



灝忔槑 2012-03-07 10:42 鍙戣〃璇勮
]]>
主站蜘蛛池模板: 国产高清免费观看| 亚洲欧美成人av在线观看| 污视频在线观看免费| 亚洲国产日韩在线视频| 亚洲精品黄色视频在线观看免费资源 | 成人免费无码精品国产电影| 亚洲精品无码av片| 国产老女人精品免费视频| 亚洲国产精品无码观看久久| 日韩视频在线免费| 国产精品亚洲lv粉色| 国产成人免费福利网站| 无套内谢孕妇毛片免费看看 | 最新欧洲大片免费在线| 亚洲成年网站在线观看| 在线a毛片免费视频观看| 精品无码专区亚洲| 亚洲成a人片在线观看国产| www.av在线免费观看| 狠狠亚洲婷婷综合色香五月排名 | 免费国产黄网站在线观看| 精品亚洲麻豆1区2区3区| 114级毛片免费观看| 亚洲三级在线视频| 最近最新的免费中文字幕| 国产精品手机在线亚洲| 亚洲精品无码专区2| 怡红院免费的全部视频| 亚洲人成在线电影| 韩国免费一级成人毛片| 亚洲AV永久无码天堂影院| 亚洲 无码 在线 专区| 中国一级毛片视频免费看| 久久久久亚洲av无码专区蜜芽 | 亚洲人成无码网WWW| 最近更新免费中文字幕大全| 亚洲一区免费观看| 最近2019中文免费字幕| 免费看美女午夜大片| 亚洲精品乱码久久久久久蜜桃不卡| 99久9在线|免费|