Like Share Discussion Bookmark Smile

J.J. Huang   2021-12-07   Data migration ScyllaDB   瀏覽次數:

資料遷移 | ScyllaDB to Cassandra

原由

由於設備的變更,需要將原設備的資料,搬遷至新設備的服務;
而且是由Scylla搬遷至Cassandra
重點是版本差異很大的搬遷,使用正常的搬遷方式會遇到很多的錯誤;

而網路上又查不到什麼有用的相關資訊,固以下方法才將其筆記起來。

最終使用了一個ScyllaDB to Cassandra之邪魔歪道資料遷移大法。

註:上面這個方法的命名是另一位同事提出的,作者已笑翻XD。

搬遷錯誤

第一種:直接使用Scylla裡面的sstableloader進行搬移至Cassnadra 4.0.1的錯誤如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
org.apache.cassandra.exceptions.ConfigurationException: Invalid value 99p for option 'speculative_retry'
at org.apache.cassandra.schema.SpeculativeRetryParam.fromString(SpeculativeRetryParam.java:130)
at org.apache.cassandra.cql3.statements.TableAttributes.build(TableAttributes.java:152)
at org.apache.cassandra.cql3.statements.TableAttributes.validate(TableAttributes.java:55)
at org.apache.cassandra.cql3.statements.CFProperties.validate(CFProperties.java:35)
at org.apache.cassandra.cql3.statements.CreateTableStatement$RawStatement.prepare(CreateTableStatement.java:216)
at com.scylladb.tools.BulkLoader$CQLClient.getCFMetaData(BulkLoader.java:689)
at com.scylladb.tools.BulkLoader.process(BulkLoader.java:1519)
at com.scylladb.tools.BulkLoader.lambda$main$1(BulkLoader.java:1336)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
org.apache.cassandra.exceptions.ConfigurationException: Invalid value 99p for option 'speculative_retry'
at org.apache.cassandra.schema.SpeculativeRetryParam.fromString(SpeculativeRetryParam.java:130)
at org.apache.cassandra.cql3.statements.TableAttributes.build(TableAttributes.java:152)
at org.apache.cassandra.cql3.statements.TableAttributes.validate(TableAttributes.java:55)
at org.apache.cassandra.cql3.statements.CFProperties.validate(CFProperties.java:35)
at org.apache.cassandra.cql3.statements.CreateTableStatement$RawStatement.prepare(CreateTableStatement.java:216)
at com.scylladb.tools.BulkLoader$CQLClient.getCFMetaData(BulkLoader.java:689)
at com.scylladb.tools.BulkLoader.process(BulkLoader.java:1519)
at com.scylladb.tools.BulkLoader.lambda$main$1(BulkLoader.java:1336)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
0% done. 0 statements sent (in 0 batches, 0 failed).
0 statements generated.
0 cql rows processed in 0 partitions.
0 cql rows and 0 partitions deleted.
0 local and 0 remote counter shards where skipped.

第二種:使用cassandra-4.0.1工具於ScyllaDB機器上運行搬遷的錯誤如下:

1
com.datastax.driver.core.exceptions.InvalidQueryException: Unknown function scylla_counter_shard_list called

上述兩種方式都無法正確搬遷資料,以下將會進行邪魔歪道資料遷移大法教學。

環境

  • 來源端(舊)

    • IP: 10.0.0.10
    • Version: Scylla Enterprise 2020.1.12
    • Keyspace: bookstore
    • Table: books
  • 暫存端

    • IP: 10.0.0.11
    • Version Cassnadra 3.11.9
    • Keyspace: bookstore
    • Table: books
  • 目的端(新)

    • IP: 10.0.0.12
    • Version Cassnadra 4.0.1
    • Keyspace: bookstore
    • Table: books

工具

此處使用的版本為 cassandra-4.0.1來做安裝示範。
<2021-12-06當時下載的最新版>

先行作業

  • 來源端KeyspaceTable匯出,並於目的端建立。

    註:KeyspaceTable名稱不可更換,基本上就是原封不動的Schema就是了。

  • 暫存端下載apache-cassandra-4.0.1-bin.tar.gz並解壓縮。
    指令範例:

    1
    2
    curl -OL http://dlcdn.apache.org/cassandra/4.0.1/apache-cassandra-4.0.1-bin.tar.gz
    tar xvzf apache-cassandra-4.0.1-bin.tar.gz

遷移流程

Scylla Enterprise 2020.1.12 -> Cassnadra 3.11.9 -> Cassnadra 4.0.1

說明:因為版本關係,透過中介Cassnadra 3.11.9來當做橋梁做資料搬遷。

資料遷移

  • 進入到來源端

  • 針對需要遷移的Keyspacesnapshot
    指令概要:

    1
    nodetool snapshot -t {tag} {keyspace_name}

    指令範例:

    1
    nodetool snapshot -t 2021_12_06 bookstore
  • 搜尋snapshot檔案的路徑。

    1
    find / -name 2021_12_06

    搜尋出大概如下的路徑:

    1
    2
    /var/lib/scylla/data/bookstore/books-e7003700570711eabe4c000000000000/snapshots/2021_12_06
    /var/lib/scylla/data/bookstore/books_index-e738ac20570711eabe4c000000000000/snapshots/2021_12_06

    注:可以看到有一個_index-的部分,此為View,並不是Table,請忽略。
    註:路徑依照可能會有所差異,請依自己搜尋到的為主。

  • 使用Scylla自身的sstableloader進行資料搬遷。
    指令概要:

    1
    sstableloader -d {暫存端IP清單} {快照的路徑(擷取至UUID即可)}

    指令範例:

    1
    sstableloader -d 10.0.0.11 /var/lib/scylla/data/bookstore/books-e7003700570711eabe4c000000000000/
  • 進入到暫存端

  • 進行Cassandra to Cassandra的搬遷動作,請參考前一篇 資料遷移 | Cassandra to Cassandra

  • 完成後,基本上資料就成功搬遷完畢。

額外狀況

如果發現搬遷後,只有部分資料,請注意你的設備/節點是否為多個;
多台機器的情況下,請至每一台都下一次指令,這樣就會把資料慢慢補齊。

註:理論上…。

結語

資料搬遷不外乎就是花時間和踩坑,上面的這個方法並不是最正統的方式,但是確實解決了此次的問題。
建議搬遷資料,還是使用相同資料存儲、相同版本是最無問題且相對簡單的。