読者です 読者をやめる 読者になる 読者になる

vague memory

うろ覚えを無くしていこうともがき苦しむ人の備忘録

AWS ElastiCache(Redis)からRDBファイル取得

AWS NoSQL

Redis.jpg

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つの異なる範囲の永続性オプションを提供
    • RDB
      • スナップショットを取得
      • バイナリ形式のファイル(.rdb)を出力
    • AOF (Append Only File)

ElastiCache(Redis)のバックアップ(スナップショット)

  • バックアップと復元はRedisを実行するクラスタのみでサポート
  • RedisのネイティブのBGSAVEコマンドを使用して作成
  • 自動スナップショットの保持期間は最大35日
  • 手動スナップショットは連続する24時間の間にクラスタ毎に20までしか作成できない
  • AWS上でスナップショットの取得状況は参照可能
    • サーバー上から見ようとしても直接アクセスができない

ということで、AWS公式サイトの推奨手順「手動スナップショットのエクスポート」に則りEC2にRedisレプリカを構築して取得します。

  1. EC2インスタンス作成
  2. EC2にRedisエンジンインストール
  3. EC2上のRedisを外部リードレプリカとしてプライマリノードに接続
  4. 非同期コマンド(BGSAVE)を使用して外部リードレプリカのスナップショットを作成
  5. EC2インスタンスシャットダウン

一度構築・設定してしまえば、後はレプリケーション有効化→スナップショット取得で定期的に実行できます。


EC2上にRedis構築

今回EC2側はAmazonLinuxを使用しました。

  • Amazon Linux AMI 2015.03.1 (HVM)
  • ElastiCache Redis 2.8.21

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 にレプリケーション設定を追記します。

# slaveof  
slaveof 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をレプリカとして構築しRDBファイルを取得します
    • レプリケーションの有効/無効化はコマンド1つで行えます

EC2建てて、Redisインストールして、レプリケーション設定して、バックアップ取得して、、、 と聞くと何やら大変な感じがしますが、思っていたよりは簡単に目的のファイルが取得できました。