AWS ElastiCache のエラーから Redis の永続化について調べた

きっかけ

AWS ElastiCache で Redis のクラスタを作成したときに, 以下の警告文がイベントに出力されていて気になった.

This cache cluster does not support persistence (ex: 'appendonly').
Please use a different instance type to enable persistence.

「現在のクラスタでは永続化がサポートされていないので, 別のインスタンスを使おう」

環境

  • AWS ElastiCache
  • Redis 3.2.10
  • ノードのインスタンスタイプ: cache.t2.small

AOF とは?

Redis の AOF (Append-Only File) 機能を有効にすることができます。この機能を有効にすると、キャッシュノードは、キャッシュデータを変更するすべてのコマンドを Append-Only File に書き込みます。

MySQL でいう Binary Log, PostgreSQL でいう WAL Log.

Redis サーバが受けた全てのコマンドが記録されており, サーバ起動時にログからコマンドが実行され元のデータが再構築される.

結論

今回の警告の原因はスペック不足.

AOF (Append Only File) は、cache.t1.micro ノードおよび cache.t2* ノードではサポートされません。

AOF では I/O 処理が発生するので, ある程度のパフォーマンスが出るインスタンスでないと

安定した挙動が確保できないからだろう(と予測).

参考

docs.aws.amazon.com

Redis の永続化 — Redis Documentation (Japanese Translation)

wercker で redis service を使用する方法

背景

  • CI でのテスト実行時に Redis が動作する環境を用意したい.

  • Redis は AWS ElastiCache で動作している.

  • ElastiCache はデフォルトでは許可された AWS 内のセキュリティグループからのみアクセス可能で, public アクセス可能にするには NAT インスタンス作ったりする必要がある.

docs.aws.amazon.com

wercker.yml に services セクションを追加する

services:
    - redis

他には mongo, elasticsearch などが使える.

追加される環境変数

redis service を追加すると以下の環境変数が追加される.

REDIS_PORT
REDIS_NAME
REDIS_PORT_6379_TCP_ADDR
REDIS_PORT_6379_TCP
REDIS_ENV_REDIS_DOWNLOAD_URL
REDIS_PORT_6379_TCP_PORT
REDIS_ENV_REDIS_DOWNLOAD_SHA
REDIS_ENV_GOSU_VERSION
REDIS_ENV_REDIS_VERSION

重要なのが REDIS_PORT_6379_TCP_ADDR で, 実行環境の Redis の接続先として設定する

const redisHost = process.env.REDIS_PORT_6379_TCP_ADDR || process.env.REDIS_HOST;

注意点

wercker 公式にある DockerHub(sutoiku/redis) を引用する方法だと, Redis 関連の環境変数が設定されず上記設定は使えないので注意.

参考

devcenter.wercker.com

qiita.com

ffmpeg の Static Build を Linux 環境に導入するワンライナー

TL;DR

gist.github.com

解説

ダウンロード

$ wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz

展開用のディレクトリ作成

$ mkdir -p ffmpeg-static

1階層目のディレクトリを削って, 展開用ディレクトリに解凍

$ tar xvf ffmpeg-release-64bit-static.tar.xz -C ffmpeg-static --strip-components 1

ffmpeg-release-64bit-static.tar.xz を解凍すると ffmpeg-3.4.1-64bit-static というようにビルドバージョンを含んだディレクトリ名になるので, 1階層目を削って(名前を固定するために)展開用ディレクトリを対象にして解凍する.

コマンドとして使えるように移動

$ sudo mv ffmpeg-static/ff* /usr/bin/
ffmpeg
ffmpeg-10bit
ffprobe
ffserver

関連するコマンドもあわせて移動して完了.

Node.js のプロセスマネージャー PM2 でよく使うコマンドまとめ

PM2 でよく使うコマンドのメモ.

pm2.keymetrics.io

list

$ pm2 list

PM2 を使って管理しているプロセスの一覧がみれる.

show

$ pm2 show $APP_NAME

App Name を指定することで list より詳しい情報がみれる.

┌───────────────────┬──────────────────────────────────────────────────┐
│ status            │ online                                           │
│ name              │ app                                              │
│ restarts          │ 0                                                │
│ uptime            │ 6h                                               │
│ script path       │ /home/ubuntu/app/app.js                          │
│ script args       │ N/A                                              │
│ error log path    │ /home/ubuntu/.pm2/logs/app-error-0.log           │
│ out log path      │ /home/ubuntu/.pm2/logs/app-out-0.log             │
│ pid path          │ /home/ubuntu/.pm2/pids/app-0.pid                 │
│ interpreter       │ node                                             │
│ interpreter args  │ N/A                                              │
│ script id         │ 0                                                │
│ exec cwd          │ /home/ubuntu/app                                 │
│ exec mode         │ fork_mode                                        │
│ node.js version   │ 8.9.4                                            │
│ watch & reload    │ ✘                                                │
│ unstable restarts │ 0                                                │
│ created at        │ 2018-01-30T04:49:08.286Z                         │
└───────────────────┴──────────────────────────────────────────────────┘

logs

$ pm2 logs $APP_NAME

PM2 はデフォルト設定では $HOME/.pm2/logs/ 配下にログが格納される.

logs コマンドを使うと, わざわざ tail したりしなくて良い.

--watch

# pm2 start $APP_NAME --watch

App があるディレクトリ / サブディレクトリのファイルが変更されると

自動的にプロセスを再起動する.

※ --watch での再起動は graceful ではないので注意.

gracefulReload

$ pm2 gracefulReload $APP_NAME

稼働中のプロセスを正常に(処理が終了してから)終了して再読込する.

save

$ pm2 save

PM2 で管理しているプロセスを起動時に立ち上がるように保存する.

/home/$USER/.pm2/dump.pm2 にどんな内容で立ち上げるかが保存される.

内部的には環境に応じた init システムを検出して登録している.

    var hash_map = {
      'systemctl'  : 'systemd',
      'update-rc.d': 'upstart',
      'chkconfig'  : 'systemv',
      'rc-update'  : 'openrc',
      'launchctl'  : 'launchd',
      'sysrc'      : 'rcd'
    };

github.com

調べてもわからなかったこと

$ pm2 start pm2-config.json --env production

↑ で起動した時に, あとから --env に指定した内容を確認する方法.

質問してみたので, わかりしだい追記予定.

github.com