Heroku Key-Value Store
最終更新日 2025年01月28日(火)
Table of Contents
Heroku Key-Value Store (KVS) は、アドオンとしてプロビジョニングおよび管理される、Heroku によって実行されるインメモリ型の Key-Value データストアです。Heroku Key-Value Store には、Heroku によってサポートされているすべての言語およびフレームワークを含むすべての言語から、Redis ドライバーでアクセスできます。KVS は、Redis と Valkey の両方の構成と互換性があります。
Salesforce では、平等に関する会社としての価値観に適合するよう、インクルーシブでない用語を可能な範囲で変更しています。当社製以外のシステムに関する記述では、インクルーシブでない用語をそのまま使用していますが、Heroku では開発者コミュニティに対し、よりインクルーシブな表現の採用を奨励しています。Heroku では、インクルーシブでない用語を、それが技術的な正確さのために必要でなくなったときに更新します。
アドオンのプロビジョニング
KVS インスタンスがすでにプロビジョニングされているかどうかを確認する
heroku addons
コマンドを使用して、アプリケーションで KVS インスタンスがすでにプロビジョニングされているかどうかを確認します。
$ heroku addons | grep heroku-redis
heroku-redis (cooking-peacefully-8526) mini $3/month
インスタンスを作成する
CLI 経由で Heroku Key-Value Store をアプリケーションにアタッチできます。このコマンドやその他の例では Mini プランを使用します。
$ heroku addons:create heroku-redis:mini -a your-app-name
Heroku Key-Value Store プランの詳細については、Heroku Key-Value Store のプランと価格を参照してください。
すべての Key-Value Store プランで TLS 接続が必須となっています。KVS インスタンスに接続するには、Redis クライアントの設定で TLS を有効にする必要があります。2024 年 12 月現在、mini
プランでも TLS 接続が必須となっています。
アプリで 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)
Max Price: $3/month
Owning app: example-app
Plan: heroku-redis:mini
Price: ~$0.004/hour
State: creating
heroku addons:wait
を使用してプロビジョニングステータスを表示することもできます。
Heroku Key-Value Store をプロビジョニングすると、新しいリリースが作成され、アプリケーションが再起動されます。REDIS_URL
環境設定は、アプリ設定で使用できます。これには、新しくプロビジョニングされた Heroku Key-Value Store インスタンスにアクセスするために使用できる 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
環境設定は常に変化する可能性があります。Heroku アプリ外の環境設定に依存していて、それが変化した場合は、値の再コピーが必要になります。
プライマリインスタンスを確立する
Heroku では、プライマリインスタンスの場所を保存するために REDIS_URL
環境設定を作成します。単一インスタンス設定では、新しいインスタンスに REDIS_URL
が割り当てられます。REDIS_URL
が存在する場合は、代わりに HEROKU_REDIS_<color>
URL がインスタンスに割り当てられます。
インスタンスのプロモート
アプリに複数の KVS インスタンスが存在する場合、promote
コマンドを使用してプライマリインスタンスを設定できます。
$ heroku redis:promote HEROKU_REDIS_JADE
Promoting maturing-deeply-2628 to REDIS_URL on example-app
アプリケーション間での Heroku Key-Value Store の共有
1 つの Heroku Key-Value Store を複数のアプリケーション間で共有できます。
$ 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
KVS アドオンがすでにプロビジョニングされている場合は、そのデータベースに色がアタッチされます (この例では 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 Key-Value Store のサポート対象かつ最新のバージョンにアップグレードしない場合、お客様の環境でセキュリティインシデントの発生リスクが高まる可能性があります。
Heroku では Valkey 7.2 をデフォルトバージョンとして提供しており、Valkey 7.2 と Redis 7.0 の更新とサポートは引き続き提供されます。バージョン 7.2 は、既存の KVS アドオンおよび実装と完全に互換性のある Valkey インフラストラクチャ上で実行されます。
Heroku Key-Value Store はデフォルトで、当該プラットフォームで許可リストに指定されている Valkey の最新の安定バージョンになります。Heroku は、少なくとも 2 つのリリースがプラットフォームでサポートされるという、Valkey プロジェクトと Redis プロジェクトのリリーススケジュールに従います。現在サポートされているバージョンは、次のとおりです。
バージョン | ステータス | サポート終了日 |
---|---|---|
6.2 | 廃止 | 2024 年 12 月 2 日 |
7.0 | 使用可能 | 2025 年第 4 四半期 |
7.2 | 使用可能 (デフォルト) | 2026 年第 4 四半期 |
非推奨のインスタンスの廃止と移行
Heroku ではまた、インフラストラクチャの古いバージョンも廃止します。これは、データベースの下で実行されているオペレーティングシステムがセキュリティ更新を受信しなくなる場合、オペレーティングシステムのサポートが経過期間のために実用的でなくなった場合 (必要なパッケージやパッチが使用できなくなるか、またはサポートが困難になった場合)、またはサーバーインスタンスが現在のインフラストラクチャとは大幅に異なり、サポートが非現実的になった場合に行われることがあります。
新しいメジャーバージョンがリリースされると、その 2 つ前にリリースされたメジャーバージョンが非推奨になります。たとえば、Valkey 7.4 がリリースされると Redis 7.0 が非推奨になります。
- 非推奨になった日に、Heroku は影響を受けるデータベースの廃止プロセスについてメールでお客様に通知します。
- 非推奨になった日の 2 か月後には、Heroku で非推奨バージョンの新しいインスタンスをプロビジョニングできなくなります。
- 非推奨になった日の 3 か月後には、Heroku で非推奨バージョンをまだ実行しているインスタンスの強制アップグレードがスケジュール設定されます。
独自のスケジュールで互換性をテストし、予期しない問題に関する計画を立て、データベースを移行できるように、サポートが終了する前にバージョンアップグレードを実行することを強くお勧めします。
サポート終了
各バージョンのサポート終了日は非推奨になった日の 4 か月後です。この日付を過ぎるとインスタンスへのアクセスを制限し、準拠していないインスタンスを削除する作業が開始されます。
Heroku Key-Value Store プランのアップグレード
Heroku Key-Value Store プランはアップグレードできます。アップグレードするには、まず、アップグレードする必要のある Heroku Key-Value Store インスタンスのリソース名を見つけます。リソース名は、すべてのアプリおよびアドオンにわたるインスタンスのグローバル固有名です。
$ heroku redis:info maturing-calmly-4191 -a example-app
=== maturing-calmly-4191 (HEROKU_REDIS_ROSE_URL)
Plan: Premium 0
Status: Available
Created: 2024-09-30 21:40 UTC
Version: 7.2.4
Timeout: 300
Maxmemory: noeviction
Maintenance window: Mondays 22:30 to Tuesdays 02:30 UTC
Persistence: AOF
HA Status: Available
Requires TLS: Yes
Keyspace Notifications: Disabled
Plan Connection Limit: 10000
この例では、maturing-calmly-4191
が Premium-0 プランから Premium-1 プランにアップグレードされます。ここで、maturing-calmly-4191
は KVS インスタンスの名前であって、この場合はアプリケーションではないことを覚えておいてください。
$ 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 Key-Value Store は切り替えを行う前に、あるインスタンスから別のインスタンスにデータをコピーします。アップグレードが完了する前に遅延が発生します。
このプロセスは、heroku redis:info
を使用して実行できます。
$ heroku redis:info maturing-calmly-4191 -a example-app
=== maturing-calmly-4191 (HEROKU_REDIS_ROSE_URL)
Plan: Premium 0
Status: Preparing (upgrade in progress)
Created: 2024-09-30 21:40 UTC
Timeout: 300
Maxmemory: noeviction
Maintenance window: Mondays 22:30 to Tuesdays 02:30 UTC
Persistence: AOF
HA Status: Available
Requires TLS: Yes
Keyspace Notifications: Disabled
Plan Connection Limit: 10000
Heroku Key-Value Store への移行
heroku addons:create
を使用すると、別の KVS インスタンスを使用して新しい Heroku Key-Value Store インスタンスにデータを設定できます。
addons:create
の例は Heroku CLI v9.0.0 以降の構文に従っています。v8.11.5 以前を使用している場合は、次のコマンドを使用してください。
$ heroku addons:create heroku-redis:premium-0 --fork rediss://h:<password>@<hostname>:<port> -a example-app
$ heroku addons:create heroku-redis:premium-0 -a example-app -- --fork rediss://h:<password>@<hostname>:<port>
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 redis-acute-6762 -a example-app
===redis-acute-6762 (HEROKU_REDIS_PURPLE_URL)
Plan: Premium 0
Status: Preparing (fork in progress)
Created: 2024-09-30 21:40 UTC
Timeout: 300
Maxmemory: noeviction
Maintenance window: Mondays 22:30 to Tuesdays 02:30 UTC
Persistence: AOF
HA Status: Available
Requires TLS: Yes
Keyspace Notifications: Disabled
Plan Connection Limit: 10000
外部の Redis インスタンスはフォーク機能を動作させるための SYNC
をサポートする必要があります。外部の Redis インスタンスに必要なサポートがない場合は、エラーがスローされます。
Heroku では暗号化の使用が推奨されており、フォーク作成時の URL には redis://
ではなく rediss://
が推奨されます。暗号化された Heroku Key-Value Store インスタンスは、すべてのインスタンスに対して rediss://
サービスを公開します。
フォークコマンドでは、カスタマイズされた設定 (エビクションポリシーを含む) はコピーされません。たとえば、heroku redis:timeout
を使用して接続タイムアウトをカスタマイズした場合、タイムアウトはフォークにコピーされません。
Heroku Key-Value Store バージョンのアップグレード
手順については、「Heroku Key-Value Store バージョンのアップグレード」を参照してください。
高可用性
Heroku Key-Value Store のすべての Premium プランには高可用性 (HA) 機能が付いています。プライマリ KVS インスタンスに障害が発生した場合、そのインスタンスは、スタンバイと呼ばれる別のレプリカに自動的に置き換えられます。
HA スタンバイは、アベイラビリティゾーン全体の障害から保護するために、別のアベイラビリティゾーンに物理的に配置されます。
フェイルオーバー条件
突然発生するフェイルオーバーによく見られる問題を防ぐために、フェイルオーバーに適切に対応するための一連のチェックが実行されます。これらのチェックは数秒ごとに実行され、SSH プロトコルを使用して、基礎となるホストとの接続の確立が行われます。ただし、何らかの理由で Redis プロセスのみが使用てきなくなった場合、フェイルオーバーは必要なく、代わりにそのプロセスが元の使用可能な状態にブートされるため、可能な場合は常にダウンタイム期間がさらに短くなります。
システムで問題が検出されると、複数のネットワークの場所でいくつかのチェックを 2 分間実行することによって、インスタンスが本当に使用不能であるかどうかを確認します。こうすることで、一過性の問題によりフェイルオーバーがトリガーされることを防ぎます。
スタンバイは非同期的に最新の状態に維持されます。データをプライマリインスタンスにコミットするが、スタンバイにはまだコミットしないようにできます。通常、Redis はデータをディスクにコミットしないため、データ損失は最小限に抑えられます。
フェイルオーバー後
フェイルオーバーを正常に行った後、いくつかのことに気をつける必要があります。最初に、インスタンスの URL が変更されるため、アプリは新しい資格情報で自動的に再起動します。シングルテナントプラン (Premium-7 以上を含む) を使用している場合、フェイルオーバーは透過的に行われます。基礎となるリソースが変更されますが、Elastic IP アドレス (URL) は変更されません。最後に、プランには関係なく、新しいスタンバイが自動的に再作成され、それが使用可能になってフェイルオーバー条件を満たすまでは HA プロシージャを実行できません。
パフォーマンス分析
パフォーマンス分析は Heroku Key-Value Store の可視性スイートです。これにより、インスタンスのパフォーマンスを監視し、潜在的な問題を診断することができます。これはいくつかのコンポーネントで構成されます。
プラン制限メトリクス
Redis のパフォーマンスが悪い一番の原因は、プランのパフォーマンスの上限に到達してしまうことです。data.heroku.com 経由で利用可能なプラン制限メトリクスは、時間軸に沿った接続およびメモリ使用量という観点で、Redis の使用量を特定して把握するのに役立ちます。
ログ記録
Heroku Key-Value Store のサービスログとメトリクスログは、Fir 世代のアプリでは利用できません。機能が Fir に追加されたときに通知を受け取るには、Changelog の受信登録を行ってください。
アプリケーションやフレームワークがインスタンスアクセスのログを出力する場合は、Heroku のログストリームからログを取得できます。
$ heroku logs -t
Redis サービス自体のログを表示するには、プロセスタイプ -p
フラグとアドオン名を使用します。このコマンドは、特定の Heroku Key-Value Store アドオンからのログのみを表示することを示します。
$ 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 Key-Value Store では、インスタンスの 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 Key-Value Store では 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
セキュリティおよびコンプライアンス
Heroku Key-Value Store 上の Redis 接続には、トラフィックを暗号化するためのネイティブ TLS サポートがあります。すべての Key-Value Store プランで、REDIS_URL
環境設定を使用した TLS が必須となっています。2024 年 12 月現在、mini
プランでも REDIS_TLS_URL
ではなく REDIS_URL
を使用した TLS が必須となっています。
Heroku Key-Value Store では、Redis クライアントの verify_mode
SSL 設定を設定するように要求できる自己署名証明書を使用しています。TLS 接続の設定の例については、「Heroku Key-Value Store への接続」を参照してください。
CLI の使用
CLI を使用した Heroku Key-Value Store の管理についての詳細は、「CLI を使用した Heroku Key-Value Store の管理」を参照してください。
Heroku Key-Value Store への接続
Heroku Key-Value Store への接続についての詳細は、「Heroku Key-Value Store への接続」を参照してください。
永続性
Heroku Key-Value Store の Mini プランでは、インスタンスデータは保持されません。インスタンスのリブートが必要になるか、またはエラーが発生した場合、インスタンス上のデータは失われます。 Heroku Key-Value Store の本番プラン (Premium、Private、Shield) では、AOF 永続性を使用して 1 秒ごとにディスクに書き込みます。これらのプランには、フェイルオーバーのための高可用性スタンバイがあります。 データのバックアップを取得するには、CLI `fork` オプションを使用するか、または外部レプリケーションを使用します。`fork` オプションについての詳細は、「[Heroku Key-Value Store への移行](heroku-redis#migrating-to-heroku-key-value-store)」を参照してください。アドオンの削除
アドオンは、Heroku Dashboard を使用して、または CLI を使用して削除できます。
Heroku Key-Value Store インスタンスは、破棄された後は回復できません。インスタンスを削除する前に、KVS データのコピーを作成してください。
Dashboard を使用して削除する
Heroku Dashboard から KVS インスタンスを削除するには:
- Heroku Dashboard から、アプリケーションに移動し、[Resources] (リソース) タブを選択します。
- [Resources] (リソース) タブで、Heroku Key-Value Store リソースの右側にあるセレクタを選択し、[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 Key-Value Store アドオンのアタッチメント名 (
REDIS
、HEROKU_REDIS_BLUE
など) - Heroku Key-Value Store アドオンの名前 (
redis-fitted-65964
など)
サポート
Heroku Key-Value Store に関するすべてのサポートおよびランタイムの問題は、Heroku サポートチャネルを通じて送信する必要があります。