Ubuntu 14.04でRedisクラスターを構成する方法

前書き

Redisはオープンソースのキーと値のデータストアであり、永続化のためにオプションのディスク書き込みを伴うメモリ内ストレージモデルを使用します。 トランザクション、pub / sub、自動フェイルオーバーなどの機能を備えています。 実稼働環境ではLinuxでRedisを使用することをお勧めしますが、開発者はOS Xを開発およびテストのプラットフォームとして言及しています。 Redisにはほとんどの言語で書かれたクライアントがあり、推奨されるものはhttp://redis.io/clients [彼らのウェブサイト]で紹介されています。

実稼働環境では、少なくとも2つのノード間でデータを複製することがベストプラクティスと見なされます。 冗長性により、環境障害が発生した場合のリカバリが可能になります。これは、アプリケーションのユーザーベースが拡大する場合に特に重要です。

このガイドの終わりまでに、次のようにDigitalOceanに2つのRedis Dropletsを設定します。

  • Redisマスターサーバー用の1つのドロップレット

  • Redisスレーブサーバー用の1つのドロップレット

また、スレーブサーバーに切り替えて、一時マスターとしてセットアップする方法も示します。

複数のスレーブサーバーを設定してください。

この記事では、マスター/スレーブRedisクラスターのセットアップに焦点を当てています。 Redis全般とデータベースとしての基本的な使用法の詳細については、https://www.digitalocean.com/community/tutorials/how-to-install-and-use-redis [この使用法チュートリアル]を参照してください。

前提条件

これは以前のリリースや他のLinuxディストリビューションで動作する可能性がありますが、Ubuntu 14.04をお勧めします。

テストの目的では、処理する実際のワークロードがないため、小さなインスタンスを使用しますが、運用環境ではより大きなサーバーが必要になる場合があります。

ステップ1-Redisのインストール

*マスターサーバー*をホストするDropletから始めて、最初のステップはRedisをインストールすることです。 最初に、Chris LeaのRedisリポジトリを追加する必要があります(サードパーティのリポジトリを追加するときは常に慎重に注意してください。メンテナが評判の良い人物であるため、これを使用しています)。

sudo add-apt-repository ppa:chris-lea/redis-server

`+ ENTER +`を押してリポジトリを受け入れます。

次のコマンドを実行して、パッケージを更新します。

sudo apt-get update

Redisサーバーをインストールします。

sudo apt-get install redis-server

Redisが稼働していることを確認します。

redis-benchmark -q -n 1000 -c 10 -P 5

上記のコマンドは、合計リクエスト数1000、並列接続数10、パイプライン5のリクエストで、 `+ redis-benchmark `をQuietモードで実行することを言っています。 Redisのベンチマークの実行の詳細については、ターミナルで「 redis-benchmark --help +」と入力すると、有用な情報が例とともに出力されます。

ベンチマークを実行しましょう。 終了すると、次のような出力が表示されます。

Output

Redis *スレーブサーバー*についてこのセクションを繰り返します。 ドロップレットをさらに設定する場合は、必要な数のスレーブサーバーをセットアップできます。

この時点で、Redisが2つのノードにインストールされ実行されています。 いずれかのノードの出力が上記の出力と類似していない場合、セットアッププロセスを慎重に繰り返し、すべての前提条件が満たされていることを確認します

ステップ2-Redisマスターの構成

Redisが2ドロップレットクラスターで稼働しているので、構成ファイルを編集する必要があります。 後で見るように、マスターサーバーとスレーブの設定にはわずかな違いがあります。

まず、*マスター*から始めましょう。

お気に入りのテキストエディタで `+ / etc / redis / redis.conf +`を開きます。

sudo nano /etc/redis/redis.conf

次の行を編集します。

TCPのキープアライブタイマーに適切な値を設定します。

/etc/redis/redis.conf

tcp-keepalive

次の行をコメントアウトして、ウェブ上の誰でもサーバーにアクセスできるようにします。

/etc/redis/redis.conf

bind 127.0.0.1

Redisの性質とその非常に高速性を考えると、攻撃者は多くの問題なしにパスワードをブルートフォースする可能性があります。 そのため、 `+ requirepass +`行のコメントを外し、複雑なパスワード(または複雑なパスフレーズが望ましい)を追加することをお勧めします。

/etc/redis/redis.conf

requirepass

使用シナリオに応じて、次の行を変更する場合と変更しない場合があります。 このチュートリアルの目的上、キーの削除は行わないと想定しています。 この行のコメントを解除し、次のように設定します。

/etc/redis/redis.conf

maxmemory-policy

最後に、データのバックアップに必要な次の変更を行います。 これらの行を次のようにコメント解除または設定します。

/etc/redis/redis.conf

appendonly
appendfilename

変更を保存してください。

Redisサービスを再起動して、構成の変更を再読み込みします。

sudo service redis-server restart

さらに進んで行きたい場合は、https://www.digitalocean.com/community/tutorials/how-to-install-and-の* Redis Operations *セクションに従って、一意のコンテンツをmasterデータベースに追加できます。 use-redis [このチュートリアル]。これにより、後でスレーブサーバーに複製される方法を確認できます。

マスターサーバーの準備ができたので、スレーブマシンに移りましょう。

ステップ3-Redisスレーブを構成する

*スレーブサーバー*がマスターインスタンスに接続できるように、いくつかの変更を行う必要があります。

お気に入りのテキストエディタで `+ / etc / redis / redis.conf +`を開きます。

sudo nano /etc/redis/redis.conf

次の行を編集します。一部の設定はマスターのものに似ています。

次の行をコメントアウトして、ウェブ上の誰でもサーバーにアクセスできるようにします。

/etc/redis/redis.conf

bind 127.0.0.1

スレーブサーバーにもパスワードが必要なので、コマンド( `+ INFO +`など)を与えることができます。 この行のコメントを解除し、サーバーパスワードを設定します。

/etc/redis/redis.conf

requirepass

この行のコメントを外し、* master server *に到達できるIPアドレスを示し、その後にそのマシンに設定されているポートを指定します。 デフォルトでは、ポートは6379です。

/etc/redis/redis.conf

slaveof

`+ masterauth +`行のコメントを外し、* masterサーバー*で以前に設定したパスワード/パスフレーズを入力します。

/etc/redis/redis.conf

masterauth

これらの変更を保存して、ファイルを終了します。 次に、マスターサーバーで行ったようにサービスを再起動します。

sudo service redis-server restart

これにより、Redisが再初期化され、変更されたファイルがロードされます。

Redisに接続します。

redis-cli -h 127.0.0.1 -p

*スレーブサーバーのパスワード*で認証します:

AUTH

この時点で、両方のマシンが適切に構成された、機能的なマスター/スレーブRedisクラスターを実行しています。

手順4-マスタースレーブレプリケーションの確認

セットアップをテストすることで、フェールオーバー動作のスクリプト作成を開始した後、Redisドロップレットの動作をよりよく理解できます。 ここでやりたいことは、設定が正しく機能していることと、マスターがスレーブRedisインスタンスと通信していることを確認することです。

まず、* masterサーバー*上のターミナルを介してRedisに接続します。

最初に、デフォルトでポート6379で実行されているローカルインスタンスに接続します。 ポートを変更した場合は、それに応じてコマンドを変更します。

redis-cli -h 127.0.0.1 -p

マスターを設定するときに設定したパスワードを使用して、Redisで認証します。

AUTH

そして、応答として「+ OK +」を取得する必要があります。 今、あなただけを実行する必要があります:

INFO

マスターRedisサーバーについて知る必要があるすべてが表示されます。 特に、 `+#Replication +`セクションに興味があります。これは次の出力のようになります。

Output. . .

# Replication
role:master
connected_slaves:1
slave0:ip=,port=,state=online,offset=407,lag=1
master_repl_offset:407
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:406

. . .

`+ connected_slaves:1 +`行に注目してください。これは、他のインスタンスがマスタードロップレットと通信していることを示しています。 ポート、状態、およびその他の情報とともに、スレーブIPアドレスを取得することもわかります。

スレーブマシンの「#Replication +」セクションを見てみましょう。 プロセスは、マスターサーバーの場合と同じです。 Redisインスタンスにログインし、「 INFO +」コマンドを発行して、出力を表示します。

Output. . .

# Replication
role:slave
master_host:
master_port:
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:1401
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

. . .

このマシンにはスレーブの役割があり、マスターRedisサーバーと通信しており、独自のスレーブがないことがわかります。

ステップ5-スレーブへの切り替え

このアーキテクチャを構築することは、データの整合性とアプリケーションのダウンタイムをできる限り少なくする方法で障害を処理することも意味します。 どのスレーブもマスターに昇格できます。 まず、手動で切り替えをテストしましょう。

*スレーブマシン*では、Redisインスタンスに接続する必要があります。

redis-cli -h 127.0.0.1 -p

スレーブの設定時に設定したパスワードを使用してRedisで認証するようになりました

AUTH

スレーブの動作をオフにします。

SLAVEOF NO ONE

応答は「+ OK +」でなければなりません。 次のように入力します:

INFO

次の出力を見つけるには、「+#Replication +」セクションを探します。

Output. . .

# Replication
role:master
connected_slaves:0
master_repl_offset:1737
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

. . .

予想どおり、スレーブはマスターになり、他のマシン(存在する場合)からの接続を受け入れる準備ができました。 メインマスターサーバーのデバッグ中に一時的なバックアップとして使用できます。

これは簡単にスクリプト化でき、障害が検出されたら次の手順を実行する必要があります。

  • アプリケーションから、Redisのすべてのリクエストをスレーブマシンに送信します

  • そのスレーブで、「+ SLAVEOF NO ONE +」コマンドを実行します。 Redisバージョン1.0.0以降、このコマンドはスレーブにデータの複製を停止し、マスターサーバーとして機能するように指示します

  • 残りのすべてのスレーブ(存在する場合)で、「+ SLAVEOF +」を実行すると、古いマスターからの複製を停止し、現在廃止されているデータを完全に破棄し、新しいマスターから複製を開始するように指示します。 新しく昇格したマスターからの「」と「」を正しい値に置き換えてください

  • 問題を分析した後、特定のセットアップで必要な場合は、初期サーバーをマスターとして使用することに戻ることがあります

ステップ6-マスターへの再接続

元のマスターサーバーに再接続しましょう。 *スレーブサーバー*で、Redisにログインし、次を実行します。

SLAVEOF

`+ INFO +`コマンドを再度実行すると、元のセットアップに戻ったことがわかります。

結論

Redisマスターとして機能するサーバーとスレーブとしてデータを複製するサーバーの2つのサーバーで構成される環境を適切にセットアップしました。 これにより、マスターサーバーがオフラインになったりデータが失われたりした場合に、問題が解決されるまで回復のためにスレーブの1つに切り替える方法がわかります。

次の手順には、自動フェイルオーバー手順のスクリプト作成、またはhttps://www.digitalocean.com/community/tutorials/how-to-set-up-an-などのVPNソリューションの使用によるすべてのドロップレット間の安全な通信の確保が含まれます。 openvpn-server-on-ubuntu-14-04 [OpenVPN]またはhttps://www.digitalocean.com/community/tutorials/how-to-install-tinc-and-set-up-a-basic-vpn-on -ubuntu-14-04 [Tinc]。 また、構成を検証するには、テスト手順とスクリプトが不可欠です。

さらに、この種のセットアップを実稼働環境に展開する際には注意が必要です。 Redis Documentationページを調べて、アプリケーションに適したセキュリティモデルを明確に理解する必要があります。 セッションストアとしてRedisをよく使用しますが、Redisに含まれる情報は攻撃者にとって価値がある場合があります。 一般的な方法は、これらのマシンをプライベートネットワーク経由でのみアクセス可能にし、複数のセキュリティ層の背後に配置することです。

これは、データストアを構築するための単純な出発点です。マスタースレーブアーキテクチャを使用するためのRedisのセットアップに関する包括的なガイドではありません。 このガイドでカバーすべきと思われるものがある場合は、以下にコメントを残してください。 このトピックの詳細とヘルプについては、https://www.digitalocean.com/community/questions [DigitalOcean Q&A]を開始するのに適した場所です。

Related