algorithm - 关系型数据库是否可以利用一致性哈希的方式来做分区表?

假设我们有一个用户表,要按用户 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 上捕获视频时查询最佳像素格式?

django - 在 Django 中动态设置默认表单值

visual-studio-2010 - 无法调试 T-SQL 或存储过程

php - 在 ImageMagick 中量化图像时保留 alpha channel ?