前書き
Redisは、メモリ内、NoSQL、キーと値のキャッシュおよびストアであり、ディスクに永続化することもできます。 人気が高まっており、大小の両方のプロジェクトでデータストアとして使用されています。 より強力なサーバーへの移行など、さまざまな理由で、あるサーバーから別のサーバーにそのデータを移行することが必要になる場合があります。
現在のサーバーから新しいサーバーにデータベースファイルをコピーするだけでかまいませんが、Redisデータベースを移行するための推奨される方法は、マスタースレーブ形式でレプリケーションセットアップを使用することです。 このようなセットアップは、ファイルのコピーよりもはるかに高速で、ダウンタイムがほとんどまたはまったくありません。
この記事では、マスター/スレーブレプリケーションを使用して、RedisデータをUbuntu 14.04サーバーから同様のサーバーに移行する方法を示します。 これには、新しいRedisサーバーのセットアップ、現在のサーバーのスレーブになるように構成することが含まれます(つまり、 マスター)、移行の完了後にスレーブをマスターに昇格させます。
前提条件
この記事を読むには、エクスポートまたは移行するデータを含む1つのRedisマスターサーバーと、スレーブとなる2番目の新しいRedisサーバーが必要です。
具体的には、これらはRedisマスターの前提条件です。
-
以下を備えた1つのUbuntu 14.04サーバー:
-
https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04 [サーバーの初期セットアップガイド]を介してセットアップされたsudo非ルートユーザー
-
https://www.digitalocean.com/community/tutorials/how-to-implement-a-basic-firewall-template-with-iptables-on-ubuntu-14-04 [このIPTablesチュートリアル]を介して設定されたファイアウォール*(オプション)ネームサーバーの更新*ステップ
-
Redisは、https://www.digitalocean.com/community/tutorials/how-to-configure-a-redis-cluster-on-ubuntu-14-04 [このRedisのステップ1および2クラスターチュートリアル]
-
移行する一部のデータは、https://www.digitalocean.com/community/tutorials/how-to-back-up-and-restore-your-redis-data-onから手順1および2に従って設定できます-ubuntu-14-04 [このRedis復元記事]
そして、これらはRedisスレーブの前提条件です。
-
次の2つ目のUbuntu 14.04サーバー:
-
https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04 [サーバーの初期セットアップガイド]を介してセットアップされたsudo非ルートユーザー
-
https://www.digitalocean.com/community/tutorials/how-to-implement-a-basic-firewall-template-with-iptables-on-ubuntu-14-04 [このIPTablesチュートリアル]を介して設定されたファイアウォール*(オプション)ネームサーバーの更新*ステップ
-
Redisは、https://www.digitalocean.com/community/tutorials/how-to-configure-a-redis-cluster-on-ubuntu-14-04 [このRedisのステップ1および3クラスターチュートリアル]
両方のサーバーで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をさらに活用する方法を学ぶことができます。