序章

Redisは、メモリ内、NoSQL、Key-Valueキャッシュおよびストアであり、ディスクに永続化することもできます。 人気が高まっており、大小のプロジェクトの両方でデータストアとして使用されています。 より強力なサーバーへの移行など、さまざまな理由で、あるサーバーから別のサーバーにそのデータを移行する必要がある場合があります。

現在のサーバーから新しいサーバーにデータベースファイルをコピーすることも可能ですが、Redisデータベースを移行するための推奨される方法は、マスタースレーブ方式でレプリケーションセットアップを使用することです。 このような設定は、ファイルのコピーよりもはるかに高速であり、ダウンタイムはほとんどまたはまったくありません。

この記事では、マスタースレーブレプリケーションを使用してRedisデータをUbuntu14.04サーバーから同様のサーバーに移行する方法を説明します。 これには、新しいRedisサーバーをセットアップし、現在のサーバーのスレーブになるように構成することが含まれます(つまり、 マスター)、移行が完了した後、スレーブをマスターに昇格させます。

前提条件

この記事に従うには、エクスポートまたは移行するデータを含む1台のRedisマスターサーバーと、スレーブとなる2台目の新しいRedisサーバーが必要です。

具体的には、これらはRedisマスターの前提条件です。

そして、これらはRedisスレーブの前提条件です。

両方のサーバーで、IPTablesチュートリアルのネームサーバー構成セクションに必ず従ってください。 これがないと、aptは機能しません。

ステップ1—Redisマスターファイアウォールを更新する

Redisスレーブをインストールして構成した後、ファイアウォールルールのために通信していない2つの独立したサーバーがあります。 このステップでは、それを修正します

この修正には、マスターのTCPルールに例外を追加して、ポート6379でRedisトラフィックを許可することが含まれます。 したがって、マスターで、IPv4ルールのIPTables構成ファイルを開きます。

  1. sudo nano /etc/iptables/rules.v4

SSHトラフィックを許可するルールのすぐ下に、スレーブのIPアドレスからのRedisポートのみでのトラフィックを許可するRedisのルールを追加します。 必ずyour_slave_ip_addressをスレーブサーバーのIPアドレスに更新してください。

/etc/iptables/rules.v4
. . .
# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT
-A TCP -p tcp -s your_slave_ip_address --dport 6379 -j ACCEPT
. . .

これは非常に制限的で、より安全です。 それ以外の場合、サーバーはRedisポート上の任意のホストからのトラフィックを受け入れます。

IPTablesを再起動して、新しいルールを適用します。

  1. sudo service iptables-persistent restart

レプリケーションシステムが起動し、マスターのファイアウォールがRedisトラフィックを許可するように構成されたので、両方のサーバーが通信できることを確認できます。 これは、このRedisクラスターチュートリアルのステップ4に記載されている手順で実行できます。

ステップ2—データインポートの確認

両方のサーバーが接続を確立している場合、サーバーからスレーブへのデータのインポートが自動的に開始されます。 これで、それが正常に完了したことを確認するだけで済みます。 それを確認する方法は複数あります。

Redisデータディレクトリ

データのインポートが成功したことを確認する1つの方法は、Redisデータディレクトリを調べることです。 これで、マスターにあるのと同じファイルがスレーブにあるはずです。 次のコマンドを使用して、スレーブサーバーのRedisデータディレクトリにあるファイルの長いリストを作成する場合:

  1. ls -lh /var/lib/redis

この種の出力を取得する必要があります。

出力

total 32M
-rw-r----- 1 redis redis 19M Oct  6 22:53 appendonly.aof
-rw-rw---- 1 redis redis 13M Oct  6 22:53 dump.rdb

Redisコマンドライン

データのインポートを確認する別の方法は、Redisコマンドラインからです。 スレーブサーバーでコマンドラインを入力します。

  1. redis-cli

次に、認証してinfoコマンドを発行します

  1. auth insert-redis-password-here
  2. info

出力では、#Keyspaceのキーの数は両方のサーバーで同じである必要があります。 以下の出力は、マスターサーバーの出力とまったく同じであるスレーブサーバーから取得されました。

出力
# Keyspace
db0:keys=26378,expires=0,avg_ttl=0

キーをスキャンします

スレーブがマスターと同じデータを持っていることを確認するさらに別の方法は、Redisコマンドラインからscanコマンドを使用することです。 そのコマンドからの出力は、両方のサーバーで常に同じであるとは限りませんが、スレーブで発行された場合、少なくとも、スレーブに期待するデータがあることを確認できます。

この記事で使用したテストサーバーからの出力例を以下に示します。 scanコマンドの引数は任意の数であり、カーソルとして機能することに注意してください。

  1. scan 0

出力は次のようになります。

出力
1) "17408"
2)  1) "uid:5358:ip"
    2) "nodebbpostsearch:object:422"
    3) "uid:4163:ip"
    4) "user:15682"
    5) "user:1635"
    6) "nodebbpostsearch:word:HRT"
    7) "uid:6970:ip"
    8) "user:15641"
    9) "tid:10:posts"
   10) "nodebbpostsearch:word:AKL"
   11) "user:4648"
127.0.0.1:6379>

ステップ3—スレーブをマスターに昇格させる

スレーブにすべてのデータがあることを確認したら、それをマスターに昇格させることができます。 これは、Redisクラスターチュートリアルステップ5でも説明されていますが、簡単にするために、手順もここにあります。

まず、スレーブでRedisコマンドラインを入力します。

  1. redis-cli

認証後、slaveof no oneコマンドを発行して、マスターに昇格させます。

  1. auth your_redis_password
  2. slaveof no one

次の出力が得られるはずです。

出力
OK

次に、infoコマンドを使用して確認します。

  1. info

Replicationセクションの関連する出力は次のようになります。 特に、 role:master 行は、スレーブがマスターになったことを示しています。

出力
# Replication
role:master
connected_slaves:0
master_repl_offset:11705
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

その後、前のマスターのログファイルの1つのエントリでもそれを確認する必要があります。

/var/log/redis/redis-server.log

14613:M 07 Oct 14:03:44.159 # Connection with slave 192.168.1.8:6379 lost.

そして、新しいマスター(以前のスレーブ)では、次のように表示されます。

/var/log/redis/redis-server.log
14573:M 07 Oct 14:03:44.150 # Connection with master lost.
14573:M 07 Oct 14:03:44.150 * Caching the disconnected master state.
14573:M 07 Oct 14:03:44.151 * Discarding previously cached master state.
14573:M 07 Oct 14:03:44.151 * MASTER MODE enabled (user request from 'id=4 addr=127.0.0.1:52055 fd=6 name= age=2225 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=slaveof')

この時点で、アプリケーションをデータベースに接続し、元のマスターを削除または破棄することができます。

結論

正しく実行された場合、この方法でRedisデータを移行するのは簡単な作業です。 エラーの主な原因は、通常、マスターサーバーのファイアウォールを変更してRedisトラフィックを許可することを忘れていることです。

その他のRedisチュートリアルを参照すると、Redisをさらに活用する方法を学ぶことができます。