Loading... # FastDFS结合FastDHT实现文件去重 ## FastDFS去重实现 存储文件时,为了节省存储空间,需要实现文件去重,即同一份文件只在服务器上存储一份。一种实现是文件上传后先落地到应用服务器上,计算MD5并存储到数据库中,然后决定是否上传存储服务器。这样做的缺点是应用服务器端需要做并发控制,实现相对来说比较复杂。 FastDFS本身支持文件的排重处理机制,但需要FastDHT作为文件hash的索引存储。FastDHT是FastDFS同一个作者的开源kay-value数据库。其排重原理为: FastDFS的storage server每次上传均计算文件的hash值,然后从FastDHT服务器上进行查找比对,如果没有返回,则写入hash,并将文件保存。如果有返回,则建立一个新的文件链接(软链接,指向已存在的文件),不保存文件。 ## FastDHT FastDHT是一个基于键值对(Key Value Pair)的高效分布式Hash系统。它可以存储大量的Key Value Pair,比如可以用来存储文件名映射表、session数据、用户相关数据等等。 FastDHT服务器底层存储采用Berkeley DB,支持大数据量,网路IO采用libevent,支持大量并发连接。FastDHT只用到了BDB最基本的存储功能,数据同步是自己实现的,采用了binlog的复制方式。 FastDHT集群由一个或多个组(group)组成,每个组由一台或多台服务器组成,同组服务器上存储的数据是相同的,数据同步只在同组的服务器间进行。组内各个服务器是对等的,对数据进行存取时,可以根据key的hash值来决定使用哪台服务器。数据同步采用推(Push)方式,由源服务器主动将数据同步到本组的其它服务器。 由客户端决定应该选择哪台服务器,为避免查表,应该根据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)。 FastDHT中,key由三部分组成: namespace、object ID和key name,这个设计和数据库的底层划分相似: namespace对应database,object ID对应table,而key对应字段。引入namespace的目的是解决多个使用者(如: 应用或产品)之间可能存在的数据冲突问题。引入object ID是便于对object相关的数据(如用户资料)进行组织和管理,以提高整体性能。引入namespace和object ID使得系统具有更大的灵活性,在实际使用中,这两个字段可以设置为空值。在计算key的hash_code时,如果namespace和object ID不为空,将这二者合并起来作为hash函数的输入,否则将key作为hash函数的输入。 系统扩容时,为了避免重新进行hash分布(rehash),FastDHT引入了逻辑分组的概念。一个物理分组对应一组服务器,一组服务器(物理分组)上可以有多个逻辑分组。FastDHT的一个服务进程支持多个逻辑分组,每个组对应一个BOB的数据文件。这样的设计为以后的扩容提供了便利。在初期估算出今后需要的大致分组数目(逻辑分组数),然后将逻辑分组对应到物理分组中。扩容时,将一个或多个逻辑分组迁移到新增的物理分组上,只需要拷贝对应的BOB数据文件,并修改相应的配置文件,重启服务器和客户端程序即可。 FastDHT支持超时(timeout),每个key都有超时属性。这样可以使用FastDHT来存储session数据,比传统的数据库存储方案更加高效和简洁。 ## FastDFS使用FastDHT去重 前提为已经布置好FastDFS服务。 ### 安装Berkeley DB ``` wget http://download.oracle.com/berkeley-db/db-6.2.23.tar.gz tar -zxf db-6.2.23.tar.gz cd db-6.2.23 ./dist/configure --prefix=/usr/local/db make && make install ``` ### 安装FastDHT ``` git clone https://github.com/happyfish100/fastdht.git cd fastdht #修改make.sh vi make.sh CFLAGS='-Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE' #改为: CFLAGS='-Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -I/usr/local/db/include/ -L/usr/local/db/lib/' ./make.sh ./make.sh install ``` ### 配置fdht_client.conf vi /etc/fdht/fdht_client.conf ``` #本选项关联 storaged.conf文件 keep_alive=1 base_path=/var/data/fdht #include /etc/fdht/fdht_servers.conf # 此选项加#表示开启 关闭需要使用## ``` ``` mkdir -p /var/data/fdht ``` ### 配置fdht_servers.conf vi /etc/fdht/fdht_servers.conf ``` group_count=2 group0 = 192.168.1.201:11411 group0 = 192.168.1.202:11411 group1 = 192.168.1.203:11411 group1 = 192.168.1.204:11411 ``` ### 配置fdhtd.conf vi /etc/fdht/fdhtd.conf ``` bind_addr=192.168.1.101 port=11411 base_path=/var/data/fdht cache_size=64MB #include /etc/fdht/fdht_servers.conf ``` ### 引入libdb.so ``` ln -s /usr/local/db/lib/libdb-6.2.so /usr/lib/libdb-6.2.so ln -s /usr/local/db/lib/libdb-6.2.so /usr/lib64/libdb-6.2.so ``` ### 启动FastDHT ``` fdhtd /etc/fdht/fdhtd.conf ``` ### 开机启动 vi /etc/rc.local ``` /usr/local/bin/fdhtd /etc/fdht/fdhtd.conf ``` ``` chmod +x /etc/rc.local ``` ### 配置storaged.conf ``` check_file_duplicate=1 key_namespace=FastDFS keep_alive=1 # include /etc/fdht/fdht_servers.conf ``` 重启fdfs_storaged,至此,配置完成。 Last modification:November 27th, 2020 at 05:34 pm © 允许规范转载