追記
本記事の内容は Redis 2.8.22 から利用できません。
To maintain enhanced replication performance in Multi-AZ replication groups and for increased cluster stability, non-ElastiCache replicas are no longer supported.
ElastiCache(Redis)のバックアップと復元の管理についてドキュメントを読んでいて気になった部分を試してみます。
- AWS Documentation
- AWS Documentation » Amazon ElastiCache » User Guide » ElastiCache の管理 » バックアップと復元の管理(Redis) » 手動スナップショットの作成
ElastiCache スナップショット .rdb ファイルへの直接アクセスが許可されません。 アクセス可能な外部の .rdb スナップショットにデータをエクスポートする必要がある場合、以下の手順に従って自己管理型 Amazon Elastic Compute Cloud (Amazon EC2) 環境を作成します。
バックアップ(ダンプ)ファイルを手元に置いておきたいという要望は少なからずあるのではないでしょうか。
Redisのバックアップ
RedisとはKVSに分類されるNoSQLで、BSDライセンスで公開されています。
- 特徴
- リスト、ハッシュ、バイナリなど様々なデータ構造をサポート
- インメモリの高速性とディスクベース・データストアの永続性
バックアップについては公式ドキュメントのRedis Persistence辺りが参考になります。
- ディスクへの書き込みを行うことをデータ永続化と表現
- RDB、AOFの2つの異なる範囲の永続性オプションを提供
ElastiCache(Redis)のバックアップ(スナップショット)
- バックアップと復元はRedisを実行するクラスタのみでサポート
- RedisのネイティブのBGSAVEコマンドを使用して作成
- 自動スナップショットの保持期間は最大35日
- 手動スナップショットは連続する24時間の間にクラスタ毎に20までしか作成できない
- AWS上でスナップショットの取得状況は参照可能
- サーバー上から見ようとしても直接アクセスができない
ということで、AWS公式サイトの推奨手順「手動スナップショットのエクスポート」に則りEC2にRedisレプリカを構築して取得します。
- EC2インスタンス作成
- EC2にRedisエンジンインストール
- EC2上のRedisを外部リードレプリカとしてプライマリノードに接続
- 非同期コマンド(BGSAVE)を使用して外部リードレプリカのスナップショットを作成
- EC2インスタンスシャットダウン
一度構築・設定してしまえば、後はレプリケーション有効化→スナップショット取得で定期的に実行できます。
EC2上にRedis構築
今回EC2側はAmazonLinuxを使用しました。
Redisインストール
epelのredisはver2.4.10と古く、ver2.8.21と互換性が無いため、remiからインストールします。
# バージョン確認(epel) $ yum list --enablerepo=epel | grep redis ・・・略・・・ redis.x86_64 2.4.10-1.el6 epel ・・・略・・・ # remiリポジトリインストール sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm # バージョン確認(remi) yum list --enablerepo=remi | grep redis ・・・略・・・ redis.x86_64 3.0.3-1.el6.remi remi ・・・略・・・ # redisインストール $ sudo yum --enablerepo=remi -y install redis $ sudo redis-server -v Redis server v=3.0.3 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=789a1a0ec9b20e69 $ sudo redis-cli -v redis-cli 3.0.3
レプリケーション設定
slaveofコマンド slaveof <ElastiCacheのEndpoint> <port>
を実行します。基本設定はこれだけです。
ちなみに、停止する場合は slaveof no one
を実行します。
- HELP slaveof
SLAVEOF host port summary: Make the server a slave of another instance, or promote it as master since: 1.0.0 group: server
EC2上のredisを起動しスレーブとして動作していることを確認します。
infoコマンド結果にてmaster_host、master_portが設定されていることが確認できます。また、monitorコマンドでマスターとの疎通を確認できます。
- スレーブ側
# Redis起動 $ sudo /etc/init.d/redis start redis-server を起動中: [ OK ] $ redis-cli 127.0.0.1:6379> slaveof example.lclxxx.0001.apne1.cache.amazonaws.com 6379 OK 127.0.0.1:6379> info ・・・略・・・ # Replication role:slave master_host:example.lclxxx.0001.apne1.cache.amazonaws.com master_port:6379 master_link_status:up master_last_io_seconds_ago:0 master_sync_in_progress:0 slave_repl_offset:8866971 slave_priority:100 slave_read_only:1 ・・・略・・・ # 疎通確認 127.0.0.1:6379> monitor OK 1440516805.005210 [0 192.168.11.XXX:6379] "SET" "ElastiCacheMasterReplicationTimestamp" "2015-08-25T15:33:25.006Z" 1440516806.005369 [0 192.168.11.XXX:6379] "SET" "ElastiCacheMasterReplicationTimestamp" "2015-08-25T15:33:26.006Z"
レプリケーション状態確認
マスタ(ElasticCache)側へログインし状況確認を行います。 connected_slaves が 1 になっている事が確認できます。
- マスタ側
$ redis-cli -h example.lclxxx.0001.apne1.cache.amazonaws.com -p 6379 redis example.lclxxx.0001.apne1.cache.amazonaws.com:6379> info ・・・略・・・ # Replication role:master connected_slaves:1 slave0:ip=192.168.1.YYYY,port=16379,state=online,offset=8807281,lag=1 master_repl_offset:8807392 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:7758817 repl_backlog_histlen:1048576 ・・・略・・・
データ投入確認
公式サイトのチュートリアルを基にマスタ側にデータ投入を行ってみます。レプリケーションが正常に稼働していればスレーブ側で同じデータが確認できるはずです。
- マスタ側で投入
> set mykey somevalue OK > get mykey "somevalue" > set mykey newval nx > set mykey newval xx OK > get mykey "newval" > set counter 100 > incr counter (integer) 101 > incr counter (integer) 102 > incrby counter 50 (integer) 152
- スレーブ側で反映を確認
127.0.0.1:6379> get mykey "newval" 127.0.0.1:6379> get counter "152"
永続化設定
設定ファイル redis.conf にレプリケーション設定を追記します。
- 例
# slaveofslaveof example.lclxxx.0001.apne1.cache.amazonaws.com 6379
$ sudo vi /etc/redis.conf $ sudo chkconfig redis on $ sudo chkconfig --list redis redis 0:off 1:off 2:on 3:on 4:on 5:on 6:off
RDSファイル取得
bgsaveコマンドにてrdbファイル出力を行います。
lastsaveは最後にsaveが正常終了したUNIXTIMEを返します。
bgsave実行前後にlastsaveでの出力結果が変わることを確認し、出力されたrdbファイル(/var/lib/redis/dump.rdb)を取得します。
出力したrdbファイルの正常性をredis-check-dumpで確認します。
$ redis-cli 127.0.0.1:6379> lastsave (integer) 1440518740 127.0.0.1:6379> bgsave Background saving started 127.0.0.1:6379> lastsave (integer) 1440518803 127.0.0.1:6379> exit $ cp -p /var/lib/redis/dump.rdb /tmp/example.dump.rdb $ redis-check-dump /tmp/example.dump.rdb ==== Processed 5 valid opcodes (in 93 bytes) =================================== CRC64 checksum is OK
まとめ
- ElastiCache Redis のスナップショットは内部的にはbgsaveを実行しています
- 自動取得の保持期間は最大35日です
- 手動取得の制限数は、連続する24時間の間にクラスタ毎に20までです
- RDBファイルへの直接アクセスは提供されていません
EC2建てて、Redisインストールして、レプリケーション設定して、バックアップ取得して、、、 と聞くと何やら大変な感じがしますが、思っていたよりは簡単に目的のファイルが取得できました。