DSE Advanced Replication(DSE拡張レプリケーション)の使用開始

DSE Advanced Replication(DSE拡張レプリケーション)をテストするためのDataStax Enterpriseのソース・クラスターとデスティネーション・クラスターの設定手順。

cassandra.yaml

cassandra.yamlファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/cassandra/cassandra.yaml
tarボール・インストール installation_location/resources/cassandra/conf/cassandra.yaml

dse.yaml

dse.yamlファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/dse.yaml
tarボール・インストール installation_location/resources/dse/conf/dse.yaml

Advanced Replication(拡張レプリケーション)をテストするには、ソース・クラスターとデスティネーション・クラスターを設定する必要があります。以下の手順では、各クラスターに1つのノードを設定します。

使用開始の概要:
  1. デスティネーション・クラスター・ノードを設定する
  2. ソース・クラスターを設定する
  3. サンプル・キースペースとテーブルを作成する
  4. ソース・ノードでレプリケーションを構成する
  5. レプリケーション・チャネルを作成する
  6. ソースからデスティネーションへのレプリケーションを開始する
  7. ソースにデータを挿入する
  8. 接続の切断をテストする
  9. レプリケーションの開始と停止をテストする
注: Cassandra-11368のため、リスト挿入はべき等でない(変更なし)可能性があります。DSE Advanced Replication(DSE拡張レプリケーション)は、同じメッセージをデスティネーションに複数回配信することがあるため、カラム・ファミリー・スキーマでリストが使用されている場合、このCassandraのバグによりデータの不整合が発生する可能性があります。順序が重要でない場合は、セットやfrozenリストなどの他のコレクション型を使用すること推奨します。

デスティネーション・クラスター・ノードを設定する

重要: 前提条件:DSE 5.0のAdvanced Replication(拡張レプリケーション)V1を使用している場合は、DSE 5.1にアップグレードし、Advanced Replication(拡張レプリケーション)V2に移行する必要があります。
デスティネーション・ノードで以下の手順を実行します。
  1. DataStax Enterpriseをインストールします
  2. インストール方法に適したコマンドを使用して、DataStax Enterpriseをトランザクション・ノードとして起動します。
  3. デスティネーション・ノードのパブリックIPアドレスを書き留めておきます。

ソース・クラスターを設定する

拡張レプリケーションは、バージョンが混在している環境で操作できます。ソース・クラスターには、DataStax Enterprise 5.1以降が必要です。ソース・ノードで以下のコマンドを実行します。
  1. DataStax Enterprise 5.1以降をインストールします
  2. レプリケーションを有効にするには、 dse.yamlファイルを編集します。
    ファイルの最後にあるadvanced_replication_options設定とオプションをコメント解除し、enabled: trueを設定します。
    # Advanced Replication configuration settings
    advanced_replication_options:
        enabled: true
  3. Capture-Data-Change(CDC)cassandra.yaml ファイルで各ソースのノードごとに有効にします。
    cdc_enabled: true
    注: 機能を実装するためにCDCログが使用されるため、CDCが有効になっていない場合、Advanced Replication(拡張レプリケーション)は起動しません。
  4. 負荷に応じて、デフォルトのCDCディスク領域を増やすことを検討してください(デフォルト:4096、またはcdc_raw_directoryが存在する領域の合計容量の1/8)。
    cdc_total_space_in_mb: 16384
  5. commitlog圧縮の以下の値を確認します。
    commitlog_compression:
       - class_name: LZ4Compressor
  6. インストール方法に適したコマンドを使用して、DataStax Enterpriseをトランザクション・ノードとして起動します。
  7. クラスターでAdvanced Replication(拡張レプリケーション)が起動すると、ソース・ノードは変更が必要なキースペースとテーブルを作成します。詳細については、「キースペース」を参照してください。

サンプル・キースペースとテーブルを作成する

以下の手順では、デモ用のキースペースとテーブルを作成する方法を示します。

  1. ソース・ノードとデスティネーション・ノードで、サンプルのキースペースとテーブルを作成します。
    CREATE KEYSPACE foo 
    WITH REPLICATION = {
       'class': 'SimpleStrategy', 
       'replication_factor':1};
    要確認: 大文字と小文字の区別を保持するには、コマンドライン引数のキースペースとテーブル名をエスケープした引用符で囲むことを忘れないでください。dse advrep create --keyspace \"keyspaceName\" --table \"tableName\"
  2. ソース・ノードで以下のコマンドを実行します。
    CREATE TABLE foo.bar (
       name TEXT, 
       val TEXT, 
       scalar INT, 
       PRIMARY KEY (name));
  3. デスティネーション・ノードで以下の手順を実行します。
    CREATE TABLE foo.bar (
       name TEXT, 
       val TEXT, 
       scalar INT, 
       source_id TEXT, 
       PRIMARY KEY (name, source_id));
    注: デスティネーション・ノードにはsource_idカラムが必要です。

ソース・ノードでレプリケーション・デスティネーションを構成する

DSE Advanced Replication(DSE拡張レプリケーション)では、すべての設定がCQLテーブルに格納されます。レプリケーションを構成するには、dse advrepコマンドライン・ツールを使用します。

ソース・ノードでレプリケーションを構成する場合:
  • ソース・ノードは、先に保存してあるパブリックIPアドレスを使用してデスティネーションを参照します。
  • source-id値は、このソース・ノードから取得するすべてのデータの一意識別子です。
  • source-id一意識別子は、デスティネーション・ノードでfoo.barテーブルが作成されたときに含められたsource-id-columnに書き込まれます。
レプリケーション・デスティネーションを構成するには、以下のコマンドを実行します。
dse advrep --verbose destination create --name mydest --addresses 10.200.182.148 --transmission-enabled true
Destination mydest created
構成を確認するには、以下のコマンドを実行します。
dse advrep destination list-conf
--------------------------------------------------------------------------------------------
|destination|name                                |value                                    |
--------------------------------------------------------------------------------------------
|mydest     |driver_ssl_enabled                  |false                                    |
--------------------------------------------------------------------------------------------
|mydest     |addresses                           |10.200.182.148                           |
--------------------------------------------------------------------------------------------
|mydest     |driver_read_timeout                 |15000                                    |
--------------------------------------------------------------------------------------------
|mydest     |driver_connections_max              |8                                        |
--------------------------------------------------------------------------------------------
|mydest     |source_id_column                    |source_id                                  |
--------------------------------------------------------------------------------------------
|mydest     |driver_connect_timeout              |15000                                    |
--------------------------------------------------------------------------------------------
|mydest     |driver_ssl_protocol                 |TLS                                      |
--------------------------------------------------------------------------------------------
|mydest     |driver_consistency_level            |QUORUM                                   |
--------------------------------------------------------------------------------------------
|mydest     |driver_used_hosts_per_remote_dc     |0                                        |
--------------------------------------------------------------------------------------------
|mydest     |driver_allow_remote_dcs_for_local_cl|false                                    |
--------------------------------------------------------------------------------------------
|mydest     |driver_compression                  |lz4                                      |
--------------------------------------------------------------------------------------------
|mydest     |driver_connections                  |1                                        |
--------------------------------------------------------------------------------------------
|mydest     |driver_ssl_cipher_suites            |[TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,|
|           |                                    |,                                        |
|           |                                    |TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,   |
|           |                                    |,                                        |
|           |                                    |TLS_RSA_WITH_AES_256_CBC_SHA256,         |
|           |                                    |,                                        |
|           |                                    |TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,  |
|           |                                    |,                                        |
|           |                                    |TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384,    |
|           |                                    |,                                        |
|           |                                    |TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,     |
|           |                                    |,                                        |
|           |                                    |TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,     |
|           |                                    |,                                        |
|           |                                    |TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,    |
|           |                                    |,                                        |
|           |                                    |TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,      |
|           |                                    |,                                        |
|           |                                    |TLS_RSA_WITH_AES_256_CBC_SHA,            |
|           |                                    |,                                        |
|           |                                    |TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,     |
|           |                                    |,                                        |
|           |                                    |TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,       |
|           |                                    |,                                        |
|           |                                    |TLS_DHE_RSA_WITH_AES_256_CBC_SHA,        |
|           |                                    |,                                        |
|           |                                    |TLS_DHE_DSS_WITH_AES_256_CBC_SHA,        |
|           |                                    |,                                        |
|           |                                    |TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, |
|           |                                    |,                                        |
|           |                                    |TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,   |
|           |                                    |,                                        |
|           |                                    |TLS_RSA_WITH_AES_128_CBC_SHA256,         |
|           |                                    |,                                        |
|           |                                    |TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,  |
|           |                                    |,                                        |
|           |                                    |TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,    |
|           |                                    |,                                        |
|           |                                    |TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,     |
|           |                                    |,                                        |
|           |                                    |TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,     |
|           |                                    |,                                        |
|           |                                    |TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,    |
|           |                                    |,                                        |
|           |                                    |TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,      |
|           |                                    |,                                        |
|           |                                    |TLS_RSA_WITH_AES_128_CBC_SHA,            |
|           |                                    |,                                        |
|           |                                    |TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,     |
|           |                                    |,                                        |
|           |                                    |TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,       |
|           |                                    |,                                        |
|           |                                    |TLS_DHE_RSA_WITH_AES_128_CBC_SHA,        |
|           |                                    |,                                        |
|           |                                    |TLS_DHE_DSS_WITH_AES_128_CBC_SHA,        |
|           |                                    |,                                        |
|           |                                    |TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, |
|           |                                    |,                                        |
|           |                                    |TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, |
|           |                                    |,                                        |
|           |                                    |TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,   |
|           |                                    |,                                        |
|           |                                    |TLS_RSA_WITH_AES_256_GCM_SHA384,         |
|           |                                    |,                                        |
|           |                                    |TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,  |
|           |                                    |,                                        |
|           |                                    |TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,    |
|           |                                    |,                                        |
|           |                                    |TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,     |
|           |                                    |,                                        |
|           |                                    |TLS_DHE_DSS_WITH_AES_256_GCM_SHA384,     |
|           |                                    |,                                        |
|           |                                    |TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,   |
|           |                                    |,                                        |
|           |                                    |TLS_RSA_WITH_AES_128_GCM_SHA256,         |
|           |                                    |,                                        |
|           |                                    |TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,  |
|           |                                    |,                                        |
|           |                                    |TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,    |
|           |                                    |,                                        |
|           |                                    |TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,     |
|           |                                    |,                                        |
|           |                                    |TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,     |
|           |                                    |,                                        |
|           |                                    |TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,   |
|           |                                    |,                                        |
|           |                                    |TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,     |
|           |                                    |,                                        |
|           |                                    |SSL_RSA_WITH_3DES_EDE_CBC_SHA,           |
|           |                                    |,                                        |
|           |                                    |TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,    |
|           |                                    |,                                        |
|           |                                    |TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,      |
|           |                                    |,                                        |
|           |                                    |SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,       |
|           |                                    |,                                        |
|           |                                    |SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA,       |
|           |                                    |,                                        |
|           |                                    |TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,        |
|           |                                    |,                                        |
|           |                                    |TLS_ECDHE_RSA_WITH_RC4_128_SHA,          |
|           |                                    |,                                        |
|           |                                    |SSL_RSA_WITH_RC4_128_SHA,                |
|           |                                    |,                                        |
|           |                                    |TLS_ECDH_ECDSA_WITH_RC4_128_SHA,         |
|           |                                    |,                                        |
|           |                                    |TLS_ECDH_RSA_WITH_RC4_128_SHA,           |
|           |                                    |,                                        |
|           |                                    |SSL_RSA_WITH_RC4_128_MD5,                |
|           |                                    |,                                        |
|           |                                    |TLS_EMPTY_RENEGOTIATION_INFO_SCSV]       |
--------------------------------------------------------------------------------------------
|mydest     |source_id                           |source1                                  |
--------------------------------------------------------------------------------------------
|mydest     |transmission_enabled                |true                                     |
--------------------------------------------------------------------------------------------

レプリケーション・チャネルを作成する

レプリケーション・チャネルは、ソース・クラスターとデスティネーション・クラスター間のデータ変更に定義されているチャネルです。レプリケーション・チャネルは、ソース・クラスター、ソース・キースペース、ソース・テーブル名、デスティネーション・クラスター、デスティネーション・キースペース、およびデスティネーション・テーブル名によって定義されます。ソース・クラスターはマルチ・データ・センター・クラスターに含めることができますが、レプリケーション・チャネルは1つのデータ・センターがその処理を行うように構成します。

デスティネーションのキースペースとテーブルにはソースと異なる名前を指定できますが、この例では同じ名前を使用しています。また、source-idsource-id-columnは、グローバル設定とは異なる値に設定することもできます。

キースペースとテーブルのレプリケーション・チャネルを作成するには、以下のコマンドを使用します。
dse advrep channel create --source-keyspace foo --source-table bar --source-id source1 --source-id-column source_id --destination mydest --destination-keyspace foo --destination-table bar --collection-enabled true --transmission-enabled true --priority 1
Created channel dc=Cassandra keyspace=foo table=bar to mydest
dse advrep channel status
------------------------------------------------------------------------------------------------------------------------------------------------------
|dc       |keyspace|table          |collecting|transmitting|replication order|priority|dest ks|dest table     |src id |src id col|dest  |dest enabled|
------------------------------------------------------------------------------------------------------------------------------------------------------
|Cassandra|foo     |bar            |true      |true       |FIFO             |1       |foo    |bar            |source1|source_id |mydest|true        |
------------------------------------------------------------------------------------------------------------------------------------------------------
警告: レプリケーション・チャネルの指定のキースペースでは、永続性のある書き込みが有効である必要があります。durable_writes = falseの場合、エラー・メッセージが表示され、チャネルは作成されません。レプリケーション・チャネルの作成後に永続性のある書き込みが変更されると、コミット・ログにテーブルが書き込まれず、CDCは機能しません。データがレプリケーション・チャネルから取り込まれず、警告は記録されますが、障害が検出されません。

ソースからデスティネーションへのレプリケーションを開始する

この時点で、レプリケーションが構成され、レプリケーション・チャネルは有効になっていて、レプリケーションが開始されています。
  1. デスティネーションで、cqlshを使用してデータが存在しないことを確認します。
    SELECT * FROM foo.bar;
    name | source_id | scalar | val
    ------+---------+--------+-----
    (0 rows)
  2. ソースでは、デスティネーションへのレプリケーションを一時停止または再開することができます。ここでは、再開する方法を示します。
    dse advrep channel resume --source-keyspace foo --source-table bar --transmission
    Channel dc=Cassandra keyspace=foo table=bar  collection to mydest was resumed
    --transmissionを指定してソースからデスティネーションへの送信を再開することも、--collectionを指定してソースでデータの収集を再開することもできます。
  3. レプリケーション・ログに記録されているレコードの数を確認します。まだデータが挿入されていないため、レプリケーション・ログのレコード数は0です。
    dse advrep replog count --destination mydest --source-keyspace foo --source-table bar
    0

ソースにデータを挿入する

デスティネーションにレプリケーションするためのデータをソースで挿入します。
  1. ソースで、cqlshを使用してデータを挿入します。
    INSERT INTO foo.bar (name, val, scalar) VALUES ('a', '1', 1);
    INSERT INTO foo.bar (name, val, scalar) VALUES ('b', '2', 2);
  2. デスティネーションで、データがレプリケートされたことを確認します。
    SELECT * FROM foo.bar;
    name  | source_id | scalar | val
    ------+---------+--------+-----
    a     | source1   | 1      | 1
    b     | source1   | 2      | 2
    (2 rows)

デスティネーションでデータを確認する

デスティネーションでデータを確認します。
  1. デスティネーションで、データがレプリケートされたことを確認します。
    SELECT * FROM foo.bar;
    name  | source_id | scalar | val
    ------+---------+--------+-----
    a     | source1   | 1      | 1
    b     | source1   | 2      | 2
    (2 rows)

接続の切断をテストする

デスティネーションへの接続の切断をテストするには、デスティネーションでDataStax Enterpriseプロセスを停止し、ソースでさらにデータを挿入します。予想される結果は、デスティネーション・クラスターの再開後、ただちにデータがレプリケートされることです。
  1. デスティネーション・クラスターで、DataStax Enterpriseを停止します。
    dse cassandra-stop
  2. ソースで、さらにデータを挿入します。
    INSERT INTO foo.bar (name, val, scalar) VALUES ('c', '3', 3);
    INSERT INTO foo.bar (name, val, scalar) VALUES ('d', '4', 4);
  3. レプリケーション・ログに記録されているレコードの数を確認します。レプリケーション・ログには2つのエントリーがあります。
    dse advrep replog count --destination mydest --source-keyspace foo --source-table bar
    2
  4. デスティネーションで、DataStax Enterpriseを再起動します。
    dse cassandra
    通信とデータ・レプリケーションが再開され、新しいレコードがソースからデスティネーションにレプリケートされるのを待ちます。
    SELECT * FROM foo.bar;
    name  | source_id | scalar | val
    ------+---------+--------+-----
    a     | source1   | 1      | 1
    c     | source1   | 3      | 3
    d     | source1   | 4      | 4
    b     | source1   | 2      | 2
    4 rows(s)
  5. ソースで、レプリケーション・ログの数は0に戻ります。
    dse advrep replog count --destination mydest --source-keyspace foo --source-table bar
    0

レプリケーションの開始と停止をテストする

接続の切断をテストする場合と同様に、advrepコマンドライン・ツールを使用して個々のレプリケーション・チャネルの一時停止や再開を実行できます。予想される結果は、新しく挿入されたデータがレプリケーション・ログに保存されず、デスティネーションに送信されないことです。
  1. ソースで、レプリケーション・チャネルを一時停止します。
    dse advrep --verbose channel pause --keyspace foo --table bar --collection
  2. さらにデータを挿入します。
  3. ソースで、レプリケーション・チャネルを再開します。
    dse advrep --verbose channel resume --keyspace foo --table bar --collection