RedisデータをDigitalOceanマネージドデータベースに移行する方法
序章
ある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つのコマンド(replicaof
、save
、および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
オプションが使用されます。 set
のu
フラグは、未設定の変数を強制的に終了させるエラーとして扱うようにスクリプトに指示します。 このスクリプトはユーザー入力を必要とするため、これは私たちの目的に役立ちます。
最後のフラグ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値でない場合は、then
とfi
の間のすべてのステートメントを実行します。
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/null
と2>&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
を使用してスクリプトを実行可能としてマークします。
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データベースの管理方法に関するシリーズをご覧ください。