LoginSignup
19
21

More than 5 years have passed since last update.

redisにレプリケーションを設定する

Last updated at Posted at 2012-09-05

ここまでのあらすじはここを読む。 「node-redisを入れてみるメモ( http://qiita.com/items/63de388bf40cff40a096 )」

Redisレプリケーションの特徴

Redisレプリケーションの一般的な情報についてはここを読む。http://redis.shibu.jp/admin/replication.html
レプリケーションについてはここを読む。http://goo.gl/1tA00

ってことで(ぉぉ、上記の「ここを読む」文はまるでrequire文のようだっ!)、

redis.confファイルの設定をいじる

redis.confファイルにちょっと書くだけでスレーブを追加できます。
apt-getで入れたのでredis.confファイルは以下にあります。

/etc/redis/redis.conf

他の入れ方すると違う場所にあったりredis-server起動時にパス指定したりするので、それらの方法に従った場所のredis.confを開きます。

ここを書き換える

################################# REPLICATION #################################

# Master-Slave replication. Use slaveof to make a Redis instance a copy of
# another Redis server. Note that the configuration is local to the slave
# so for example it is possible to configure the slave to save the DB with a
# different interval, or to listen to another port, and so on.

 (略)

# slaveof <masterip> <masterport>
#      ↑これを マスターのIP と port に変更してコメント外す
slaveof 192.168.1.12 6379

これだけ。

他の設定はここを読む http://redis.shibu.jp/admin/config.html#confval-slaveof

マスターのredis.confも必要ならいじる

apt-getでインストールするとredis.confのbind ( http://redis.shibu.jp/admin/config.html#confval-bind ) が'127.0.0.1'に固定されてるかもしれません。

もし、上でいじった、スレーブからの接続先IPを192.168.1.12にしたり、ドメイン名を指定する場合は、ここをコメントアウトするか指定します。

今回は 192.168.1.12のマシンのredis.confのbindをコメントアウトしました。(パスワード使う場合は下記参照)

# bind 127.0.0.1

再起動

あとは、apt-getなら下記のように2台とも再起動して完了です。

sudo /etc/init.d/redis-server restart

確認

前回試したnode-redisのサンプルをマスターで書き込み、スレーブで見るという確認をしてみます。

マスター側

test.js
var redis = require("redis"),
    client = redis.createClient();
    client.set("test", "うひょー");

スレーブ側

test.js
var redis = require("redis"),
    client = redis.createClient();
    client.get("test", function(err, data){
      console.log(data);
    });

    // => うひょー

ちょっと変えてみます。

マスター側

test.js
var redis = require("redis"),
    client = redis.createClient();
    client.set("test", "うひぁああああ");

スレーブ側

test.js
var redis = require("redis"),
    client = redis.createClient();
    client.get("test", function(err, data){
      console.log(data);
    });

    // => うひぁああああ

できました。

マスターでの書きかえがスレーブへも伝播しているのがわかります。

パスワード

上記で、/etc/redis/redis.confのbindをコメントアウトしましたが、ローカルネットワークだけで使う場合は良いのですが、もし、外からもアクセスできる環境の場合はマスターにパスワードを設定しておきます。

(p.s. Redisはとても高速なため、性能の良いマシン上で実行している場合は、毎秒150,000回程度のパスワードチェックを行うことができます。そのため、弱いパスワードであれば簡単に突破されてしまうため、非常に強いパスワードを設定するようにしてください。とのことです。)

マスターの/etc/redis/redis.conf
requirepass hogehogepiyopiyoPasword
スレーブの/etc/redis/redis.conf
masterauth hogehogepiyopiyoPasword

あとnode-redisから扱う場合は

client.auth('hogehogepiyopiyoPasword', function(e,ok){
      console.log("authError " + e + '--' +client.host+ ': ' +ok);
})
//これはつながると下記のように表示されます
//authError null--192.168.1.12: OK

なにはともあれ、自分のサーバー環境へとりあえず放り込んでおくと、ちょうどlocalStorageのような手軽さ(+いろいろな機能付き)でkey/valueストアを利用できる感じ。

ふと、、、、こんなに手軽だと、これって通信のかわりに利用する手もあるんじゃないの^^? <表は手軽だけれど裏は大げさ?Pub/Subより楽だったりして、、、。あ、いやmessageイベントあるからやっぱPub/Subか。

というわけで、次は、RedisでPub/Sub通信。

19
21
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
21