1

ワイド列インデックスを使用して、レコードをタイムライン形式で並べ替えています。

"TimelineIndex" //CF name
  [CFName] //row key
    [TimeUUID]:[CFRowKey] //column name/value
    [TimeUUID]:[CFRowKey] //column name/value
    [TimeUUID]:[CFRowKey] //column name/value
    [TimeUUID]:[CFRowKey] //column name/value

TimelineIndex CFに、「01/01/201312:00:00」から「10/01/201312:00:00」までの範囲の1日あたり1列の10個のレコードがあり、実行するとします。次のget_slice()コマンド:

var predicate = new SlicePredicate(){ Slice_range = new SliceRange() {
{
  Start = TimeGenerator.GetTimeUUID(new DateTime("06/01/2013 12:00:00"),
  Finish = TimeGenerator.GetTimeUUID(new DateTime("11/01/2013 12:00:00"),
  Count = 5,
  Reversed = false
}};
var results = client.get_slice([CFName], parent, predicate, consitencylevel.one);

このクエリによって返される列は、常に一貫しているとは限りません。ほとんどの場合、「06/01/2013 12:00:00」という名前の列が返されますが、その列が結果から除外されることがよくあり(10回の実行に約1回)、4列しか返されません。 。

なぜここで一貫性のない結果が得られるのか、私は一生理解できません。これの理由を示唆するものはありますか?

そして、誰もが言う前に、Thriftを直接使用することはお勧めできません-これは純粋に概念実証の演習です!

4

2 に答える 2

4

明白なことをくどくど言うリスクがありますが、TimeUUID (バージョン 1 UUID) には 2 つの目的があることを覚えておいてください。

  • 時間ベースのコンポーネントがあります
  • それらはUUIDです

したがって、複数の時間ベースのデータ値を挿入し、列名の競合によるデータの損失を心配することなく、それらを時系列に戻すことができます。

また、Cassandra がデータを正しく検索するには、列名をグローバルに並べる必要があり、UUID も例外ではありません。したがって、Cassandra に同じ時間コンポーネントを持つ 2 つの TimeUUID を指定すると、非時間コンポーネントに基づいて順序付けされます。

したがって、何が起こっているかというと、上記の 2 つのポイントの微妙な相互作用です06/01/2013 12:00:00。そうでない場合、最初の列は含まれません。

これを修正するには、クエリ UUID の時間以外のコンポーネントを意図的に構築して、可能な限り低くソートする必要があります。たとえば、pycassa ライブラリはこれを行います。

于 2013-01-10T18:43:38.250 に答える
0

問題は一貫性レベルに関連している可能性があります。2 つのレプリカがありますが、一貫性レベル 1 で読み取りを行っています。ONEでも書くと、説明したように問題が発生します。読み取りレベルを QUORUM (または LOCAL_QUORUM) に変更すると、データが消えることはないと思います。散発的に消えるデータは、ほとんどの場合一貫性の問題です。

なぜこれが起こるのですか?

RF=2 の 3 つのノードのセットアップを使用して、列 A に CL=ONE を書き込むとします。これで、列 A を持つ 1 つのノード (N1 としましょう) があり、理論的にはレプリカを取得するもう 1 つのノード (N2 としましょう) にはまだレプリカがありません。したがって、次のようになります。

N1: has A
N2: does not have A
N3: will look to N1 or N2 for A

それでは、CL=ONE を使用して各ノードに A を要求するとどうなるか見てみましょう。

N1: you get A
N2: you get nothing because it doesn't check with any other nodes
N3: you may get A or nothing, depending on whether the request gets handled by N1 or N2

CL=QUORUM で読み取る場合:

N1: you get A, and N2 gets updated due to repair on read
N2: you get A, because it checks against N1 and repairs
N3: you get A, because both N1 and N2 will reliably return it

QUORUM 読み取りを使用して、これが問題であるかどうかを簡単に確認できます。その場合、問題は再発しません。

于 2013-01-11T18:56:54.500 に答える