我读了这个: http://spyced.blogspot.com/2009/01/all-you-ever-wanted-to-know-about.html
我的问题:
1。)是否正确,Cassandra只使用布隆过滤器,找出最有可能包含密钥的SST(排序字符串表)?由于可能存在多个SST并且Cassandra不知道哪个SST可能是密钥?因此,为了加速查看所有SST,使用bloomfilters。它是否正确? (我想了解卡桑德拉是如何运作的......)
2。)为什么(如上面的链接中所解释)键多次哈希?是否正确需要多次使用不同的Hash函数进行哈希处理才能获得更好的“随机分布”位?如果这是错误的,为什么需要多次对密钥进行哈希处理?这会耗费CPU周期吗?如果我有几个Hash函数的输出,那么对结果做了什么,它们是ANDed还是XORded。这有什么不同吗?
3.)使用MD5与SHA1(根据文章是随机分布的)相比,“使用Bloomfilter来衡量积极因素”的差异有多大?为什么MD5不是随机分布的?
非常感谢!! 延
答案 0 :(得分:13)
1)是的,请参阅cassandra wiki中的this,
Cassandra在执行密钥查找时使用bloom过滤器来保存IO:每个SSTable都有一个与之关联的Bloom过滤器,Cassandra会在进行任何磁盘搜索之前进行检查,对几乎不存在的密钥进行查询
columns of a key可能分散在几个sstables中。如果它不是用于布隆过滤器,那么每次读取一个密钥都必须读取每个sstable,这非常昂贵。通过使用布隆过滤器,cassandra几乎总是只需查看包含该密钥数据的sstables。
2)This可能会让您更好地了解布隆过滤器。您散列k次以在大小为m的数组中提供独立位置。例如,如果A和B是集合中的元素,并且你有k = 2,你的散列函数是md5和sha1,m = 16,你可以做到
md5(A) % m = 7
sha1(A) % m = 12
md5(B) % m = 15
sha1(B) % m = 12
这使得m [7],m [12]和m [15]对于滤波器都是正确的。
要查看C是否在集合中,您可以
md5(C) % m = 8
sha1(C) % m = 12
由于m [8]为假,因此您知道C不在集合中,但对于D
md5(D) % m = 7
sha1(D) % m = 15
m [7]和m [15]都为真,但D不在集合中,因此D为误报。
这确实花费了cpu周期,但你正在交易cpu周期以减少io,这对cassandra来说很有意义。
3)文章没有提到md5。 md5是随机分布的,我猜测布隆过滤器的md5和sha-1之间的差异并不大。
答案 1 :(得分:2)
作为sbridges答案第3点的补充。
MD5和SHA-1是随机分布的,但是是加密散列函数。在实现任何类型的布隆过滤器时,性能的唯一瓶颈是散列所需的时间。这就是为什么使用加密函数会降低应用程序的性能。
建议使用非加密哈希函数,如Murmur哈希。 This paper,建议构造和散列函数,如:
g(x) = h1(x) + i * h2(x)
其中g(x)是新的哈希函数,h1和h2是标准哈希函数,i是从0到k的迭代次数。
通过使用这种技术,可以使用两个哈希函数达到相同的性能(假设k> 2)。