前書き

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

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

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

前提条件

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

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

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

両方のサーバーでIPTablesチュートリアルのネームサーバー構成セクションを確認してください。それなしでは、「+ apt +」は機能しません。

手順1-Redisマスターファイアウォールの更新

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

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

sudo nano /etc/iptables/rules.v4

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

/etc/iptables/rules.v4

. . .
# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT

. . .

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

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

sudo service iptables-persistent restart

レプリケーションシステムが起動し、マスターのファイアウォールがRedisトラフィックを許可するように構成されたので、両方のサーバーが通信できることを確認できます。 これは、https://www.digitalocean.com/community/tutorials/how-to-configure-a-redis-cluster-on-ubuntu-14-04のステップ4に記載されている手順で実行できます[このRedisクラスターチュートリアル]。

手順2-データインポートの検証

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

Redisデータディレクトリ

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

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コマンドラインからです。 スレーブサーバーでコマンドラインを入力します。

redis-cli

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

auth

info

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

出力

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

キーをスキャンする

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

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

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-スレーブをマスターに昇格させる

スレーブにすべてのデータがあることを確認したら、マスターに昇格できます。 これはhttps://www.digitalocean.com/community/tutorials/how-to-configure-a-redis-cluster-on-ubuntu-14-04#step-5-%E2%80%94-でも説明されています。 switch-to-the-slave [Redisクラスターチュートリアルのステップ5]ですが、簡単にするために手順もここにあります。

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

redis-cli

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

auth
slaveof no one

あなたはこの出力を得るはずです:

出力

OK

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

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

出力

# Replication

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トラフィックを許可するためにマスターサーバーのファイアウォールを変更するのを忘れることです。

https://www.digitalocean.com/community/tags/redis?type=tutorials [その他のRedisチュートリアル]を参照すると、Redisをさらに活用する方法を学ぶことができます。