Kafka Streamsを本番運用する時に検討しておくべきconfigの設定値について

Kafka Streamsをそれなりのデータ規模で運用していくとデフォルトの設定値では動作に困るケースがしばしば出てきます。

その中でも気にしておいた方がいい設定値について紹介していきます。

acceptable.recovery.lag

これはあるタスクにおいてStateStoreとchangelogトピックのlagのどこまでを追い付いていると許容するかどうかを設定します。

デフォルト値は10000なんですが、KTableとかで外部からデータが放り込まれていてそれが結構なデータ量だと10000とか一瞬で越えてしまって、一瞬プロセスを再起動しただけでも追い付いていない、みたいな扱いになってrebalanceが即座に走ってしまう挙動になりました。 実際にデータが入ってくるペースを考慮した値に設定しておかないと、プロセスを再起動した際に余計なrebalanceやレストアが走って無駄な停止時間が発生する可能性がある様です。

probing.rebalance.interval.ms

warmup replicaという仕組みが入って、一定期間ごとにwarmup状態をチェックするためのprobing rebalanceという処理が走る様になったのですが、それの実行間隔を指定します。

このconfigは公式のドキュメントだと重要度がLow扱いになってるんですが、これも運用規模によっては結構危険な設定値でした。デフォルト値は10分間です。 ノード数とかpartition数が多いとrebalanceが完了するまでに結構時間がかかる可能性があって、もしrebalanceが安定するまでに10分ぐらいかかってしまう場合、probing rebalanceがずっと終わらなくて、動作こそ継続できるもののクラスタの状態が不安定になるケースがありました。そういった場合に少し長めの値にすると状態が安定するかもしれません。

fetch.max.bytes, max.partition.fetch.bytes

consumerが一度に取得するデータサイズの上限を設定する値です。

これは全体のスループットや、StateStoreのレストア速度に影響します。余り小刻みにデータを取得するとその分の通信オーバヘッドでスループットが低下するので、データ量やネットワーク速度に合わせた値に設定することで、レストアにかかる時間が改善する可能性があります。