序章

あるRedisインスタンスから別のインスタンスにデータを移行する場合、レプリケーションスナップショットなど、さまざまな方法を採用できます。 ただし、管理対象データベースはデータベースの構成に対する制御の程度を制限することが多いため、クラウドプロバイダーによって管理されるRedisインスタンスにデータを移動する場合、移行はより複雑になる可能性があります。

このチュートリアルでは、DigitalOceanが管理するRedisインスタンスにデータを移行するために使用できる1つの方法の概要を説明します。 この方法では、Redisの内部を使用するBashスクリプトを作成します migrate stunnelで構成されたTLSトンネルを介してデータを安全に渡すコマンド。 このガイドでは、他のいくつかの一般的に使用される移行戦略と、 DigitalOcean ManagedDatabaseに移行するときに問題が発生する理由についても説明します。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • Ubuntu18.04を実行している1台のサーバー。 このサーバーには、管理者権限で構成されたユーザーと、で設定されたファイアウォールが必要です。 ufw. この環境をセットアップするには、Ubuntu18.04初期サーバーセットアップガイドに従ってください。
  • サーバーにインストールされているRedisバージョン4.0.7以降。 これを設定するには、 Ubuntu18.04にRedisをインストールして保護する方法に関するガイドのステップ1に従ってください。
  • DigitalOceanによって管理されるRedisインスタンス。 プロビジョニングするには、ManagedRedis製品ドキュメントを参照してください。
  • Stunnelは、マシン間にTLSトンネルを作成するために使用されるオープンソースプロキシであり、サーバーにインストールされ、ManagedRedisデータベースとの安全な接続を維持するように構成されています。 DigitalOceanマネージドデータベースでは、TLSを介して安全に接続を確立する必要があるため、これが必要です。 Stunnelとredis-cliを使用してTLSを介してマネージドRedisインスタンスに接続する方法に関するチュートリアルを完了して、これを設定します。 ただし、インストールする必要はありませんredis-tools すでにインストールされているので、ステップ1のパッケージ redis-cli 前の前提条件チュートリアルでRedisをインストールしたとき。

注:わかりやすくするために、このガイドでは、UbuntuサーバーでホストされているRedisインスタンスを「ソース」と呼びます。 同様に、DigitalOceanによって管理されるインスタンスを「ターゲット」または「管理対象データベース」として参照します。

Redisデータをマネージドデータベースに移行する際の考慮事項

あるRedisインスタンスから別のインスタンスにデータを移行するために使用できる方法はいくつかあります。 ただし、これらのアプローチの一部は、DigitalOceanによって管理されるRedisインスタンスにデータを移行するときに問題を引き起こします。

たとえば、レプリケーションを使用して、ターゲットのRedisインスタンスをソースの正確なコピーに変換できます。 これを行うには、ターゲットのRedisサーバーに接続して、 replicaof 次の構文のコマンド:

  1. replicaof source_hostname_or_ip source_port

これにより、ターゲットインスタンスは、以前に保存されていたデータを破棄することなく、ソースに保持されているすべてのデータを複製します。 これに続いて、次のコマンドを使用して、レプリカをプライマリインスタンスに昇格させます。

  1. replicaof no one

Redisデータを移行する別の方法は、いずれかのRedisを使用してソースインスタンスに保持されているデータのスナップショットを取得することです。 save また bgsave コマンド。 これらのコマンドは両方とも、スナップショットをで終わるファイルにエクスポートします .rdb、次にターゲットサーバーに転送します。 その後、Redisサービスを再起動して、データをロードできるようにします。

ただし、これら3つのコマンドはそれぞれ— replicaof, save、 と bgsave —DigitalOcean管理対象データベースでは無効になっています。 これらは、他の無効なコマンドの中でも、高度な特権または管理対象データベースサーバーの基盤となるファイルシステムへのアクセスを必要とするため、管理対象データベースソリューションには実用的ではありません。 このため、DigitalOceanは、他のマネージドデータベースプロバイダーと同様に、これらのコマンドへのアクセスを制限し、関連する移行方法を不可能にします。

DigitalOceanのマネージドデータベースでは、データを移行する手段としてレプリケーションとスナップショットの両方が許可されていないため、このチュートリアルでは、代わりにRedisのmigrateコマンドを使用してデータをソースからターゲットに移動します。 The migrate コマンドは一度に1つのキーのみを移動するように設計されていますが、このチュートリアルではBashスクリプトを使用してRedisデータベース全体を自動的に移行します。

ステップ1—(オプション)サンプルデータを使用してソースRedisインスタンスをロードする

このオプションの手順では、ソースRedisインスタンスにサンプルデータをロードして、データをマネージドRedisデータベースに移行してみることができます。 ターゲットインスタンスに移行するデータがすでにある場合は、ステップ2に進むことができます。

まず、次のコマンドを実行してRedisサーバーにアクセスします。

  1. redis-cli

パスワード認証を要求するようにRedisサーバーを構成した場合は、 auth コマンドの後にRedisパスワードを入力します。

  1. auth password

次に、次のコマンドを実行します。 これらは、文字列を保持するいくつかのキーに加えて、ハッシュを保持する1つのキー、リストを保持する1つのキー、および1つのセットを作成します。

  1. mset string1 "Redis" string2 "is" string3 "fun!"
  2. mset string4 "Redis" string5 "is" string6 "fast!"
  3. mset string7 "Redis" string8 "is" string9 "feature-rich!"
  4. mset string10 "Redis" string11 "has" string12 "fantastic documentation!"
  5. mset string13 "Redis" string14 "is" string15 "free and open-source!"
  6. mset string16 "Redis" string17 "has many" string18 "data types."
  7. mset string19 "Redis" string20 "allows" string21 "strings."
  8. hmset hash1 field1 "Redis" field2 "allows" field3 "hashes."
  9. rpush list1 "Redis" "also" "allows" "lists."
  10. sadd set1 "It" "even" "allows" "sets."

さらに、以下を実行します expire これらのキーのいくつかにタイムアウトを提供するコマンド。 これにより、それらは volatile になります。つまり、Redisは指定された時間が経過するとそれらを削除します。 7500 秒:

  1. expire string2 7500
  2. expire hash1 7500
  3. expire set1 7500

これで、ターゲットのRedisインスタンスにエクスポートできるサンプルデータがいくつかあります。 あなたは保つことができます redis-cli このデータをバックアップするために次のステップでそれからさらにいくつかのコマンドを実行するので、今のところプロンプトを開きます。

ステップ2—データのバックアップ

以前、このチュートリアルではRedisの使用について説明しました bgsave コマンドを使用して、Redisデータベースのスナップショットを取得し、それを別のインスタンスに移行します。 使用しませんが bgsave Redisデータを移行する手段として、移行プロセス中にエラーが発生した場合に備えて、ここでデータをバックアップするために使用します。

まだ開いていない場合は、Redisコマンドラインインターフェイスを開くことから始めます。

  1. redis-cli

また、パスワード認証を要求するようにRedisサーバーを構成した場合は、 auth コマンドの後にRedisパスワードを入力します。

  1. auth password

次に、を実行します bgsave 指図。 これにより、現在のデータセットのスナップショットが作成され、名前がで終わるダンプファイルにエクスポートされます。 .rdb:

  1. bgsave

注:前の考慮事項セクションで説明したように、Redisデータベースのスナップショットを次のいずれかで作成できます。 save また bgsave コマンド。 私たちが使用する理由 bgsave ここでのコマンドは、 save コマンドは同期を実行します。つまり、データベースに接続されている他のすべてのクライアントをブロックします。 このため、 saveコマンドのドキュメントでは、このコマンドを実稼働環境で実行することはほとんどないことを推奨しています。

代わりに、非同期を実行するbgsaveコマンドを使用することをお勧めします。 これにより、Redisはデータベースを2つのプロセスにフォークします。子が終了する前にデータベースを保存している間、親プロセスは引き続きクライアントにサービスを提供します。

クライアントがデータを追加または変更する場合は、 bgsave 操作が実行中または終了した後、これらの変更はスナップショットにキャプチャされません。

その後、を実行してRedisインスタンスへの接続を閉じることができます exit 指図:

  1. exit

このダンプファイルは、Redisインストールの作業ディレクトリにあります。 これがどのディレクトリかわからない場合は、お好みのテキストエディタでRedis設定ファイルを開いて確認できます。 ここでは、 nano:

  1. sudo nano /etc/redis/redis.conf

で始まる行に移動します dbfilename. デフォルトでは次のようになります。

/etc/redis/redis.conf
. . .
# The filename where to dump the DB
dbfilename dump.rdb
. . .

このディレクティブは、Redisがスナップショットをエクスポートするファイルを定義します。 次の行(コメントの後)は次のようになります。

/etc/redis/redis.conf
. . .
dir /var/lib/redis
. . .

The dir ディレクティブは、Redisスナップショットが保存されるRedisの作業ディレクトリを定義します。 デフォルトでは、これはに設定されています /var/lib/redis 例に示すように。

それを閉めて redis.conf ファイル。 ファイルに変更を加えていない場合は、を押して変更できます。 CTRL+X.

次に、Redis作業ディレクトリの内容を一覧表示して、エクスポートされたデータダンプファイルが保持されていることを確認します。

  1. sudo ls /var/lib/redis

ダンプファイルが正しくエクスポートされた場合は、次のコマンドの出力に表示されます。

Output
dump.rdb

データが正常にバックアップされたことを確認したら、データを管理対象データベースに移行するプロセスを開始できます。

ステップ3—移行スクリプトを作成する

このガイドではRedisの内部を使用していることを思い出してください migrate キーをソースデータベースからターゲットに1つずつ移動するコマンド。 ただし、このチュートリアルの前の手順とは異なり、このコマンドをから実行することはありません。 redis-cli 促す。 代わりに、Bashスクリプトを記述します。このスクリプトを呼び出すと、1つのコマンドですべてのキーをソースRedisインスタンスから管理対象インスタンスに移行できます。

注:ソースRedisインスタンスにデータを書き込むクライアントがある場合は、管理対象データベースにもデータを書き込むようにクライアントを構成するのがよいでしょう。 このようにして、移行後に発生する書き込みを失うことなく、既存のデータをソースからターゲットに移行できます。

また、既存のキーの1つが移行するキーと同じ名前でない限り、この移行スクリプトはターゲットデータベース上の既存のキーを置き換えないことに注意してください。

名前の付いた新しいファイルを開きます redis-migrate.sh:

  1. nano redis-migrate.sh

ファイルの先頭に、shebangを追加します。 これは、スクリプトを次のコマンドで実行する必要があることをサーバーに通知する一連の文字です。 bash シェル:

redis-migrate.sh
#!/bin/bash

set 特定の環境変数を設定または設定解除できます。 これは、いくつかの潜在的な落とし穴から保護するために使用するため、このスクリプトに役立ちます。

シバンの下に、以下を追加します set 指図:

redis-migrate.sh
#!/bin/bash
set -euo pipefail

これには、 e オプション。スクリプト内のコマンドがゼロ以外のステータスで終了した場合、スクリプトはすぐに終了します。 u オプション。 setu フラグは、未設定の変数を強制的に終了させるエラーとして扱うようにスクリプトに指示します。 このスクリプトはユーザー入力を必要とするため、これは私たちの目的に役立ちます。

最後の旗、 o さまざまなパラメータを設定できます。 ここで、 pipefail オプション。 * nixシステムでは、パイプ(|)は、あるコマンドの出力を別のコマンドへの入力として渡すために使用されます。 例えば:

echo “Carpe diem, quam minimum credula postero.” | grep diem

パイプの左側にあるコマンド(この例では、 echo コマンド)が失敗した場合でも、それが引き起こすエラーメッセージは、パイプの右側のコマンドにパイプされます( grep コマンド)エラーメッセージがまだ有効な出力であるため。 The pipefail オプションはこの動作を変更し、パイプチェーン内のいずれかのコマンドがエラーを引き起こした場合にスクリプトを終了させます。

このスクリプトはRedisを使用します scan データベース内のすべてのキーを反復処理するコマンド。 でも、 scan 一度に反復できるのは1つのデータベースのみです。つまり、複数のデータベースにキーが保存されている場合は、スキャンして移行するデータベースを指定できる必要があります。 同様に、 migrate このスクリプトで使用するコマンドでは、データの移行先のターゲットインスタンスで論理データベースを指定する必要があります。

このため、このスクリプトでは、ユーザーが管理対象Redisインスタンスのソースデータベースとターゲットデータベースの両方を表す番号をコマンドライン引数として渡す必要があります。 このために、以下を追加します if/then 声明:

redis-migrate.sh
#!/bin/bash
set -euo pipefail

if [ "$#" -lt 2 ]
then
  echo "Migrate Redis keys to a DigitalOcean Managed Database"
  echo "Usage: $0 [source database] [target database]"
  exit 1
fi

このステートメントは、スクリプトに渡される引数の数が2未満であるかどうかをチェックします。 その場合、スクリプトの機能とスクリプトを正しく呼び出す方法をユーザーに通知するメッセージを出力します。 その後すぐに終了し、 if/then ステートメントはで終了します fi.

次に、次の変数を定義します。

  • sourcedb:スクリプトはこの変数を使用して、ソースインスタンス上の論理Redisデータベースを参照します。 呼び出されたときにスクリプトに渡される最初の引数に設定します(${1})
  • targetdb:同様に、スクリプトはこの変数を使用して、ターゲットインスタンス上の論理データベースを参照します。 この変数を、スクリプトに渡される2番目の引数に設定します(${2})
  • cursor:スクリプトがこの変数をどのように使用するかについては、後ほど説明します。 今のところ、 -1.

これらの変数を宣言する新しい行は、次のようになります。

redis-migrate.sh
. . .
  exit 1
fi

sourcedb=${1}
targetdb=${2}
cursor=-1

マネージドRedisインスタンスでは通常、ユーザーが認証のためにパスワードを送信する必要があります。 このスクリプトにパスワードをハードコーディングするのではなく、次の強調表示された行を追加して、ローカルインスタンスと管理対象Redisインスタンスの両方のパスワードを入力するようにユーザーに求めるプロンプトをいくつか設定します。

これらの新しい行の1番目と3番目は、Bashを使用しています。 read ビルトイン。 read 標準入力から1行を読み取り、その値を引数として渡された変数名に割り当てます。 これらの行の両方に含まれています -s オプション、これは防止します read パスワードなどの機密情報にとって重要な、端末への入力のエコーから。 両方とも含まれています -p オプション。入力を読み取ろうとする前に、文字列の直後にプロンプトとして文字列を出力できます。

最初の行では、ローカルRedisインスタンスのパスワードを入力するように求められ、3行目では、管理対象のRedisインスタンスのパスワードを入力するように求められます。 それらの間の行は空白行を印刷し、2番目のプロンプトが新しい行に表示されます。 これにより、端末で両方のプロンプトが読みやすくなります。

redis-migrate.sh
. . .
sourcedb=${1}
targetdb=${2}
cursor=-1

read -s -p "Enter your local Redis password: " localpw
echo ""
read -s -p "Enter your managed Redis password: " managedpw

次に、以下を追加します while ループ。 これは、 cursor 以前に定義された変数は 0. その場合、ループ内のすべてのコマンドが到達するまで実行されます done:

redis-migrate.sh
. . .
cursor=-1

read -s -p "Enter your local Redis password: " localpw
echo ""
read -s -p "Enter your managed Redis password: " managedpw

while [[ "$cursor" -ne 0 ]]; do



done

なぜなら cursor に初期化されました -1、それはこれを意味します while ループは常に少なくとも1回実行されます。

以内 while ループし、以下を強調表示して追加します if/then 声明。 これは、 cursor 変数はに等しい -1 もしそうなら、それを等しく設定します 0:

redis-migrate.sh
. . .
while [[ "$cursor" -ne 0 ]]; do

  if [[ "$cursor" -eq -1 ]]
  then
    cursor=0
  fi

done

Redisの scan コマンドではいくつかのオプションを使用できますが、必要な引数はカーソル値の1つだけです。 Redisデータベースをランダムに分類されたキーの長いリストとして想像すると、カーソル値は 0 言う scan リストの最初のキーから反復を開始します。 毎回 scan 実行すると、出力の最初の行として新しいカーソルが返され、後続の各行には限られた数の個別のキーが返されます。通常は10〜20行です。

データベース内のすべてのキーを反復処理するには、引き続き呼び出しを行う必要があります scan、カーソルを前の呼び出しの出力から更新されたカーソルに置き換えるたびに、 0. これは、 scan 完全な反復を完了しました。

これが私たちが初期化した理由です cursor-1 すぐにリセットするだけです 0 この追加により:完全な反復を実行するために、このスクリプトはを呼び出す必要があります scan を使用して、複数回コマンドを実行します 0 最初のカーソルとして、その後の各呼び出しで、前の反復によって返されたカーソル。 ループは最後のときにのみ停止する必要があります scan callはのカーソルを返します 0.

ご了承ください scan 負のカーソル値を返さないため、初期化 cursor-1 問題は発生しません。

次の if/then ステートメント、しかしまだ前 done、新しいローカル変数を定義する行を追加します。 reply、およびその値をの出力に設定します scan で実行されるコマンド redis-cli クライアント。

これ redis-cli コマンドには、 -a オプションの後に localpw 変数。 ユーザーがプロンプトが表示されたときにローカルRedisインスタンスの正しいパスワードを入力すると仮定すると、 -a flagは、ここでそのパスワードを使用して認証します。 また、 -n 国旗。 これは redis-cli によって定義されているように、接続するRedisの論理データベースのどれ sourcedb 変数:

redis-migrate.sh
. . .
while [[ "$cursor" -ne 0 ]]; do

  if [[ "$cursor" -eq -1 ]]
  then
    cursor=0
  fi

  reply=$(redis-cli -a "$localpw" -n "$sourcedb" SCAN "$cursor")


done

次に、別の if/then 声明。 これは、 reply 変数はnull値であり、そうでない場合は、 thenfi:

redis-migrate.sh
. . .
while [[ "$cursor" -ne 0 ]]; do

  if [[ "$cursor" -eq -1 ]]
  then
    cursor=0
  fi

  reply=$(redis-cli -a "$localpw" -n "$sourcedb" SCAN "$cursor")

  if [ -n "$reply" ]; then

  fi

done

この中で if/then ステートメントに、次の行を追加します。 1つ目は、 reply 変数を入力し、それらを入力としてパイプします。 tail 指図。

あなたはの結果を渡すことができます echo "$reply" 以下に直接 while ループしますが、これは、前述のように、更新されたカーソル値を保持する最初の行もパイプします。 これにより、Redisは存在しないキーの移行を試み、エラーが発生したり、少なくともサーバーに不要な余分な作業が発生したりする可能性があります。

これを回避するために、パイプを使用します reply 内容に tail を含むコマンド -n +2 口論。 これは tail 各行をに配管する前に、2行目から読み取りを開始します。 while ループ。

これ while ループはの各行を読み取ります reply 一つずつ。 行を読み取るたびに、その行の内容を新しい変数に割り当てます。 key. ループは、 dodone すべての行を読み終えるまでステートメント。

が含まれていることに注意してください IFS=. これは、 I internal F ield S eparatorの略で、パターンを区切るために使用される文字または文字のセットを定義する変数です。 空白のままにすることで、 read プロセスが分割されます reply すべての行の終わりに:

redis-migrate.sh
. . .
while [[ "$cursor" -ne 0 ]]; do
. . .
  if [ -n "$reply" ]; then
          echo "$reply" | tail -n +2 |
          while IFS= read -r key; do

          done
  fi

done

この中で while ループし、強調表示された行を追加します。 これは、実際の移行を実行するコマンドです。

redis-migrate.sh
. . .
while [[ "$cursor" -ne 0 ]]; do
. . .
  if [ -n "$keys" ]; then
          echo "$keys" |
          while IFS= read -r key; do
                  redis-cli -a "$localpw" -n "$sourcedb" migrate localhost 8000 "$key" "$targetdb" 1000 copy auth "$managedpw" >/dev/null 2>&1
          done
  fi

done

このコマンドは、 redis-cli クライアントプログラムとローカルRedisインスタンスへの認証 localpw ユーザーが入力した論理データベースに接続する前の変数( sourcedb 変数)。 次に、Redisを呼び出します migrate ターゲットRedisインスタンスのサーバーのIPアドレスまたはホスト名、およびそれが実行されているポートを渡す必要があるコマンド。 次に、移行するキーの名前を渡します( key 変数)およびキーの移行先のターゲットRedisインスタンス上のデータベース( targetdb).

次は、タイムアウトを表す数値です。 このタイムアウトは、2台のマシン間のアイドル通信時間の最大量です。 これは操作の時間制限ではないことに注意してください。 これは、操作が定義されたタイムアウト内に常にある程度の進行を行う必要があることを意味します。 両方ターゲットデータベース番号とタイムアウト引数は、すべてに必要です migrate 指図。

タイムアウト後はオプションです copy 国旗。 デフォルトでは、 migrate キーをターゲットに転送した後、ソースデータベースから各キーを削除します。 このオプションを含めることで、 migrate キーをコピーしてソースに保持するようにするコマンド。

copy 来る auth フラグの後に管理対象のRedisインスタンスのパスワードが続きます。 これは、認証を必要としないインスタンスにデータを移行する場合は必要ありませんが、DigitalOceanが管理するインスタンスにデータを移行する場合は必要です。

最後に、この行には次のものが含まれます /dev/null2>&1. /dev/null コマンドの標準出力をにリダイレクトします /dev/null ファイル、書き込まれたデータをすぐに破棄するnullデバイス。 2>&1 コマンドの標準エラーを標準出力にリダイレクトします。つまり、 /dev/null その直前に、潜在的なエラーもすぐに破棄されます。

最後に、次の強調表示された行を if/then ステートメント、しかし外側の前 while ループの done 声明。 この行は、によって保持されている値を更新します cursor に保持されているカーソル値に対する変数 reply 変数。 それは評価することによってこれを行います reply とともに expr ユーティリティと正規表現に一致する最初の値の検索('\([0-9]*[0-9]\)'). どのように scan コマンドの出力はフォーマットされています。この正規表現は常に正しいカーソル値と一致します。

redis-migrate.sh
. . .
while [[ "$cursor" -ne 0 ]]; do
. . .
  if [ -n "$keys" ]; then
          echo "$keys" |
          while IFS= read -r key; do
                  redis-cli -a "$localpw" -n "$sourcedb" migrate localhost 8000 "$key" "$targetdb" 1000 copy auth "$managedpw" >/dev/null 2>&1
          done
  fi

  cursor=$(expr "$reply" : '\([0-9]*[0-9]\)')

done

まとめると、スクリプトは次のようになります。

redis-migrate.sh
#!/bin/bash

set -euo pipefail

if [ "$#" -lt 2 ]
then
  echo "Migrate Redis keys to a DigitalOcean Managed Database"
  echo "Usage: $0 [source database] [target database]"
  exit 1
fi

sourcedb=${1}
targetdb=${2}
cursor=-1

read -s -p "Enter local Redis password: " localpw
echo ""
read -s -p "Enter managed Redis password: " managedpw

while [[ "$cursor" -ne 0 ]]; do

  if [[ "$cursor" -eq -1 ]]
  then
    cursor=0
  fi

  reply=$(redis-cli -a "$localpw" -n "$sourcedb" SCAN "$cursor")

  if [ -n "$reply" ]; then
          echo "$reply" | tail -n +2 |
          while IFS= read -r key; do
                  redis-cli -a "$localpw" -n "$sourcedb" migrate localhost 8000 "$key" "$targetdb" 1000 copy auth "$managedpw" >/dev/null 2>&1
          done
  fi

  cursor=$(expr "$reply" : '\([0-9]*[0-9]\)')

done

各行が正しく追加されていることを再確認してから、ファイルを保存して閉じます。 使用した場合 nano スクリプトを作成するには、を押して作成します CTRL + X, Y、 それから ENTER.

スクリプトの作成をまとめるには、スクリプトを実行可能としてマークします。 chmod:

  1. sudo chmod +x redis-migrate.sh

これで、スクリプトを使用してRedisデータをマネージドRedisインスタンスに移行する準備が整いました。

ステップ4—Redisデータの移行

前の手順で作成したスクリプトを使用してRedisデータを移行するには、次のように呼び出します。

  1. ./redis-migrate.sh source_database target_database

このチュートリアルのオプションの最初のステップに従い、ローカルのRedisインスタンスのデフォルトデータベースをロードしたと仮定します(0)データを使用し、このデータをに移行する場合 0 管理対象インスタンスのデータベースでは、次のコマンドを使用します。

  1. ./redis-migrate.sh 0 0

ローカルRedisインスタンスの認証パスワードの最初のプロンプトが表示されます。

Output
Enter local Redis password:

ローカルのRedisのパスワードを入力して、を押します ENTER. パスワードを要求するようにローカルRedisインスタンスを構成していない場合は、を押してください。 ENTER 去る localpw パスワード変数が空白です。

次に、ManagedRedisデータベースのパスワードを入力するように求められます。

Output
Enter local Redis password: Enter managed Redis password:

注: Managed Redisデータベースのパスワードが手元にない場合は、最初にDigitalOceanコントロールパネルに移動してパスワードを見つけることができます。 そこから、左側のサイドバーメニューのデータベースをクリックしてから、データの移行先のRedisインスタンスの名前をクリックします。 接続の詳細セクションまで下にスクロールすると、パスワードというラベルの付いたフィールドがあります。 表示ボタンをクリックしてパスワードを表示し、認証のためにパスワードをコピーしてプロンプトに貼り付けます。

正しいデータベース番号と有効なパスワードを入力した場合、スクリプトはデータベース内のすべてのキーを移行し、それ以上出力せずに閉じます。 移行が成功したかどうかをテストするには、ManagedRedisデータベースに接続します。

  1. redis-cli -h localhost -p 8000 -a managed_redis_password

デフォルト以外の論理データベースにデータを移行した場合は、 select 指図:

  1. select target_database

を実行します scan 現在そこに保持されているキーのいくつかを表示するコマンド:

  1. scan 0

このチュートリアルのステップ1を完了し、サンプルデータをソースデータベースに追加すると、次のような出力が表示されます。

Output
1) "10" 2) 1) "set1" 2) "string6" 3) "string11" 4) "string3" 5) "string5" 6) "string10" 7) "string14" 8) "string18" 9) "string2" 10) "string4"

最後に、 ttl まだ揮発性であることを確認するために、期限切れに設定したキーに対してコマンドを実行します。

  1. ttl string2
Output
(integer) 3944

この出力は、キーを管理対象データベースに移行した場合でも、に基づいて有効期限が切れるように設定されていることを示しています。 expireat 以前に実行したコマンド。

ソースRedisデータベースのすべてのキーがターゲットに正常にエクスポートされたことを確認したら、管理対象データベースへの接続を閉じることができます。 ローカルRedisインスタンス上の他の論理データベースのいずれかがデータを保持している場合は、それぞれに対してスクリプトを再実行する必要があります。適切なソースデータベースとターゲットデータベースを引数として含めるようにしてください。 また、クライアントがソースRedisインスタンスにデータを書き込んでいて、それらの書き込みをターゲットに送信するように既に構成している場合は、すべてのデータの移行が完了したら、ソースへのデータの送信を停止するようにクライアントを構成できます。

結論

このチュートリアルを完了すると、自己管理型のRedisデータストアからDigitalOceanが管理するRedisインスタンスにデータを移動できます。 このプロセスに使用されるBashスクリプトは、すべてのRedisユースケースに最適であるとは限りませんが、このチュートリアルで説明するユースケースではうまく機能し、他のユースケースにも最適化できます。

DigitalOcean Managed Redisデータベースを使用してデータを保存しているので、いくつかのベンチマークテストを実行することでそのパフォーマンスを測定できます。 また、Redisを初めて使用する場合は、Redisデータベースの管理方法に関するシリーズをご覧ください。