O'Reilly の Kafka 本を読みました

会社の同僚の @ueokande さんから Kafka 本を献本して頂きました。 大体読み終えたので紹介記事を書こうと思います。

https://www.amazon.co.jp/dp/4873118492

Kafka と私

私は2015年ぐらいから2017年ぐらいまで会社のログ基盤を整備する仕事をしていました。

ログ基盤プロジェクト以前は、1日数百GBのログを一台の物理マシンに ssh で集約するという大変ナイーブな仕組みで運用されていました。 その物理マシンにはバッテリーバックアップ付きの RAID ボードが載っていてそれなりの IOPS が出るんですが、ログの増加に耐えきれず性能限界に達しようとしていました。

ueokande さんと一緒に作った新しいログ基盤では、一台の物理マシンにログを集約するのではなく、8台の Kafka ノードに分散してログを送信し、それを HBase に保存したり Presto で解析したりするようになっています。 Kafka は非常に高速で、ログ量がバーストしたときも楽々捌いていました。(昔のシステムではバーストがあると処理が追いつかず、大変なことになっていました)

ueokande さんによる詳しい解説記事: http://blog.cybozu.io/entry/2018/03/19/080000

Kafka を運用にのせるまで

Kafka を運用にのせるのは、簡単ではありませんでした。特に困ったのはドキュメントの不足でした。

Kafka の情報は当時公式ドキュメントぐらいしかなく、それだけでは不明な点がいろいろありました。 例えば、Kafka Broker の設定項目として、num.partitions という設定項目があるのですが、ドキュメントには「The default number of log partitions per topic」としか書いてありません。この値をどう決めるのがよいのでしょうか?

Consumer を書くときも、公式ドキュメントだけでは心もとないものがあります。 我々のログ基盤はログの at-least-once を保証するという要件があります。 Broker や Consumer が at-least-once を満たすように設定したりライブラリを利用したりしないといけないのですが、どのオプションをつけてどのようにメソッドを呼べばよいのでしょうか?

また、Kafka の内部の仕組みについての解説もあまり見当たりませんでした。 特に、Kafka が障害時にどのように振る舞うかの情報は公式ドキュメントにはほとんど書いてありません。 内部事情がよくわからないので、障害対応時にログに書かれている内容の意味が理解できずに困ったりしました。

Kafka 本を読みましょう!

ログ基盤プロジェクトをやっていた当時は本当に情報がなく、実験してみたりソースコードを読んだりしないといけませんでしが、Kafka 本が状況を変えてくれました。 上で挙げた疑問にはすべてこの本が答えてくれます:

  • num.partitions を決めるときに何を考慮すべきかは2章に書いてあります。また、num.partitions だけでなく多くの基本的な設定に関してそれが何なのか、その設定値を増やしたり減らしたりしたときにどのようなトレードオフがあるのか等が簡潔に書いてあり、とても参考になります。
  • at-least-once を保証するログ転送を作りたければ6章を読みましょう。公式ドキュメントでは断片的にしか書かれていなかった信頼性のあるデータ配信の方法が一箇所にまとめて書いてあります。いろいろ罠があるので at-least-once が必要な人は必ず読んでおいたほうがいいです。
  • Kafka のログの意味がわからなくて困ったら5章を読みましょう。リーダーエレクションがどのように動くのか、パーティションはどのように割り当てられるのか、インデックスとは何か、などを理解しておくと障害時にログを追うのが格段にやりやすくなるはずです。

Kafka はとにかく柔軟性が高く、何をやるにしても様々な選択肢があります。 しかし、要件に対して最適な選択肢を選ぶためには、Kafka の特性を理解して正しく Broker や Consumer を設定する必要があります。 Kafka は利用者に多くの知識を要求するシステムだと思います。

この本は、Kafka を本番環境で利用する人にとっては必読です。読みましょう!