rocksdb/docs/_posts/2015-01-16-migrating-from-leveldb-to-rocksdb-2.markdown
Joel Marcey 3c2262400f Migrate the RocksDB Worpdress blog over to Jekyll
Summary:
Tried to:

- preserve existing links
- move existing images over (there were 2)
- preserve codeblocks (modified where apprporiate)
- etc.

Also as agreed upon:

- All blog posts are preserved.
- Comments are not preserved.
- Not turning on comments for future blog posts (use the FB developer group instead).
- Like button at the end of the blog post.

Depends on https://reviews.facebook.net/D63051

Test Plan: Visual

Reviewers: IslamAbdelRahman, lgalanis

Reviewed By: lgalanis

Subscribers: andrewkr, dhruba, leveldb

Differential Revision: https://reviews.facebook.net/D63105
2016-09-01 17:28:49 -07:00

109 lines
3.0 KiB
Markdown

---
title: Migrating from LevelDB to RocksDB
layout: post
author: lgalanis
category: blog
---
If you have an existing application that uses LevelDB and would like to migrate to using RocksDB, one problem you need to overcome is to map the options for LevelDB to proper options for RocksDB. As of release 3.9 this can be automatically done by using our option conversion utility found in rocksdb/utilities/leveldb_options.h. What is needed, is to first replace `leveldb::Options` with `rocksdb::LevelDBOptions`. Then, use `rocksdb::ConvertOptions( )` to convert the `LevelDBOptions` struct into appropriate RocksDB options. Here is an example:
LevelDB code:
```c++
#include <string>
#include "leveldb/db.h"
using namespace leveldb;
int main(int argc, char** argv) {
DB *db;
Options opt;
opt.create_if_missing = true;
opt.max_open_files = 1000;
opt.block_size = 4096;
Status s = DB::Open(opt, "/tmp/mydb", &db);
delete db;
}
```
RocksDB code:
```c++
#include <string>
#include "rocksdb/db.h"
#include "rocksdb/utilities/leveldb_options.h"
using namespace rocksdb;
int main(int argc, char** argv) {
DB *db;
LevelDBOptions opt;
opt.create_if_missing = true;
opt.max_open_files = 1000;
opt.block_size = 4096;
Options rocksdb_options = ConvertOptions(opt);
// add rocksdb specific options here
Status s = DB::Open(rocksdb_options, "/tmp/mydb_rocks", &db);
delete db;
}
```
The difference is:
```diff
-#include "leveldb/db.h"
+#include "rocksdb/db.h"
+#include "rocksdb/utilities/leveldb_options.h"
-using namespace leveldb;
+using namespace rocksdb;
- Options opt;
+ LevelDBOptions opt;
- Status s = DB::Open(opt, "/tmp/mydb", &db);
+ Options rocksdb_options = ConvertOptions(opt);
+ // add rockdb specific options here
+
+ Status s = DB::Open(rocksdb_options, "/tmp/mydb_rocks", &db);
```
Once you get up and running with RocksDB you can then focus on tuning RocksDB further by modifying the converted options struct.
The reason why ConvertOptions is handy is because a lot of individual options in RocksDB have moved to other structures in different components. For example, block_size is not available in struct rocksdb::Options. It resides in struct rocksdb::BlockBasedTableOptions, which is used to create a TableFactory object that RocksDB uses internally to create the proper TableBuilder objects. If you were to write your application from scratch it would look like this:
RocksDB code from scratch:
```c++
#include <string>
#include "rocksdb/db.h"
#include "rocksdb/table.h"
using namespace rocksdb;
int main(int argc, char** argv) {
DB *db;
Options opt;
opt.create_if_missing = true;
opt.max_open_files = 1000;
BlockBasedTableOptions topt;
topt.block_size = 4096;
opt.table_factory.reset(NewBlockBasedTableFactory(topt));
Status s = DB::Open(opt, "/tmp/mydb_rocks", &db);
delete db;
}
```
The LevelDBOptions utility can ease migration to RocksDB from LevelDB and allows us to break down the various options across classes as it is needed.