最近因为工作需要,使用了FastDFS,这是一款国产的开源DFS软件,但是这个软件本身不能对重复上传的文件进行去重,需要我们自己去处理,一种可行的方案是,在文件上传之前进行md5校验,把每个文件保存在数据库中,然后进行对比,这个md5值如果在数据库中已经存在的话,就不上传。不过这个效率可能不怎么高。FastDFS作者余庆也开源了一个解决的资源,就是FastDHT了,使用这个也可以做到去重。
FastDHT is a high-performance distributed hash system (DHT) which based key value pairs. It can store mass key value pairs such as filename mapping, session data and user related data.
FastDHT implements data replication by it’s binlog file, so it only uses the basic storage function of the Berkeley DB.
从这段话中可以看出,FastDHT是一个高性能的分布式哈希系统,它是基于键值对存储的,而且它需要依赖于Berkeley DB作为数据存储的媒介,同时需要依赖于libfastcommon。
FastDHT集群由一个或者多个组 group组成,同组服务器上存储的数据是相同的,数据同步只在组的服务器之间进行;组内各个服务是对等的,对数据进行存取时,可以根据 key的hash值来决定使用哪台机器。
下载FastDHT,建议在GitHub上下载:https://github.com/happyfish100/fastdht,
libfastcommon下载地址:https://github.com/happyfish100/libfastcommon,
Berkeley DB的下载地址:
http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html
下载完毕后,就可以开始安装了。
将源码解压到/usr/local/src/目录下,
[root@tracker src]# unzip libfastcommon-master.zip
[root@tracker src]# cd libfastcommon-master
[root@tracker libfastcommon-master]# ls
HISTORY INSTALL libfastcommon.spec make.sh README src
[root@tracker libfastcommon-master]# ./make.sh
[root@tracker libfastcommon-master]# ./make.sh install
mkdir -p /usr/lib64
install -m 755 libfastcommon.so /usr/lib64
mkdir -p /usr/include/fastcommon
install -m 644 common_define.h hash.h chain.h logger.h base64.h shared_func.h pthread_func.h ini_file_reader.h _os_bits.h sockopt.h sched_thread.h http_func.h md5.h local_ip_func.h avl_tree.h ioevent.h ioevent_loop.h fast_task_queue.h fast_timer.h process_ctrl.h fast_mblock.h connection_pool.h /usr/include/fastcommon
其实libfastcommon在安装FastDFS的时候就会安装了,接下来安装db。这里我下载的是db-6.1.19版本。
①将db-6.1.19源码拷贝到 /usr/local/src下
②进入db-6.1.19\build_unix,
③执行../dist/configure --prefix=/usr/local/db-6.1.19
④make
⑤make install
安装完db,会在/usr/local目录下生成db-6.1.19/
①将fastdht-master源码解压到 /usr/local/src下,编译之前需要先修改make.sh文件。
在CFLAGS=’-Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -I/usr/local/db-6.1.19/include/ -L/usr/local/db-6.1.19/lib/’
这行里面加上斜体字部分。
②然后,进入/usr/local/src/fastdht-master源码目录下,执行./make.mk
然后执行./make.sh install。
③最后会在/usr/local/bin生成安装后的文件,在/etc/fdht下生成文件
root@jz-server:/usr/local/bin# cd /etc/fdht/
root@jz-server:/etc/fdht# ll
total 24
drwxr-xr-x 2 root root 4096 Apr 22 12:45 ./
drwxr-xr-x 102 root root 4096 Apr 22 12:45 ../
-rwxr-xr-x 1 root root 910 Apr 22 12:45 fdht_client.conf*
-rwxr-xr-x 1 root root 5374 Apr 22 12:45 fdhtd.conf*
-rwxr-xr-x 1 root root 76 Apr 22 12:45 fdht_servers.conf*
配置fdht_client.conf文件
base_path=/data/fastdht
keep_alive=1
#include /etc/fdhtd/fdht_servers.conf
配置fdht_servers.conf文件
vim /etc/fdhtd/fdht_servers.conf
group_count = 1
group0 = 10.10.10.81:11411
group0 = 10.10.10.82:11411
配置fdhtd.conf文件
vim /etc/fdht/fdhtd.conf/
port=11411
bash_path=/data/fastdht (该目录必须是已经存在的)
cache_size = 32MB
#include /etc/fdhtd/fdht_servers.conf -> (本行前有#表示打开,如果想关闭此选项,则应该为##开头)
配置storaged.conf文件
vim /etc/fdfs/storaged.conf
#是否检测上传文件已经存在。如果已经存在,则建立一个索引链接以节省磁盘空间
check_file_duplicate=1
#当上个参数设定为1时 , 在FastDHT中的命名空间
key_namespace=FastDFS
#长连接配置选项,如果为0则为短连接 1为长连接
keep_alive=1
#此处特别需要注意配置
#include /etc/fdht/fdht_servers.conf
或fdhtd /etc/fdht/fdhtd.conf
fdhtd /etc/fdht/fdhtd.conf restart
fdhtd /etc/fdht/fdhtd.conf
error while loading shared libraries: libdb-6.1.so: cannot open shared object file: No such file or directory
解决办法:
# cp /usr/local/db-6.1.19/lib/libdb-6.1.so /usr/lib/
然后再重新启动就可以了。
测试一下:
可以看到,第一次上传的文件为:
-rw-r--r-- 1 root root 3706 Apr 22 15:24 CgoKUlcZ0cWAUpQ4AAAOepbSnR0875.png
第一次上传返回的结果为一个软链接:CgoKUlcZ0cWAYmiNAAAOejexS3k075.png,之后每次重复上传的话都是返回一个指向第一次上传的文件的软链接。也就保证了文件只保存了一份。需要说明的是,FastDFS不会返回原始文件的索引,比如这里的CgoKUlcZ0cWAUpQ4AAAOepbSnR0875.png,即返回的全部是软链接,当所有的软链接都被删除的时候,原始文件也会从FastDFS中被删除。
整个过程就是这样了,就写这么多吧。。。