Heroku Data for Redis
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2024年04月24日(水)
Table of Contents
Heroku Data for Redis は、アドオンとしてプロビジョニングおよび管理される、Heroku によって実行されるインメモリ型の Key-Value データストアです。Heroku Data for Redis には、Heroku によってサポートされているすべての言語およびフレームワークを含むすべての言語から、Redis ドライバーでアクセスできます。
Salesforce では、平等に関する会社としての価値観に適合するよう、インクルーシブでない用語を可能な範囲で変更しています。当社製以外のシステムに関する記述では、インクルーシブでない用語をそのまま使用していますが、Heroku では開発者コミュニティに対し、よりインクルーシブな表現の採用を奨励しています。Heroku では、インクルーシブでない用語を、それが技術的な正確さのために必要でなくなったときに更新します。
アドオンのプロビジョニング
Redis インスタンスがすでにプロビジョニングされているかどうかを確認する
heroku addons
コマンドを使用して、アプリケーションで Redis インスタンスがすでにプロビジョニングされているかどうかを確認します。
$ heroku addons | grep heroku-redis
heroku-redis (cooking-peacefully-8526) mini $3/month
インスタンスを作成する
Heroku Data for Redis は CLI 経由でアプリケーションにアタッチできます。このコマンドやその他の例では Mini プランを使用します。
$ heroku addons:create heroku-redis:mini -a your-app-name
Heroku Data for Redis のプランについての詳細は、「Heroku Data for Redis Plans and Pricing」(Heroku Data for Redis のプランと価格) を参照してください。
Redis バージョン 6 の時点では、Mini プランは TLS 接続と暗号化されていない接続の両方をサポートします。本番プランには TLS 接続が必要です。Redis 6 データベースに接続するには、Redis クライアントの設定で TLS を有効にする必要があります。詳細は、「Heroku Data for Redis Security and Compliance」(Heroku Data for Redis のセキュリティとコンプライアンス) を参照してください。
アプリで REDIS_URL
環境設定を手動で作成している場合、その設定は最初の heroku-redis アドオンを追加したときに上書きされます。それを保存するには、その環境設定を別の環境設定キーにコピーします。また、ここ記載されているように、heroku addons:create
に --as
オプションを使用して heroku-redis に別の URL を使用することもできます。
heroku addons:info
コマンドは、作成の進行状況を表示します。State が “creating” である場合は、まだプロビジョニング中で準備ができていないことを示します。
$ heroku addons:info soaring-duly-3158
=== soaring-duly-3158
Attachments: example-app::HEROKU_REDIS
Installed at: Tue Nov 29 2016 10:12:34 GMT-0800 (PST)
Owning app: example-app
Plan: heroku-redis:mini
Price: $3/month
State: creating
Heroku Data for Redis が作成されると、新しいリリースが作成され、アプリケーションが再起動します。REDIS_URL
環境設定は、アプリ設定で使用できます。これには、新しくプロビジョニングされた Heroku Data for Redis インスタンスにアクセスするために使用できる URL が含まれています。この URL は、heroku config
コマンドで確認できます。
$ heroku config | grep REDIS
REDIS_URL: redis://h:asdfqwer1234asdf@ec2-111-1-1-1.compute-1.amazonaws.com:111
REDIS_URL
および REDIS_TLS_URL
の環境設定は、いつでも変化する可能性があります。Heroku アプリ外の環境設定に依存していて、それが変化した場合は、値の再コピーが必要になります。
プライマリインスタンスを確立する
Heroku では、プライマリインスタンスの場所を保存するために REDIS_URL
環境設定を作成します。単一インスタンス設定では、新しいインスタンスに REDIS_URL
が割り当てられます。REDIS_URL
が存在する場合は、代わりに HEROKU_REDIS_<color>
URL がインスタンスに割り当てられます。
インスタンスのプロモート
アプリに複数の Redis インスタンスが存在する場合、promote
コマンドを使用してプライマリインスタンスを設定することができます。
$ heroku redis:promote HEROKU_REDIS_JADE
Promoting maturing-deeply-2628 to REDIS_URL on example-app
アプリケーション間での Heroku Data for Redis の共有
1 つの Heroku Data for Redis を複数のアプリケーション間で共有することができます。
$ heroku addons:attach my-originating-app::REDIS --app example-app
Attaching redis-addon-name to example-app... done
Setting HEROKU_REDIS_CYAN config vars and restarting example-app... done, v10
Redis アドオンがすでにプロビジョニングされている場合は、そのデータベースに色がアタッチされます (この例では HEROKU_REDIS_CYAN
ですが、毎回変更されます)。アドオンがない場合は、環境設定 REDIS_URL
を使用して REDIS
としてアタッチされます。
共有されるデータベースは、必ずしも、共有されるいずれかのアプリのデフォルトデータベースにはなりません。共有データベースをプライマリデータベースにプロモートするには、そのデータベースをデフォルトデータベースとする対象の各アプリで、redis:promote
コマンドにアドオン名を指定して使用します。
$ heroku redis:promote redis-addon-name --app example-app
Promoting redis-addon-name to REDIS_URL on example-app
バージョンサポートおよびレガシーインフラストラクチャ
Heroku は、「EOL」または「非推奨」バージョンのアドオンのセキュリティと機能を更新しなくなりました。メインサービス契約の規定に従って Heroku Data for Redis のサポート対象かつ最新のバージョンにアップグレードしていただけない場合、お客様の環境でセキュリティインシデントの発生リスクが高まる可能性があります。
Heroku では現在、Redis バージョン 7.2 をデフォルトとして提供しており、バージョン 7.2 と 7.0 の更新とサポートは引き続き提供されます。
Heroku Data for Redis はデフォルトで、当該プラットフォームで許可リストに指定されている Redis の最新の安定バージョンになります。Heroku は、少なくとも 2 つのリリースがプラットフォームでサポートされるという Redis プロジェクトのリリーススケジュールに従います。現在サポートされているバージョンは、次のとおりです。
バージョン | ステータス | サポート終了日 |
---|---|---|
6.2 | 廃止 | 2024 年 12 月 2 日 |
7.0 | 使用可能 | 2025 年 Q4 |
7.2 | 使用可能 (デフォルト) | 2026 年 Q4 |
Redis プロジェクトはそのリリースサイクルドキュメントに基づき、現在のリリースと前回の安定リリースのみサポートします。つまり、いずれのブランチでもバグレポートを提出でき、修正が可能であることを意味します。Heroku では、それぞれのインスタンスを可能な限り最新のパッチリリースに維持するためにあらゆる努力を払います。
Heroku ではまた、インフラストラクチャの古いバージョンも廃止します。これは、データベースの下で実行されているオペレーティングシステムがセキュリティ更新を受信しなくなる場合、オペレーティングシステムのサポートが経過期間のために実用的でなくなった場合 (必要なパッケージやパッチが使用できなくなるか、またはサポートが困難になった場合)、またはサーバーインスタンスが現在のインフラストラクチャとは大幅に異なり、サポートが非現実的になった場合に行われることがあります。
Heroku Data for Redis プランのアップグレード
Heroku Data for Redis プランをアップグレードできます。アップグレードするには、まず、アップグレードする必要のある Heroku Data for Redis インスタンスのリソース名を見つけます。リソース名は、すべてのアプリおよびアドオンにわたるインスタンスのグローバル固有名です。
$ heroku redis:info -a example-app
=== maturing-calmly-4191 (HEROKU_REDIS_ROSE_URL)
Plan Premium 0
Status Available
Created 2015-07-20 20:26 UTC
Timeout 300
Maxmemory noeviction
Maintenance window: Mondays 22:30 to Tuesdays 02:30 UTC
Persistence: AOF
この例では、maturing-calmly-4191
が Premium-0 プランから Premium-1 プランにアップグレードされます。ここで、maturing-calmly-4191
は Redis インスタンスの名前であって、この場合はアプリケーションではないことを覚えておいてください。
$ heroku addons:upgrade maturing-calmly-4191 heroku-redis:premium-1 -a example-app
Changing maturing-calmly-4191 plan to heroku-redis:premium-1... done, ($30.00/month)
The Heroku Data for Redis instance is in the process of being upgraded.
The time it takes to upgrade is dependent on how much data exists in the instance.
インスタンスをアップグレードするとき、Heroku Data for Redis は切り替えを行う前に、あるインスタンスから別のインスタンスにデータをコピーします。アップグレードが完了する前に遅延が発生します。
このプロセスは、heroku redis:info
を使用して実行できます。
$ heroku redis:info -a example-app
===maturing-calmly-4191 (HEROKU_REDIS_ROSE_URL)
Plan Premium 0
Status Preparing (upgrade in progress)
Created 2015-07-20 20:26 UTC
Timeout 300
Maxmemory noeviction
Maintenance window: Mondays 22:30 to Tuesdays 02:30 UTC
Persistence: AOF
Heroku Data for Redis への移行
heroku addons:create
を使用することで、別の Redis インスタンスを使用して新しい Heroku Data for Redis インスタンスにデータを設定できます。
$ heroku addons:create heroku-redis:premium-0 --fork rediss://h:<password>@<hostname>:<port> -a example-app
Creating heroku-redis:premium-0 on ⬢ example-app... $15/month
Your add-on is being provisioned and will be available shortly
redis-acute-6762 is being created in the background. The app will restart when complete...
Use heroku addons:info redis-acute-6762 to check creation progress
Use heroku addons:docs heroku-redis to view documentation
移行プロセスでは、新しいインスタンスを作成して、指定された Redis URL に従い始め、すべてのデータが転送されるとそれに従うことを止めます。
このプロセスは、heroku redis:info
を使用して実行できます。
$ heroku redis:info -a example-app
===redis-acute-6762 (HEROKU_REDIS_PURPLE_URL)
Plan Premium 0
Status Preparing (fork in progress)
Created 2015-07-20 20:30 UTC
Timeout 300
Maxmemory noeviction
Maintenance window: Mondays 22:30 to Tuesdays 02:30 UTC
Persistence: AOF
外部の Redis インスタンスはフォーク機能を動作させるための SYNC
をサポートする必要があります。外部の Redis インスタンスに必要なサポートがない場合は、エラーがスローされます。
Heroku では、暗号化を使用することを、したがってフォークを作成するときは redis://
ではなく rediss://
URL を使用することをお勧めします。暗号化された Heroku Data for Redis インスタンスによって、Premium、Private、および Shield データベースのために rediss://
サービスが公開されます。Mini データベースの場合は、ポートが異なり、TLS URL (ポートを含む) を TLS_URL
環境設定で確認できます。6 より前のバージョンでは、暗号化された Heroku Data for Redis インスタンスによって、Premium、Private、および Shield データベースのためにクリアテキストポート 6479
ではなく、ポート 6480
で rediss://
サービスが公開されます。
フォークコマンドでは、カスタマイズされた設定 (エビクションポリシーを含む) はコピーされません。たとえば、heroku redis:timeout
を使用して接続タイムアウトをカスタマイズした場合、タイムアウトはフォークにコピーされません。
Heroku Data for Redis バージョンのアップグレード
手順については、「Heroku Data for Redis バージョンのアップグレード」を参照してください。
高可用性
Heroku Data for Redis のすべての Premium プランには高可用性 (HA) 機能が付いています。プライマリ Redis インスタンスに障害が発生した場合、そのインスタンスは、スタンバイと呼ばれる別のレプリカに自動的に置き換えられます。
HA スタンバイは、アベイラビリティゾーン全体の障害から保護するために、別のアベイラビリティゾーンに物理的に配置されます。
フェイルオーバー条件
突然発生するフェイルオーバーによく見られる問題を防ぐために、フェイルオーバーに適切に対応するための一連のチェックが実行されます。これらのチェックは数秒ごとに実行され、SSH プロトコルを使用して、基礎となるホストとの接続の確立が行われます。ただし、何らかの理由で Redis プロセスのみが使用てきなくなった場合、フェイルオーバーは必要なく、代わりにそのプロセスが元の使用可能な状態にブートされるため、可能な場合は常にダウンタイム期間がさらに短くなります。
システムで問題が検出されると、複数のネットワークの場所でいくつかのチェックを 2 分間実行することによって、インスタンスが本当に使用不能であるかどうかを確認します。こうすることで、一過性の問題によりフェイルオーバーがトリガーされることを防ぎます。
スタンバイは非同期的に最新の状態に維持されます。データをプライマリインスタンスにコミットするが、スタンバイにはまだコミットしないようにできます。通常、Redis はデータをディスクにコミットしないため、データ損失は最小限に抑えられます。
フェイルオーバー後
フェイルオーバーを正常に行った後、いくつかのことに気をつける必要があります。最初に、インスタンスの URL が変更されるため、アプリは新しい資格情報で自動的に再起動します。シングルテナントプラン (Premium-7 以上を含む) を使用している場合、フェイルオーバーは透過的に行われます。基礎となるリソースが変更されますが、Elastic IP アドレス (URL) は変更されません。最後に、プランには関係なく、新しいスタンバイが自動的に再作成され、それが使用可能になってフェイルオーバー条件を満たすまでは HA プロシージャを実行できません。
パフォーマンス分析
パフォーマンス分析は、Heroku Data for Redis の可視性スイートです。これにより、インスタンスのパフォーマンスを監視し、潜在的な問題を診断することができます。これはいくつかのコンポーネントで構成されます。
プラン制限メトリクス
Redis のパフォーマンスが悪い一番の原因は、プランのパフォーマンスの上限に到達してしまうことです。data.heroku.com 経由で利用可能なプラン制限メトリクスは、時間軸に沿った接続およびメモリ使用量という観点で、Redis の使用量を特定して把握するのに役立ちます。
ログ記録
アプリケーションやフレームワークがインスタンスアクセスのログを出力する場合は、Heroku のログストリームからログを取得できます。
$ heroku logs -t
Redis サービス自体のログを表示するには、プロセスタイプ -p
フラグとアドオン名を使用します。このコマンドは、特定の Heroku Data for Redis アドオンからのログのみを表示することを示します。
$ heroku logs -p redis-triangular-12345 -t
出力の形式には次の情報が含まれます。
- タイムスタンプ
- サービス
- リソース名
- メッセージ
2024-03-15T14:25:57.000000+00:00 app[redis-triangular-12345]: Error accepting a client connection
インスタンスパフォーマンスへの影響を最小限に抑えるために、ログはベストエフォートベースで配信されます。
インスタンスの設定
Heroku Data for Redis ではインスタンスの timeout
および maxmemory-policy
の設定をユーザーが変更できます。これらの設定は、アップグレードや HA フェイルオーバーにまたがって保持されます。
timeout
timeout
設定は、Redis がアイドル接続を終了するまでに待機する秒数を設定します。0 の値は、接続が閉じられないことを示します。デフォルト値は 300 秒 (5 分) です。この値は CLI を使用して変更できます。
$ heroku redis:timeout maturing-deeply-2628 --seconds 60
Timeout for maturing-deeply-2628 (REDIS_URL) set to 60 seconds.
Connections to the redis instance will be stopped after idling for 60 seconds.
maxmemory-policy
maxmemory-policy
設定は、インスタンスがストレージ制限に到達したときに使用されるキー追い出しポリシーを設定します。使用可能なキーの追い出しポリシーには次のものがあります。
noeviction
は、メモリ制限に達したときにエラーを返します。allkeys-lru
は、最近あまり使用されていないキーを最初に削除します。volatile-lru
は、有効期限が設定された最近あまり使用されていないキーを最初に削除します。allkeys-random
は、ランダムキーを追い出します。volatile-random
は、有効期限が設定されたランダムキーを追い出します。volatile-ttl
は、有効期限が設定された、TTL の短いキーを追い出します。volatile-lfu
は、有効期限が設定されたキーの中から概算 LFU を使用して追い出します。allkeys-lfu
は、どのキーも概算 LFU を使用して追い出します。
Heroku Data for Redis では、lfu-log-factor
や lfu-decay-time
の調整はサポートされていません。
デフォルトでは、これは noeviction
に設定されています。この値は CLI を使用して変更できます。
$ heroku redis:maxmemory maturing-deeply-2628 --policy volatile-lru
Maxmemory policy for maturing-deeply-2628 (REDIS_URL) set to volatile-lru.
volatile-lru evict keys trying to remove the less recently used keys first, but only those that have an expiry set.
これらの設定は、新しいプランをプロビジョニングするときに設定できます。heroku addons:create heroku-redis:premium-0 --timeout 60 --maxmemory_policy volatile-lru
セキュリティおよびコンプライアンス
Redis 6 以上には、トラフィックを暗号化するためのネイティブな TLS サポートがあります。
Redis 6 以上を使用した本番プランでは、Heroku Data for Redis への接続には TLS が必要です。
Mini プランでは、Heroku Data for Redis は TLS 接続と TLS 以外の接続の両方を受け付け、*_TLS_URL
および *_URL
環境設定を通して 2 つの異なる接続文字列を公開します。TLS 環境設定 (デフォルトでは REDIS_TLS_URL
) では、接続文字列で rediss
スキームを使用し、TLS ポートを指します。TLS 以外の環境設定 (デフォルトでは REDIS_URL
) では、接続文字列で redis
スキームを使用し、TLS 以外のポートを指します。
Heroku Data for Redis では、Redis クライアントの verify_mode
SSL 設定を設定するように要求できる自己署名証明書を使用しています。TLS 接続の設定の例については、「Connecting to Heroku Data for Redis」(Heroku Data for Redis への接続) を参照してください。
CLI の使用
CLI を使用した Heroku Data for Redis の管理についての詳細は、「Managing Heroku Data for Redis Using the CLI」(CLI を使用した Heroku Data for Redis の管理) を参照してください。
Heroku Data for Redis への接続
Heroku Data for Redis への接続についての詳細は、「Heroku Data for Redis への接続」を参照してください。
永続性
Heroku Data for Redis の Mini プランでは、インスタンスデータは保持されません。インスタンスのリブートが必要になるか、またはエラーが発生した場合、インスタンス上のデータは失われます。
Heroku Data for Redis の本番プラン (Premium、Private、Shield) では、AOF 永続性を使用して 1 秒ごとにディスクに書き込みます。これらのプランには、フェイルオーバーのための高可用性スタンバイがあります。
データのバックアップを取得するには、CLI fork
オプションを使用するか、または外部レプリケーションを使用します。fork
オプションについての詳細は、「Heroku Data for Redis への移行」を参照してください。
アドオンの削除
アドオンは、Heroku Dashboard を使用して、または CLI を使用して削除できます。
Heroku Data for Redis インスタンスは、破棄された後は回復できません。インスタンスを削除する前に、Redis データのコピーを作成してください。
Dashboard を使用して削除する
Heroku Dashboard から Redis インスタンスを削除するには:
- Heroku Dashboard から、アプリケーションに移動し、[Resources] (リソース) タブを選択します。
- [Resources] (リソース) タブで、Heroku Data for Redis リソースの右側にあるセレクタを選択し、[Delete Add-on] (アドオンの削除) を選択します。
- [Remove Add-on] (アドオンの削除) ページで、確認としてアプリの名前を入力し、[Remove add-on] (アドオンの削除) を選択します。
CLI を使用して削除する
CLI からアドオンを削除するには、次のコマンドを使用します。
$ heroku addons:destroy REDIS -a example-app
Destroying soaring-duly-3158 on example-app... done
Removing vars for REDIS from example-app and restarting... done, v75
破棄されるアドオンを次のいずれかで指定します。
- Heroku Data for Redis アドオンのアタッチメント名 (
REDIS
、HEROKU_REDIS_BLUE
など) - Heroku Data for Redis アドオンの名前 (
redis-fitted-65964
など)
サポート
Heroku Data for Redis に関するすべてのサポートおよびランタイムの問題は、Heroku サポートチャネルを通じて送信する必要があります。