「SLO サービスレベル目標」読書メモ①
こんにちは、Azukaritai の小松です。AzukaritaiのSREロールでは、四半期ごとにテーマを決めて、SREに関連する様々なトピックについてチームで学習を進めています。2023Q2は「SLO」に着目し、O'reillyから出ている「SLO サービスレベル目標」をみんなで読んで、SREのプラクティスの中でも特に重要なSLOについての理解を深めて、実践に繋げていけるようにしていこうとしています。
この記事では、この本を読み進める中で学んだことの記録を兼ねて、理解したことをまとめています。
全体としてかなり長く、それぞれの章ごとに、内容も濃いので、記事もいくつかに分けて発信していきたいと思います。この記事では、第1部のうち第1章と第2章にて書かれていることを扱います。
信頼性スタック - SLI / SLO / エラーバジェット
第1章で登場するのが、信頼性スタックという考え方です。この本の主題はSLO - サービスレベル目標なのですが、SLOだけでなく、SLOの基盤になるSLI - サービスレベル指標と、SLOをサービス運用上の意思決定に活用する仕組みのエラーバジェットも関連する重要なアイデアとして説明されています。
信頼性スタック(SLI, SLO, エラーバジェットのセット)は、システムの信頼性を数値化して評価できるようにし、その目標水準を「適切に」設定し(つまり必要十分な信頼性の水準を明確にする)、その水準を達成できているかどうかによって、機能追加などのリスクがあるがシステムの価値を高める変更を行うか、あるいはリスクを取らずに、ユーザーが「信頼できる」と考えられる状況を達成するための施策を優先するかの意思決定を適切に行えるようにするアイデアです。
「スタック」と呼ばれる理由は、エラーバジェットはSLOが存在する上で機能し、SLOは、SLIの指標に対して設定される目標であるという明確な依存関係があることに依ります。逆に、全ての基礎となるSLIは非常に重要で、ユーザーにとっての「信頼性」を効果的に、適切に表現できる指標としてSLIを開発し設定できるかどうかが、SLOやエラーバジェットが有効に機能するかを左右することになります。
信頼性とは / 信頼性工学
SRE - Site Reliability Engineering の「Reliability」がつまり「信頼性」なのですが、信頼性という概念についてもこの本の中で丁寧に説明されています。なんとなく、信頼性=可用性、つまりどれだけの期間、サービスが利用できる状態か、であると漠然と考えがちでしたが、この本の説明を読んで、もっと奥の深い概念であることを理解できました。
第2章に、システムの信頼性とは、「ユーザーが必要とする動作をシステムが実行すること」と、信頼性工学において定義されていると書かれています。私が、ここで面白いなと思ったのが「ユーザーが必要とする」というところで、これは「ユーザーが期待する」とも読み替えられるのですが、いくら、システムを提供する側が「このシステムはこういう動作をするのが正しい挙動である」と考えていたとしても、それがユーザーに伝わっておらず、ユーザーが別の期待をするような状況があり、その期待した動作をシステムがしない状況があれば、それは「信頼性がある」とは言えないということになります。
では、その「必要とする動作」あるいは「期待する動作」はどのように形成されるのか、仮に、ユーザーとの間で、システムの動作、その水準について明確に記述された文書があり、それをユーザーが理解できる形で共有されていれば、それが期待となる可能性が高いと言えると思われるのですが、それ以上に強いものとして、本書の中で記述されているのが「暗黙の合意」です。「サービスが一定のレベルで一定の時間にわたって動作し続けている場合、ユーザーはこれをサービスとの合意事項であると捉えます。」と書かれています。これは、「人は同じことが継続することを期待する」という習性に起因するものでありつつ、正直で自然なものなんだと思います。
この本の中で、あるいは他のSRE関連の本でも何度も口を酸っぱくして言われていることとして「100%の信頼性は不可能であり、不要である」ということです。あるいは単に信頼性にはコストがかかり、必要以上に高い信頼性を実現するのには、不必要なコストをかけることになり、有害であるということでもあったりします。このことは、何度も強調されており、それは、「信頼性は高ければ高いほど良い」という世間一般の、あるいは経営陣などの上層部が考えがちの、考え方に対して、しっかりと対抗できるようにすることが非常に重要であるという考えがあるように思えます。
では、どの程度の信頼性を目指すことが最適なのか、つまりSLOとしてどの程度の水準を目指すべきなのか、それについては単純明快な答えは存在せず、状況に依るということになるわけなのですが、SLOやエラーバジェットの考え方として、不必要な信頼性を排除して、リスクを取れるようにし、効率化、システムへの機能追加などの提供価値拡大を図り、それが結果としてユーザーへの価値還元となり、その最大化を図ることが、ビジネス、あるいは組織の成長の最大化につながる、という考えが根底にあるような気がしています。(Googleの)