說實話自己最近踩了好多坑,只能說在不斷的踩坑中成長吧。我只想把在自己搭建連接的時候使用的步驟和問題或者是錯誤的解決方法分享給你們,也爲自己以後再搭建做備份。
1.首先安裝依賴的庫。(centos 7)
#安裝gflags
git clone https://github.com/gflags/gflags.git
cd gflags
mkdir build && cd build && cmake ..
make && make install
#安裝這些包
yum install snappy snappy-devel zlib zlib-devel bzip2 bzip2-devel lz4-devel
yum install libasan
#安裝zstd
wget https://github.com/facebook/zstd/archive/v1.1.3.tar.gz
mv v1.1.3.tar.gz zstd-1.1.3.tar.gz
tar zxvf zstd-1.1.3.tar.gz
cd zstd-1.1.3
make && sudo make install
2.下載rocksdb。
git clone https://github.com/facebook/rocksdb.git
cd rocksdb
#生成靜態庫
make static_lib
#生成動態庫
make shared_lib
3.複製.h文件到/usr/lib中。
cp -r include/* /usr/include
sudo cp librocksdb.so.6.1.0 /usr/lib
sudo ln -s /usr/lib/librocksdb.so.6.1.0 /usr/lib/librocksdb.so.6
sudo ln -s /usr/lib/librocksdb.so.6.1.0 /usr/lib/librocksdb.so
4.編寫測試文件rocksdbtest.cpp
#include <cstdio>
#include <string>
#include "rocksdb/db.h"
#include "rocksdb/slice.h"
#include "rocksdb/options.h"
using namespace std;
using namespace rocksdb;
const std::string PATH = "/home/hsk/kvstore/test_data/rocksdbResult";
int main(){
DB* db;
Options options;
options.create_if_missing = true;
Status status = DB::Open(options, PATH, &db);
assert(status.ok());
Slice key("foo");
Slice value("bar");
std::string get_value;
status = db->Put(WriteOptions(), key, value);
if(status.ok()){
status = db->Get(ReadOptions(), key, &get_value);
if(status.ok()){
printf("get %s\n", get_value.c_str());
}else{
printf("get failed\n");
}
}else{
printf("put failed\n");
}
delete db;
}
5.編譯運行該c文件。
g++ -std=c++11 -o rocksdbtest rocksdbtest.cpp -lpthread -lrocksdb
6.下面開始各種報錯了。
錯誤一:
./rocksdbtest: error while loading shared libraries: librocksdb.so.6.1: cannot open shared object file: No such file or directory
解決:
vi /etc/profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/lib
source /etc/profile
錯誤二:
rocksdbtest: rocksdbtest.cpp:18: int main(): Assertion `status.ok()' failed.
Aborted
解決二:一定要指定一個已經有的數據庫存儲路徑可以通過mkdir新建一個
#include <cstdio>
#include <string>
#include "rocksdb/db.h"
#include "rocksdb/slice.h"
#include "rocksdb/options.h"
using namespace std;
using namespace rocksdb;
const std::string PATH = "/home/hsk/kvstore/test_data/rocksdbResult";//修改此處
int main(){
DB* db;
Options options;
options.create_if_missing = true;
Status status = DB::Open(options, PATH, &db);
assert(status.ok());
Slice key("foo");
Slice value("bar");
std::string get_value;
status = db->Put(WriteOptions(), key, value);
if(status.ok()){
status = db->Get(ReadOptions(), key, &get_value);
if(status.ok()){
printf("get %s\n", get_value.c_str());
}else{
printf("get failed\n");
}
}else{
printf("put failed\n");
}
delete db;
}
6.在上文中安裝的mapkeeper中新建rocksdb文件夾。
mkdir rocksdb
cd rocksdb
mkdir data
vi Makefile
在Makefile文件中寫入:
include ../Makefile.config
EXECUTABLE = mapkeeper_rocksdb
all : thrift
g++ -Wall -o $(EXECUTABLE) *cpp -I $(THRIFT_DIR)/include/thrift -I $(THRIFT_DIR)/include \
/usr/local/lib/libleveldb.a /usr/local/lib/libsnappy.a -lpthread -lboost_thread -lboost_system -lboost_filesystem -lthrift -lleveldb -I ../thrift/gen-cpp \
-L $(THRIFT_DIR)/lib \
-L ../thrift/gen-cpp -lmapkeeper \
-Wl,-rpath,\$$ORIGIN/../thrift/gen-cpp \
-Wl,-rpath,$(THRIFT_DIR)/lib \
-std=c++11
thrift:
make -C ../thrift
run:
./$(EXECUTABLE) --sync
clean :
-rm -rf $(THRIFT_SRC) $(EXECUTABLE) *.o
wipe:
-rm -rf data/*
然後在rocksdb文件夾下添加RocksdbServer.cpp。我已經上傳到我的下載中,可以去下載添加。然後進行make,但是報一下錯誤。如果報以下錯,要更改相應行的boost爲std。
RocksDBServer.cpp:344:75: error: no matching function for call to ?.apkeeper::MapKeeperProcessor::MapKeeperProcessor(boost::shared_ptr<RocksDBServer>&)?
boost::shared_ptr<TProcessor> processor(new MapKeeperProcessor(handler));
^
RocksDBServer.cpp:344:75: note: candidates are:
In file included from RocksDBServer.cpp:7:0:
../thrift/gen-cpp/MapKeeper.h:1475:3: note: mapkeeper::MapKeeperProcessor::MapKeeperProcessor(std::shared_ptr<mapkeeper::MapKeeperIf>)
MapKeeperProcessor(::apache::thrift::stdcxx::shared_ptr<MapKeeperIf> iface) :
^
../thrift/gen-cpp/MapKeeper.h:1475:3: note: no known conversion for argument 1 from ?.oost::shared_ptr<RocksDBServer>?.to ?.td::shared_ptr<mapkeeper::MapKeeperIf>?
../thrift/gen-cpp/MapKeeper.h:1456:7: note: mapkeeper::MapKeeperProcessor::MapKeeperProcessor(const mapkeeper::MapKeeperProcessor&)
class MapKeeperProcessor : public ::apache::thrift::TDispatchProcessor {
^
../thrift/gen-cpp/MapKeeper.h:1456:7: note: no known conversion for argument 1 from ?.oost::shared_ptr<RocksDBServer>?.to ?.onst mapkeeper::MapKeeperProcessor&?
RocksDBServer.cpp:348:90: error: no matching function for call to ?.pache::thrift::server::TThreadedServer::TThreadedServer(boost::shared_ptr<apache::thrift::TProcessor>&, boost::shared_ptr<apache::thrift::transport::TServerTransport>&, boost::shared_ptr<apache::thrift::transport::TTransportFactory>&, boost::shared_ptr<apache::thrift::protocol::TProtocolFactory>&)?
TThreadedServer server (processor, serverTransport, transportFactory, protocolFactory);
錯誤三:
undefined reference to `rocksdb::Slice::ToString(bool)
解決三:
在Makefile文件中添加 -lrocksdb,Makefile文件改爲:
include ../Makefile.config
EXECUTABLE = mapkeeper_rocksdb
all : thrift
g++ -Wall -o $(EXECUTABLE) *cpp -I $(THRIFT_DIR)/include/thrift -I $(THRIFT_DIR)/include \
/usr/local/lib/libleveldb.a /usr/local/lib/libsnappy.a -lrocksdb -lpthread -lboost_thread -lboost_system -lboost_filesys
tem -lthrift -lleveldb -I ../thrift/gen-cpp \
-L $(THRIFT_DIR)/lib \
-L ../thrift/gen-cpp -lmapkeeper \
-Wl,-rpath,\$$ORIGIN/../thrift/gen-cpp \
-Wl,-rpath,$(THRIFT_DIR)/lib \
-std=c++11
thrift:
make -C ../thrift
run:
./$(EXECUTABLE) --sync
clean :
-rm -rf $(THRIFT_SRC) $(EXECUTABLE) *.o
wipe:
-rm -rf data/*
最後執行 :
make
生成 mapkeeper_rocksdb表示make成功。