- 1. FastDHT ----分布式Hash系统余庆
2009-6-18
- 2. FastDHT简介分布式hash系统,存储Key Value Pair
支持两种存储方式
缓存方式的MPOOL
持久存储方式的BDB
Key包括三部分:
Namespace
ObjectID
Key
Key可设置过期时间,自动清除过期数据
Server端划分group,同group数据互相备份,并且可自动压缩binlog
服务端可使用单线程,多线程模式
- 3. FastDHT一些特性虚拟farm,便于扩容
分布式算法client端实现,不需要中心服务器
二进制通信协议,支持Proxy
使用libevent,异步IO方式,支持大并发
自动failover
支持长连接
- 4. FastDHT通信协议typedef struct
{
char pkg_len[FDHT_PROTO_PKG_LEN_SIZE]; //body length
char key_hash_code[FDHT_PROTO_PKG_LEN_SIZE]; //the key hash code
char timestamp[FDHT_PROTO_PKG_LEN_SIZE]; //current time
/* key expires, remain timeout = expires - timestamp */
char expires[FDHT_PROTO_PKG_LEN_SIZE];
char cmd;
char keep_alive;
char status;
} FDHTProtoHeader;
- 5. 长连接与短连接短连接
每次请求需要重新连接服务器
长连接
将连接保存,进程没有停止、连接没有断掉就可以重复使用
断掉重连
需要设置SO_KEEPALIVE、TCP_NODELAY
- 6. Client端分布算法
- 7. 如何根据Key进行分布?读写分布算法相同
计算key的hash code
由hash code决定分布到哪个组:
group_index = hash_code % group_count
计算新的hash code,决定分布到哪台机器:
new_hash_code = (hash_code << 16) | (hash_code >> 16)
server_index = new_hash_code % server_count_in_the_group
- 8. Server流程
- 9. BDB存储方式建议采用虚拟farm,便于今后扩容
记录binlog,同group数据互备
持久存储
- 10. MPOOL存储方式全部存储于内存中
采用Hash Table
各个server建议不进行互备,所有server配置到一个group中
对每个key可以设置过期时间,定期清除和临界点触发式清除两种方式
内存使用自动扩展
内存使用到达上限返回错误
强制单线程模式???
- 11. FastDHT和Memcachedb对比指标FastDHTMemcachedb同步机制多Master,通过自己的binlog实现同步Master-Slave,采用了BDB的同步机制可扩容行好,通过虚拟farm实现差,不支持虚拟farm,需要重新hash数据安全好,万一BDB数据文件毁坏,可通过binlog恢复一般,存储和更新log完全依赖BDB,一旦BDB数据文件毁坏,很难通过BDB的binlog恢复磁盘空间占用较小,自己实现的Binlog,比较精简较大,BDB的binlog比较臃肿一些可维护性较好,任何错误都会记录到日志文件中较差,貌似和memcache一样,没有日志文件性能较好,没有使用BDB的事务机制待测试,使用了BDB的事务机制,估计不会比FastDHT强
- 12. FastDHT和Memcached对比指标FastDHTMemcached性能MPOOL方式下,好好可维护性较好,任何错误都会记录到日志文件中较差,貌似没有日志文件内存利用率好,使用系统自带的内存管理函数较好,使用自己实现的内存管理
通信协议二进制协议,统一、高效文本协议,需要逐个命令解析,效率较低多CPU支持好好PHP扩展是否支持配置文件支持,针对较大的服务器集群时性能较好不支持,针对较大的服务器集群时性能一般
- 13. 服务器列表配置示例fdht_servers.conf(2×2):
group_count = 2
group0 = 192.168.209.107:11411
group0 = 192.168.209.108:11411
group1 = 192.168.209.107:11411
group1 = 192.168.209.108:11411
- 14. bind_addr=
port=11411
network_timeout=60
base_path=/home/yuqing/fastdht
max_connections=32
max_threads=32
max_pkg_size=64KB
min_buff_size=64KB
store_type = MPOOL
cache_size = 32MB
…
mpool_init_capacity = 10000
mpool_load_factor = 0.75
mpool_clear_min_interval = 30
…
sync_log_buff_interval=10
sync_db_time_base=00:00
sync_db_interval=86400
write_to_binlog=0
sync_binlog_buff_interval=60
clear_expired_time_base=04:00
clear_expired_interval=86400
…
compress_binlog_time_base=02:00
compress_binlog_interval=86400
#include fdht_servers.conf服务器端配置示例
- 15. network_timeout=60
keep_alive=1
base_path=/home/yuqing/fastdht
log_level=info
use_proxy=0
proxy_addr=127.0.0.1
proxy_port=12200
#include fdht_servers.conf客户端配置实示例
- 16. extension = fastdht_client.so
fastdht_client.network_timeout=60
fastdht_client.base_path=/home/yuqing/fastdht
fastdht_client.log_level=info
fastdht_client.log_filename=
fastdht_client.config_count = 2
fastdht_client.config_file0 = /home/yuqing/fastdht/conf/fdht_client.conf
fastdht_client.config_file1 = /home/yuqing/fastdht/conf/fdht_client.conf
PHP配置实示例