1

「DeviceID」や「DayOfYear」などの列に 2 つのセカンダリ インデックスを持つ Cassandra 0.8 を使用しています。日付の範囲内でデバイスのデータを取得するために、これら 2 つのインデックスがあります。日付フィルターを取得するたびに、これを DayOfYear に変換し、.net Thrift API を使用してインデックス付きスライスを使用して検索します。現在、DB もアップグレードできません。

私の問題は、通常、現在の日付の get_indexed_slices クエリを使用して行を取得する際に問題がないことです (現在の日付を使用)。しかし、昨日の日付 (インデックス付きの列の 1 つ) をクエリすると、初めてクエリを実行するときにタイムアウトが発生します。ほとんどの場合、2 回目にクエリを実行すると返され、3 回目には 100% 返されます。

これらの列は両方とも、列ファミリーで double データ型として作成され、通常、1 分間に 1 レコードを取得します。クラスターに 3 つのノードがあり、nodetool のレポートではノードが稼働中であることが示されていますが、nodetool からの負荷分散レポートは次のようになっています。

Starting NodeTool Address DC Rack Status State Load Owns
xxx.xx.xxx.xx datacenter1 rack1 Up Normal 7.59 GB 51.39%
xxx.xx.xxx.xx datacenter1 rack1 Up Normal 394.24 MB 3.81%
xxx.xx.xxx.xx datacenter1 rack1 Up Normal 4.42 GB 44.80%
YAMLでの私の設定は以下の通りです。

hinted_handoff_enabled: true
max_hint_window_in_ms: 3600000 # one hour
hinted_handoff_throttle_delay_in_ms: 50
partitioner: org.apache.cassandra.dht.RandomPartitioner
commitlog_sync: periodic
commitlog_sync_period_in_ms: 120000
flush_largest_memtables_at: 0.75
reduce_cache_sizes_at: 0.85
reduce_cache_capacity_to: 0.6
concurrent_reads: 32
concurrent_writes: 24
sliced_buffer_size_in_kb: 64
rpc_keepalive: true
rpc_server_type: sync
thrift_framed_transport_size_in_mb: 15
thrift_max_message_length_in_mb: 16
incremental_backups: true
snapshot_before_compaction: false
column_index_size_in_kb: 64
in_memory_compaction_limit_in_mb: 64
multithreaded_compaction: false
compaction_throughput_mb_per_sec: 16
compaction_preheat_key_cache: true
rpc_timeout_in_ms: 50000
index_interval: 128

不足している可能性のあるものはありますか?設定に問題はありませんか?

4

3 に答える 3

2

キーが検索データである別の列ファミリーにデータを複製します。行スライスははるかに高速です

個人的には、本番環境でセカンダリ インデックスを使用することはありませんでした。または、タイムアウトの問題が発生したか、セカンダリ インデックスによるデータ取得の速度が、挿入されたデータの量よりも低かったです。データをシーケンシャルに読み込めないこととHDシークタイムが関係していると思います。

于 2012-08-24T12:17:34.227 に答える
1

リレーショナル モデルの場合、playOrm は同じくらい高速であり、noSQL ストアでリレーショナルになることができますが、非常に大きなテーブルを分割するだけで済みます。それができれば、「スケーラブルな JQL」を使用して作業を行うことができます

@NoSqlQuery(name="findJoinOnNullPartition", query="PARTITIONS t(:partId) select t FROM TABLE as t INNER JOIN t.security as s where s.securityType = :type and t.numShares = :shares")

ITには、基本的なORMの@ManyToOne、@OneToManyなどの注釈もありますが、noSQLでは動作が異なるものもありますが、多くは似ています。

于 2012-09-05T12:42:41.220 に答える
-1

私は最終的に別の方法で問題を解決しました。実際、問題はデータ モデルにあることに気付きました。

問題が発生するのは、私たちが RDBMS のバックグラウンドを持っているためです。データ モデルを少し再構築した結果、応答が速くなりました。

于 2012-09-02T10:46:19.963 に答える