Skip to content
blank-1 edited this page Apr 15, 2019 · 37 revisions

FastHT

一、简介

FastDHT 是一个高性能的分布式哈希系统 (DHT) ,使用 Berkeley DB 做数据存储,使用 libevent 做网络IO处理, 提供 Java 版的客户端接口包。适合用来存储用户在线、会话等小数据量信息。

FastDHT存储Key Value Pair支持两种存储方式:缓存方式的MPOOL和持久存储方式的BDB。 Key包括三部分:Namespace, ObjectID和Key。 Key可设置过期时间,自动清除过期数据.Server端划分group 同group数据互相备份,并且可自动压缩binlog.服务端可使用单线程,多线程模式。

FastDHT一些特性:

  • 虚拟farm,便于扩容;
  • 分布式算法client端实现,不需要中心服务器;
  • 二进制通信协议,支持Proxy;
  • 使用libevent,异步IO方式,支持大并发;
  • 自动failover;
  • 支持长连接。

FastDHT集群由一个或多个组(group)组成,每个组由一台或多台服务器组成,同组服务器上存储的数据是相同的,数据同步只在同组的服务器之间进行。组内各个服务器是对等的,对数据进行存取时,可以根据key的hash值来决定使用哪台服务器。数据同步采用推(Push)的方式,由源服务器主动将数据同步到本组的其他服务器。

FastDHT由客户端决定应该选择哪台服务器,为例避免查表,应该根据key的hash code来选择服务器,算法描述如下:

  1. 计算出key的hash值(hash_code)
  2. group_index = hash_code % group_count
  3. new_hash_code = hash_code高16位和低16位互换
  4. server_index = new_hash_code % 组内server_count

计算server_index和group_index时使用了不同的hash code,是因为如果group_count和组内server_count相等,例如都等于2, 那么对于一个组来说,任何key值都将选中其中一台固定的服务器(server_index == group_index)。 需要的依赖库文件: libevent-1.4.so.2 , libdb-4.7.so。

二、安装

1、基本环境:

   CentOS7、libfastcommon、Berkeley、FastDHT

2、安装前需要的环境gcc

yum install make cmake gcc gcc-c++
cd /usr/local/src

①安装libfastcommon (安装FastDFS应该已经装了。无需重复安装)

unzip libfastcommon-master.zip
cd libfastcommon-master
./make.sh && ./make.sh install

②安装 Berkeley DB

wget http://download.oracle.com/berkeley-db/db-6.2.32.tar.gz
cd /usr/local/src/db-6.2.32/build_unix/
chmod 777 ../dist/configure
../dist/configure --prefix=/usr/local/db-6.2.32
make && make install

③安装fastDHT

cd /usr/local/src/
git clone https://github.com/happyfish100/fastdht.git --depth 1
cd fastdht
#编译之前需要先修改make.sh文件。在大约27行修改CFLAGS为:CFLAGS='-Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -I/usr/local/db-6.2.32/include/ -L/usr/local/db-6.2.32/lib/'
./make.sh && ./make.sh install

最后会在/usr/local/bin生成安装后的文件,在/etc/fdht下生成配置文件。

二、环境配置

1、创建目录

    mkdir /fastdht

2、修改fdhtd.conf文件

vim /etc/fdht/fdhtd.conf
port=11411
base_path=/home/fastdht
#include /etc/fdht/fdht_servers.conf

3、修改fdht_servers.conf文件

vim /etc/fdht/fdht_servers.conf
group_count = 2   #数字可自定义
group0 = 192.168.224.223:11411
group1 = 192.168.224.223:11411

4、修改fdht_client.conf文件

vim /etc/fdht/fdht_client.conf
keep_alive=1  #本选项关联 storaged.conf文件
base_path= /fastdht 
#include /etc/fdht/fdht_servers.conf #注意:#和include之间没有空格)

5、修改storage.conf文件

vim /etc/fdfs/storage.conf
#是否检测上传文件已经存在。如果已经存在,则不存在文件内容,建立一个索引链接以节省磁盘空间
line 195:  check_file_duplicate=1
#当上个参数设定为1时 , 在FastDHT中的命名空间
line 206:  key_namespace=FastDFS
#长连接配置选项,如果为0则为短连接 1为长连接
line 210  keep_alive=1 
#可以通过'#include filename'方式来加载 FastDHT servers 的配置
line 217:  #include /etc/fdht/fdht_servers.conf

三、启动FastDHT

1、启动命令:

cp /usr/local/src/fastdht/init.d/fdhtd /etc/init.d/
/etc/init.d/fdhtd /etc/fdhtd/fdhtd.conf

2、重启命令:

fdhtd /etc/fdht/fdhtd.conf restart

3、出错排查

#若缺少libdb-6.2.so
cp /usr/local/db-6.2.32/lib/libdb-6.2.so /usr/lib/
ldd /usr/local/bin/fdhtd
ldconfig
#(ldconfig命令的用途, 主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下, 搜索出可共享的动态链接库(格式如lib*.so*), 进而创建出动态装入程序(ld.so)所需的连接和缓存文件. 缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表)
ldd /usr/local/bin/fdhtd
fdhtd /etc/fdht/fdhtd.conf
netstat -an | grep 11411
(注意:要先启动FastDHT。在启动storage,才能使文件去重功能生效。)

4、设置FastDHT开机自启

vi /etc/rc.local 
#加入以下配置:
fdhtd /etc/fdht/fdhtd.conf
#如果开启自启不生效,可能是centOS找不到fdhtd文件。建议把全路径写上:`/usr/local/bin/fdhtd /etc/fdht/fdhtd.conf`
#执行命令,使之生效:
chmod +x /etc/rc.local 

5、验证

  #多次执行命令来上传同一个文件:
       fdfs_upload_file  /etc/fdfs/client.conf /usr/local/src/nginx-1.15.4.tar.gz
        > group1/M00/00/00/rBEAA1yus8GAIL_xAA-itk0Lx9Y.tar.gz
   # 在fdfs/storage/data目录,存在多个软连接,说明FastDHT文件去重功能已经成功实现。
       ll  /home/dfs/data/00/00