假设我们有一个用户表,要按用户 ID 分区为整数 1,2,3...n。是否可以使用consistent hashing的方式对表进行分区?
好处是如果分区数量增加或减少,旧索引可以相同。
问题 A。
用一致性哈希算法做分区表好吗?
问题 B。
任何关系型数据库都内置了这个支持吗?
我猜一些 nosql 数据库已经在使用它了。
但这里的数据库指的是关系型数据库。
我刚刚在面试中遇到了这个问题。第一 react 我只是按长度回答mod,但后来有人质疑如果把表分成更多的部分,那就会出问题。
最佳答案
在我研究了一些 wiki 引用页面之后,例如 Partition (database)
我相信我的想法属于复合分区。
复合分区允许上述分区方案的某些组合,例如首先应用范围分区,然后应用散列分区。 一致性哈希可以被认为是哈希和列表分区的组合,其中哈希将 key 空间减少到可以列出的大小。
它还介绍了一些概念,例如 Consistent hashing , 和 Hash table
但是有些链接像Partition (database)有点旧了。如果有人能找到更多最新的引用资料那会更好。我的回答确实不完整。希望有人能更好地回答!
更新
Jonathan Ellis 好像在他的博客中已经提到,Cassandra 分布式数据库现在支持两种分区方案:传统的一致性哈希方案和保序分区器。 http://spyced.blogspot.com/2009/05/consistent-hashing-vs-order-preserving.html
来自 Tom White 的博客。一致性哈希的java实现示例
import java.util.Collection;
import java.util.SortedMap;
import java.util.TreeMap;
public class ConsistentHash<T> {
private final HashFunction hashFunction;
private final int numberOfReplicas;
private final SortedMap<Integer, T> circle = new TreeMap<Integer, T>();
public ConsistentHash(HashFunction hashFunction, int numberOfReplicas,
Collection<T> nodes) {
this.hashFunction = hashFunction;
this.numberOfReplicas = numberOfReplicas;
for (T node : nodes) {
add(node);
}
}
public void add(T node) {
for (int i = 0; i < numberOfReplicas; i++) {
circle.put(hashFunction.hash(node.toString() + i), node);
}
}
public void remove(T node) {
for (int i = 0; i < numberOfReplicas; i++) {
circle.remove(hashFunction.hash(node.toString() + i));
}
}
public T get(Object key) {
if (circle.isEmpty()) {
return null;
}
int hash = hashFunction.hash(key);
if (!circle.containsKey(hash)) {
SortedMap<Integer, T> tailMap = circle.tailMap(hash);
hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();
}
return circle.get(hash);
}
}
https://stackoverflow.com/questions/7087000/
相关文章:
drupal - 如何总结 drupal 7 中 View 表的列?
php - PEAR 邮件连接拒绝 smtp.gmail.com
security - 如何在 Web 应用程序中保护 HTML 电子邮件?
visual-studio - Visual Studio 安装项目预生成事件
objective-c - 如何在 Objective-C 中调试单例
android - 向 RadioGroup 和 Radiobutton 添加过渡动画
iphone - 在 iOS 上捕获视频时查询最佳像素格式?