2017-02-13 5 views
1

私はマスタデータのコピーを持ちたいテスト設定をしています。2台のサーバー間でCassandraデータベースを確実にコピーするにはどうすればよいですか?

私は、データのダンプを取り、テスト・セットアップにで復元するCQLSHを使用していdatastax、バージョン3.0.9

からカサンドラパッケージを使用しています。 私はDELIMITER = '\ tの' AND NULL = 'nullを' AND QUOTE = '"' AND HEADER = TrueのWITH

COPY TOを使用して、マスターデータのコピーを取っている

私はDELIMITER = '\ tの' AND NULL = 'nullを' AND QUOTE = '"' AND HEADER = Trueの

AFTE WITH FROM

COPYを使用してデータを移入していますr COPY_FROM、CQLSHはファイルからすべての行を正常にコピーしたことを示します。しかし、テーブル上でカウント(*)を実行すると、いくつかの行が欠落しています。 行を紛失する特定のパターンはありません。テーブルを切り捨てた後にコマンドを再生すると、新しい行セットが失われます。欠落している行の数はランダムです。

テーブル構造には、ユーザー定義データ型のリスト/セットが含まれており、UDTの内容に 'null'値が含まれている可能性があります。

プログラムで2つのデータベース間で個々の行を読み書きする以外にも、データを確実にコピーする方法はありますか?


テーブルのスキーマ(フィールド名がを変更):

CREATE TYPE UDT1 (
    field1 text, 
    field2 int, 
    field3 text 
); 

CREATE TYPE UDT2 (
    field1 boolean, 
    field2 float 
); 

CREATE TABLE cypher.table1 (
    id int PRIMARY KEY, 
    list1 list<frozen<UDT1>>, 
    data text, 
    set1 set<frozen<UDT2>> 
) WITH bloom_filter_fp_chance = 0.01 
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'} 
    AND comment = '' 
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'} 
    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'} 
    AND crc_check_chance = 1.0 
    AND dclocal_read_repair_chance = 0.1 
    AND default_time_to_live = 0 
    AND gc_grace_seconds = 864000 
    AND max_index_interval = 2048 
    AND memtable_flush_period_in_ms = 0 
    AND min_index_interval = 128 
    AND read_repair_chance = 0.0 
    AND speculative_retry = '99PERCENTILE'; 
+0

あなたはテストセットアップのスキーマを教えていただけますか? –

+0

スキーマ@AnowerPervesを追加しました – Cypher

答えて

2

あなたはデータそのものを試してみて、コピーすることができ、データのインポート/エクスポートの脇。

  1. "nodetool snapshot" https://docs.datastax.com/en/cassandra/3.0/cassandra/tools/toolsSnapShot.htmlを使用して、元のクラスタからのデータのスナップショットを作成します。
  2. テストクラスタに元のクラスタからのスナップショットをロードテストクラスタ
  3. にスキーマを作成する:

    。テストのすべてのノードがすべてのデータ(単一ノード/ 3ノードrf = 3)を保持している場合、またはデータの量が少ない場合は、元のクラスタからkeyspace/column_familyディレクトリにファイルをコピーし、ノードツールをリフレッシュします(https://docs.datastax.com/en/cassandra/3.0/cassandra/tools/toolsRefresh.html) - ファイルが重複しないようにしてください。

    b。テストクラスタ・ノードは、すべてのデータを保持していない場合は/データの量が大きい - 私は一般COPY TOを使用してスキーマをテストしたテストクラスタ

+0

私はテストクラスタ上に異なるトポロジーを持っています。したがって、 'nodetool refresh'は機能しません。 sstableloaderを試してみましょう。 – Cypher

0

上にスナップショットからファイルをストリーミングするsstablloader(https://docs.datastax.com/en/cassandra/3.0/cassandra/tools/toolsBulkloader.html)を使用しますデリミタなしでCOPY FROMパターンを使用しても問題ありません。私は何度もテストしましたが、何も欠けていません。

[email protected]:cypher> INSERT INTO table1 (id, data, list1, set1) VALUES (1, 'cypher', ['a',1,'b'], {true}) ; 
[email protected]:cypher> SELECT * FROM table1 ; 

id | data | list1                                | set1 
----+--------+-----------------------------------------------------------------------------------------------------------------------------------+-------------------------------- 
    1 | cypher | [{field1: 'a', field2: null, field3: null}, {field1: '1', field2: null, field3: null}, {field1: 'b', field2: null, field3: null}] | {{field1: True, field2: null}} 

[email protected]:cypher> INSERT INTO table1 (id, data, list1, set1) VALUES (2, '2_cypher', ['amp','avd','ball'], {true, false}) ; 
[email protected]:cypher> SELECT * FROM table1 ; 

id | data  | list1                                 | set1 
----+----------+------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------- 
    1 | cypher |  [{field1: 'a', field2: null, field3: null}, {field1: '1', field2: null, field3: null}, {field1: 'b', field2: null, field3: null}] |        {{field1: True, field2: null}} 
    2 | 2_cypher | [{field1: 'amp', field2: null, field3: null}, {field1: 'avd', field2: null, field3: null}, {field1: 'ball', field2: null, field3: null}] | {{field1: False, field2: null}, {field1: True, field2: null}} 

[email protected]:cypher> COPY table1 TO 'table1.csv'; 
Using 1 child processes 

Starting copy of cypher.table1 with columns [id, data, list1, set1]. 
Processed: 2 rows; Rate:  0 rows/s; Avg. rate:  0 rows/s 
2 rows exported to 1 files in 4.358 seconds. 
[email protected]:cypher> TRUNCATE table table1 ; 
[email protected]:cypher> SELECT * FROM table1; 

id | data | list1 | set1 
----+------+-------+------ 

[email protected]:cypher> COPY table1 FROM 'table1.csv'; 
Using 1 child processes 

Starting copy of cypher.table1 with columns [id, data, list1, set1]. 
Processed: 2 rows; Rate:  2 rows/s; Avg. rate:  3 rows/s 
2 rows imported from 1 files in 0.705 seconds (0 skipped). 
[email protected]:cypher> SELECT * FROM table1 ; 

id | data  | list1                                 | set1 
----+----------+------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------- 
    1 | cypher |  [{field1: 'a', field2: null, field3: null}, {field1: '1', field2: null, field3: null}, {field1: 'b', field2: null, field3: null}] |        {{field1: True, field2: null}} 
    2 | 2_cypher | [{field1: 'amp', field2: null, field3: null}, {field1: 'avd', field2: null, field3: null}, {field1: 'ball', field2: null, field3: null}] | {{field1: False, field2: null}, {field1: True, field2: null}} 

(2 rows) 
[email protected]:cypher> 
+0

努力をいただきありがとうございます。小さなテーブルサイズでは何の問題も見つけられませんでした。しかし、大きなテーブル(〜100万エントリ)を使用すると、エントリが削除されます。 – Cypher

関連する問題