パーティション数は増やすことしかできず、減らすことはできません。これは ApsaraMQ for Kafka 固有の制約ではなく、Apache Kafka の設計上の制約です。
パーティション割り当ての仕組み
Kafka は、hash(key) % number_of_partitions に基づいて各メッセージをパーティションに割り当てます。各パーティションには、独立した順序付きのメッセージログが保存されます。パーティションを削除すると、次の 2 つの問題が発生します:
データ損失:そのパーティションに保存されているすべてのメッセージが失われます。
キーの再分配:剰余 (modulus) が変わるため、すべてのキーに対するハッシュのマッピングが変化します。キーに基づくメッセージの順序に依存するコンシューマー (たとえば、単一ユーザーのすべてのイベントを順番に処理するケース) では、メッセージが順不同で届いたり、完全に失われたりします。
代替案
パーティション数を事前に計画してください。 目標スループットとコンシューマーの並列性に基づいて見積もり、切り上げて設定してください。後からパーティションを追加することも可能ですが、キーの割り当てがシャッフルされる点は変わらないため、最初から余裕を持ってプロビジョニングしてください。
パーティション数を減らす必要がある場合は、トピックを再作成してください。 目的のパーティション数で新しいトピックを作成し、プロデューサーとコンシューマーを新しいトピックに移行してください。その後、すべてのメッセージが消費されるか期限切れになったことを確認してから、古いトピックを廃止してください。
単一パーティショントピックにおける高可用性 (HA) の制約
クラウドストレージモードでは、単一パーティション (partitionNum=1) のトピックは高可用性 (HA) を提供しません。そのパーティションをホストしているノードが、ノード障害またはアップグレードによって利用できなくなると、ノードがオンラインに戻るまでトピックにアクセスできません。
Message Queue for Apache Kafka コンソールでは、単一パーティションのクラウドストレージトピックを作成しようとすると警告が表示されます。単一パーティションのクラウドストレージトピックは推奨されません。
単一パーティショントピックにおけるリトライの動作
Kafka プロデューサーのリトライメカニズムは、単一パーティショントピックに対して次のように影響します:
ローリングアップグレード中:計画されたアップグレードによりノードが一時的にオフラインになる場合、リトライメカニズムにより中断の影響を軽減できます。プロデューサーはメッセージ配信をリトライし、ノードの復旧後に送信を再開できます。これにより、計画メンテナンス中のメッセージ損失を軽減できます (ただし、完全には防げません)。
計画外のノード障害時:ノードが予期せず故障した場合、リトライではデータ損失を防げません。ノードがリトライウィンドウ内に復旧しない場合、リトライキュー内のメッセージが失われる可能性があります。リトライポリシーは HA の代替にはなりません。
本番ワークロードで高可用性を確保するには、トピックに少なくとも 2 つのパーティションを設定してください。複数のパーティションがある場合、Message Queue for Apache Kafka は、1 つのノードに障害が発生しても、正常なノード上のレプリカパーティションから読み取りおよび書き込みリクエストを継続して処理します。
Kafka の内部トピックのパーティション数を変更するリスク
Kafka は、内部の台帳管理と状態管理のために内部トピック (例:__consumer_offsets) を使用します。Kafka クライアントは通常、パーティション数の変更を自動的に検出できますが、内部トピックのパーティション数を手動で変更する (たとえば 1 から 12 に増やす) と、重大なリスクが生じます:
メッセージの順序の問題:パーティション数を変更すると、メッセージがパーティションにルーティングされる方法が変わります。これまで 1 つのパーティションに割り当てられていたメッセージが別のパーティションにマッピングされるようになり、メッセージが順不同で処理される可能性があります。
状態の不整合:内部トピックには、コンシューマーグループのオフセットなどの重要な状態データが保存されます。パーティション数を変更すると、この状態が破損し、予期しないコンシューマーの動作、リバランスの失敗、またはクラスターの不安定化につながる可能性があります。
内部トピックのパーティション数は手動で変更しないでください。変更が必要な場合は、実施前に Alibaba Cloud テクニカルサポートに連絡し、リスクを評価してください。