2

整数 1,2,3...n としてユーザー ID によって分割されるユーザー テーブルがあるとします。テーブルの分割に使用されるコンシステント ハッシュの方法を使用できますか?

利点は、パーティションの数が増減した場合、古いインデックスが同じになる可能性があることです。

質問A.

コンシステント ハッシュ アルゴリズムを使用してパーティション テーブルを作成するのは良い考えですか?

質問B。

これがサポートされているリレーショナルデータベースはありますか?

一部のnosqlデータベースはすでにそれを使用していると思います。

ただし、ここでのデータベースはリレーショナル データベースを指します。

インタビューでこの質問に遭遇しました。最初の反応では、長さで mod と答えただけですが、テーブルをより多くの部分に分割すると、問題が発生する可能性があります。

4

2 に答える 2

0

オラクルハッシュパーティションについて、オラクルヘルプドキュメントの一部

いくつかの調査の後、オラクルは実際にはデフォルトのハッシュ分割によるコンシステントハッシュをサポートしています。それがどのように行われたかは秘密であり、公開されていませんが。しかし、実際にはHashMapの方法を活用していますが、一部のパーティションを非表示にしています。したがって、パーティションを追加/削除する場合、Oracleがさまざまなパーティションのデータを調整する作業は非常に少なくなります。アルゴリズムは、データを4のような2の累乗の数のパーティションに均等に分割することのみを保証します。そうでない場合は、いくつかのパーティションをマージ/分割します。

魔法は、4つのパーティションから5つのパーティションに増やす場合のように、実際には1つのパーティションを2つに分割します。4つのパーティションから3つに減らすと、実際には2つのパーティションが1つにマージされます。

誰かがより多くの洞察を持っている場合は、より詳細な回答を追加してください。

ハッシュ・パーティショニングハッシュ・パーティショニングは、オラクルが特定したパーティショニング・キーに適用するハッシュ・アルゴリズムに基づいて、データをパーティションにマップします。ハッシュアルゴリズムは、パーティション間で行を均等に分散し、パーティションにほぼ同じサイズを与えます。

ハッシュ分割は、デバイス間でデータを均等に分散するための理想的な方法です。ハッシュ分割は、範囲分割の代わりに使いやすい方法です。特に、分割するデータが履歴データでない場合や、明確な分割キーがない場合はそうです。

ノート:

パーティショニングで使用されるハッシュアルゴリズムを変更することはできません。

MYSQLハッシュパーティションについて、mysqlヘルプドキュメントの一部

2つのパーティション機能を提供します。1つはHASHによるパーティションです。もう1つはKEYによるパーティションです。

キーによるパーティション分割は、ハッシュによるパーティション分割と似ていますが、ハッシュパーティション分割でユーザー定義の式を使用する場合、キーパーティション分割のハッシュ関数はMySQLサーバーによって提供されます。MySQL Clusterは、この目的でMD5()を使用します。他のストレージエンジンを使用するテーブルの場合、サーバーはPASSWORD()と同じアルゴリズムに基づく独自の内部ハッシュ関数を使用します。CREATE TABLE ... PARTITION BY KEYの構文規則は、ハッシュでパーティション化されたテーブルを作成する場合の構文規則と似ています。

主な違いは次のとおりです。

•HASHではなくKEYが使用されます。

•KEYは、1つ以上の列名のリストのみを取ります。MySQL 5.1.5以降、パーティショニングキーとして使用される1つまたは複数の列は、テーブルに主キーがある場合は、テーブルの主キーの一部またはすべてを構成する必要があります。

CREATE TABLE k1 (
    id INT NOT NULL PRIMARY KEY,
    name VARCHAR(20)
)
PARTITION BY KEY()
PARTITIONS 2;

主キーがないが一意のキーがある場合、その一意のキーがパーティショニングキーに使用されます。

CREATE TABLE k1 (
    id INT NOT NULL,
    name VARCHAR(20),
    UNIQUE KEY (id)
)
PARTITION BY KEY()
PARTITIONS 2;

ただし、一意キー列がNOT NULLとして定義されていない場合、前のステートメントは失敗します。

しかし、それがどのように分割されるかはわかりません。コードを調べる必要があります。

于 2011-08-19T08:24:39.540 に答える
0

Partition (database)のようないくつかの wiki 参照ページを調査した後、

私の考えはComposite partitioningに属すると思います。

複合パーティショニングでは、たとえば最初にレンジ パーティショニングを適用し、次にハッシュ パーティショニングを適用することにより、上記のパーティショニング スキームの特定の組み合わせが可能になります。コンシステント ハッシュは、ハッシュとリスト パーティショニングを組み合わせたものと見なすことができます。この場合、ハッシュによってキー スペースがリスト可能なサイズに縮小されます。

また、 Consistent hashingHash tableなどのいくつかの概念も紹介します

しかし、 Partition (データベース)のような一部のリンクは古いものです。誰かがより良い最新のリファレンスを見つけることができれば。私の答えは確かに不完全です。誰かがもっとうまく答えてくれることを願っています!

アップデート

Jonathan Ellis が彼のブログで既に述べたように、Cassandra 分散データベースは現在、従来のコンシステント ハッシュ スキームと順序保持パーティショナーの 2 つのパーティショニング スキームをサポートしています。 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);
    }
}
于 2011-08-18T04:27:17.573 に答える