RedisデータをDigitalOceanマネージドデータベースに移行する方法

提供:Dev Guides
移動先:案内検索

序章

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

このチュートリアルでは、DigitalOceanが管理するRedisインスタンスにデータを移行するために使用できる1つの方法の概要を説明します。 この方法では、Redisの内部migrateコマンドを使用して、tunnelで構成されたTLSトンネルを介してデータを安全に渡すBashスクリプトを作成します。 このガイドでは、他のいくつかの一般的に使用される移行戦略と、 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をインストールしたときにredis-cliが既にインストールされているため、手順1で'パッケージをインストールする必要はありません。チュートリアル。

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


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

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

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

replicaof source_hostname_or_ip source_port

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

replicaof no one

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

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

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

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

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

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

redis-cli

パスワード認証を要求するようにRedisサーバーを構成した場合は、authコマンドを実行してからRedisパスワードを実行します。

auth password

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

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

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

expire string2 7500
expire hash1 7500
expire set1 7500

これで、ターゲットのRedisインスタンスにエクスポートできるサンプルデータがいくつかあります。 このデータをバックアップするために次のステップでredis-cliプロンプトを開いたままにしておくことができます。

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

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

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

redis-cli

また、パスワード認証を要求するようにRedisサーバーを構成した場合は、authコマンドを実行してからRedisパスワードを実行します。

auth password

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

bgsave

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

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

bgsave操作の実行中または終了後にクライアントがデータを追加または変更した場合、これらの変更はスナップショットにキャプチャされないことに注意してください。


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

exit

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

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
. . .

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

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

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

sudo ls /var/lib/redis

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

Outputdump.rdb

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

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

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

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

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


redis-migrate.shという名前の新しいファイルを開きます。

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コマンド)エラーメッセージがまだ有効な出力であるため。 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にリセットする理由です。完全な反復を実行するには、このスクリプトで[ X188X] コマンドを複数回実行し、0を最初のカーソルとして使用し、その後の呼び出しごとに、前の反復で返されたカーソルを使用します。 ループは、最後のscan呼び出しが0のカーソルを返したときにのみ停止する必要があります。

scanは負のカーソル値を返さないため、cursor-1に初期化しても問題は発生しないことに注意してください。

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

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

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値であるかどうかをテストし、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の内容を-n +2引数を含むtailコマンドにパイプします。 これにより、tailは、各行をwhileループにパイプする前に、2行目から読み取りを開始するように指示されます。

このwhileループは、replyの各行を1つずつ読み取ります。 行を読み取るたびに、その行の内容を新しい変数keyに割り当てます。 ループは、すべての行を読み取るまで、doステートメントとdoneステートメントの間のコマンドを実行します。

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クライアントプログラムを呼び出し、ユーザーが入力した論理データベース(sourcedb変数で表される)に接続する前に、localpw変数を使用してローカルRedisインスタンスに対して認証します。 次に、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変数が保持するカーソル値に更新します。 これは、replyexprユーティリティで評価し、正規表現('\([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 + XYENTERの順に押して作成します。

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

sudo chmod +x redis-migrate.sh

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

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

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

./redis-migrate.sh source_database target_database

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

./redis-migrate.sh 0 0

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

OutputEnter local Redis password:

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

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

OutputEnter local Redis password:
Enter managed Redis password:

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


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

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

デフォルト以外の論理データベースにデータを移行した場合は、selectコマンドを使用してそのデータベースに接続します。

select target_database

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

scan 0

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

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

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

ttl string2
Output(integer) 3944

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

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

結論

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

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