FastDHT Ubuntu搭建及使用

本文详细介绍了在Ubuntu系统中安装和配置FastDHT的步骤,包括libevent和Berkeley DB的安装,FastDHT的配置文件修改,以及启动和基本使用方法。FastDHT是一个基于Key-Value对的高效分布式Hash系统,适用于存储大量数据。
摘要由CSDN通过智能技术生成

本文简单介绍FastDHT结构与原理,重点介绍其安装配置及使用方法。

FastDHT是一个基于键值对(Key Value Pair)的高效的分布式Hash系统,她可以用来存储大量的Key Value Pair,比如可以用来存储文件名映射表、session数据、用户相关数据等等。


FastDHT服务器端底层存储采用Berkeley DB,支持大数据量;网络IO采用libevent,支持大并发连接。FastDHT只用到了BDB最基本的存储功能,数据同步是自己实现的,采用了binlog的复制方式。



安装:

下载链接: libevent-1.4.14-stable : http://www.monkey.org/~provos/libevent-1.4.14-stable.tar.gz
               db-4.7.25.tar.gz         : http://download.oracle.com/berkeley-db/db-4.7.25.tar.gz
               FastDHT V1.18.tar.gz : http://fastdht.googlecode.com/files/FastDHT_v1.18.tar.gz


一. 安装步骤: 
(请按照顺序进行安装)

1. install  libevent-1.4.14-stable.tar.gz

tar xzf libevent-1.4.14-stable.tar.gz
cd libevent-1.4.14-stable
./configure --prefix=/usr
make && make install

2. install Berkley DB-4.7.25

tar xzf db-4.7.25.tar.gz
cd db-4.7.25/build_unix
../dist/configure --prefix=/usr
make && make install

3. install FastDHT V1.18

tar xzf FastDHT_v1.18.tar.gz
cd FastDHT
./make.clean
./make.sh
./make.sh install
(确保存在 fdhtd.conf  fdht_servers.conf  fdht_client.conf 在服务器上)

二. 修改配置文件

创建目录: mkdir /etc/fdhtd (目录权限 : 755  所属者: root)

cp fdhtd.conf /etc/fdhtd/              (文件权限 : 644  所属者: root)
cp fdht_servers.conf /etc/fdhtd/    (文件权限 : 644  所属者: root)
cp fdht_client.conf /etc/fdhtd/       (文件权限 : 644  所属者: root)

vim /etc/fdhtd/fdhtd.conf
port=11411
bash_path=<自定义目录 例如: /fdht> (必须要已经创建的目录,这个目录在以后会被用来做错误日志的存储等)
cache_size = 32MB
#include /etc/fdhtd/fdht_servers.conf  -> (本行前有#表示打开,如果想关闭此选项,则应该为##开头)

vi /etc/fdhtd/fdht_server.conf
group_count = 2   (数字可自定义)
group0 = <ipaddress>:<port>
group0 = <ipaddress>:<port>
group1 = <ipaddress>:<port>
group1 = <ipaddress>:<port> 
依次类推

vi /etc/fdhtd/fdht_client.conf
keep_alive=1  --> (本选项关联 storaged.conf文件)
bash_path=<自定义目录 例如: /fdht>
# include /etc/fdhtd/fdht_servers.conf

三. 启动:

/usr/local/bin/fdhtd /etc/fdhtd/fdhtd.conf

四. 启动后,可以使用我在下面提供的代码来实现dht的基本功能


使用方法tips:

1. fdht_server.conf文件中配置的ip,必须包含本机ip,否则会有相应错误

2. 随文档附的test主要为批量的性能测试。不是实际的简单使用方法。实际的使用可以通过下列代码简单实现


#include "fdht_global.h"
#include "fdht_types.h"
#include "fdht_client.h"
#include "logger.h"
#include <string.h>
#include <time.h>
#include <errno.h>
#include <signal.h>

int main(int argc, const char *argv[])
{
    int res, expire;
    FDHTKeyInfo key;
    struct sigaction act;

        char buf[1024] = "initstr";
        int len = 1024;
    if(argc < 3)
    {
        printf("too few arguments\n");
        exit(1);
    }
    
    memset(&act, 0, sizeof(act));
	sigemptyset(&act.sa_mask);
	act.sa_handler = SIG_IGN;
	if(sigaction(SIGPIPE, &act, NULL) < 0)
	{
		printf("file: "__FILE__", line: %d, " \
			"call sigaction fail, errno: %d, error info: %s", \
			__LINE__, errno, strerror(errno));
		return errno;
	}
    
    log_init();
    res = fdht_client_init("/etc/fdhtd/fdht_client.conf");
    if(res != 0)
    {
        printf("failed to load fdht_client.conf");
        exit(1);
    }
   
    int succ_cnt, fail_cnt;
    if ((res=fdht_connect_all_servers(&g_group_array, true, \
		&succ_cnt, &fail_cnt)) != 0)
	{
		printf("fdht_connect_all_servers fail, " \
			"error code: %d, error info: %s\n", \
			res, strerror(res));
		return res;
	
    }
    memset(&key, 0, sizeof(FDHTKeyInfo));
    if(strcmp(argv[1], "set") == 0)
    {
        strcpy(key.szKey, argv[2]);
        key.key_len = strlen(argv[2]) + 1;
        //strcpy(key.szKey, "kiikkkkkkkkkkkkkkkk15");
        //key.key_len = strlen(key.szKey);
        res = fdht_set(&key, FDHT_EXPIRES_NEVER, argv[3], strlen(argv[3]));
        if(res != 0)
        {
            printf("fdht_set failed\n");
            goto CLEANUP;
        }
    }
    else if(strcmp(argv[1], "get") == 0)
    {
        char *pbuf = buf;
        strcpy(key.szKey, argv[2]);
        key.key_len = strlen(argv[2]) + 1;
        res = fdht_get(&key, &pbuf, &len);
        if(res != 0)
        {
            printf("fdht_get failed, %s\n", strerror(res));
            goto CLEANUP;
        }
        else
        {
            buf[len] = 0;
            printf("%s\n", buf);
        }
    }
    else if(strcmp(argv[1],"delete") ==0)
    {
      strcpy(key.szKey,argv[2]);
      key.key_len = strlen(argv[2])+1;
      res = fdht_delete(&key);
      if(res !=0)
      {
        printf("fdht_delete failed,%s\n",strerror(res));
        goto CLEANUP;
      }
    }
    else {
        printf("unrecognized command %s\n", argv[1]);
        exit(1);
    }
CLEANUP:
    fdht_disconnect_all_servers(&g_group_array);
    fdht_client_destroy();
    
    return 0;
}

代码写的还是比较清楚的,各位一看便知。

具体调用就是

./mytest set key value

./mytest get key

./mytest delete key

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值