[読書メモ] Site Reliability Engineering
オンラインで読める
You don’t need to read in any particular order, though we’d suggest at least starting with Chapters The Production Environment at Google, from the Viewpoint of an SRE and Embracing Risk, which describe Google’s production environment and outline how SRE approaches risk, respectively.
らしいので、chaper2,3から読むのが良さそう
Chapter 2 - The Production Environment at Google, from the Viewpoint of an SRE
Google固有の話だったので、あんまり読む必要ない
Chapter 3 - Embracing Risk
Site Reliability Engineering seeks to balance the risk of unavailability with the goals of rapid innovation and efficient service operations, so that users’ overall happiness—with features, service, and performance—is optimized.
Q.どうやって?
A. SLIs, SLOs, and Error Budgetsを決める
Managing Risk
- The cost of redundant machine/compute resources
- The opportunity cost
Measuring Service Risk
- time base avaiability
- aggregate availability
In many cases, however, availability calculated as the request success rate over all requests is a reasonable approximation of unplanned downtime, as viewed from the end-user perspective.
Risk Tolerance of Services
- 自分が扱っているサービスのユーザー数、DAUなど調べる必要あり。
Identifying the Risk Tolerance of Consumer Services
そのままコピペした。
There are many factors to consider when assessing the risk tolerance of services, such as the following:
- What level of availability is required?
- Do different types of failures have different effects on the service?
- How can we use the service cost to help locate a service on the risk continuum?
- What other service metrics are important to take into account?
The target level of availability for a given Google service usually depends on the function it provides and how the service is positioned in the marketplace. The following list includes issues to consider:
- What level of service will the users expect?
- Does this service tie directly to revenue (either our revenue, or our customers’ revenue)?
- Is this a paid service, or is it free?
- If there are competitors in the marketplace, what level of service do those competitors provide?
- Is this service targeted at consumers, or at enterprises?
この辺りを1から考えるのめんどいので、 質問に回答すれば、SLOとかSLIを決めてくれるようなサービスがあればいい。
質問用意するのが面倒そう。
Motivation for Error Budgets
Error Budgets
- ユーザーが不満を感じ始めるまでの一定の期間にサービスで累積できるエラーの量
- 開発チームと運用チームの対立を避けるため
計算してみる
例えば、
- 毎月バックアップが必要なDBがある。
- 1回につき、2hダウンする
- 全てのユーザーに影響する
→120 min * 12 monthes * 100% of users = 1440 bad mins / year
ここで、サービスのSLAとして、99.5%のアップタイムを定義している場合、
(100 - 99.5) / 100 * 365 days/year * 24 hours/day * 60 mins/hour = 2628 mins / year
のエラーバジェットがあることになる。
Q. エラーバジェットなくなったら?
When an SRE team lacks an error budget, the situation becomes more challenging, as there is no clear margin for allowable failures. This means that the team must focus even more on reliability and risk mitigation. Here’s how to approach this scenario:
1. Prioritize Reliability Over New Features
- Focus on Stability: With no error budget, prioritize tasks that improve system stability, such as fixing bugs, addressing technical debt, and enhancing monitoring.
- Limit Changes: Be conservative with deploying new features or changes. Implement stricter change management processes to ensure any new code is thoroughly tested and low-risk.
2. Enhance Monitoring and Observability
- Real-Time Monitoring: Ensure that your monitoring and alerting systems are highly sensitive and can detect issues as early as possible.
- Advanced Observability: Invest in observability tools that provide deep insights into system performance and can help identify potential issues before they impact users.
3. Implement Rigorous Testing
- Extensive Testing: Increase the rigor of testing processes, including unit tests, integration tests, and end-to-end tests. Focus on testing edge cases and potential failure scenarios.
- Chaos Engineering: Consider implementing chaos engineering practices to identify weaknesses and improve system resilience without causing significant impact.
4. Strengthen Incident Response
- Proactive Incident Management: Ensure that the incident response process is robust, with clear protocols for quickly identifying, escalating, and resolving issues.
- On-Call Optimization: Optimize on-call rotations to ensure that the most experienced engineers are available to handle potential incidents, reducing the time to resolution.
5. Increase Collaboration and Communication
- Cross-Team Collaboration: Work closely with development teams to ensure that any changes are made with reliability in mind. Encourage a culture where reliability is a shared responsibility.
- Stakeholder Communication: Regularly update stakeholders on the current reliability status and the steps being taken to improve it. Transparency helps manage expectations and prioritize efforts.
6. Evaluate and Improve Existing Infrastructure
- Infrastructure Hardening: Review the current infrastructure for vulnerabilities or areas of weakness. Invest in improvements such as better redundancy, scaling capabilities, and fault tolerance.
- Capacity Planning: Reassess capacity needs to ensure that the system can handle unexpected load spikes or failures without degradation.
7. Conduct Postmortems on Near Misses
- Learning from Near Misses: Even if no incidents occur, conduct postmortems on any near misses or close calls to identify potential issues and prevent future failures.
- Root Cause Analysis: Deeply analyze any anomalies or minor issues to understand their root causes and implement preventive measures.
8. Plan for Error Budget Recovery
- Strategic Recovery: If possible, work on initiatives that could allow the system to recover some level of error budget, such as improving SLIs or tightening SLOs temporarily.
- Gradual Improvements: Implement small, incremental changes that improve reliability without introducing significant risk, gradually restoring confidence in the system.
9. Educate and Advocate for Error Budgets
- Internal Advocacy: Educate stakeholders on the importance of error budgets and advocate for their reintroduction. Emphasize how error budgets help balance innovation and reliability.
- Long-Term Planning: Work towards re-establishing an error budget as part of the long-term strategy. Highlight the risks of operating without one and the potential impact on innovation and system reliability.
10. Document and Reassess Regularly
- Document Everything: Keep detailed records of decisions, incidents, and changes made during this period. This documentation will be invaluable when reassessing and recalibrating SLIs/SLOs later.
- Continuous Reassessment: Regularly reassess the system's state and adjust your approach as necessary, particularly if conditions improve or if you are able to regain an error budget.
In the absence of an error budget, the SRE team's primary focus should be on maintaining and enhancing system reliability while minimizing changes that could introduce risk. This requires a careful, measured approach and close collaboration with other teams to ensure that any changes made are low-risk and well-understood.
Chapter 4 - Service Level Objectives
こっちの方がわかりやすいかも
Service Level Terminology
Indicators in Practice
- What Do You and Your Users Care About?
- システムが大切にしていることを洗い出す。
- 大抵は何らかの割合(例:成功リクエストの割合)
- Collecting Indicators
- DatadogとかPrometheus使う。クライアント側での収集も忘れずに。
- Aggregation
- 平均ではなく分布で考える。
- %ile使う
- 99.9%ileでOK→いけるっしょ
-
Standardize Indicators
- これが重要そう。テンプレ作っていろんなサービスで使い回す。
- Terraformで管理できそう。
Objectives in Practice
- Defining Objectives
- SLIに対して期間と目標値を設けたもの
- SLOが100%満たされている→保守的すぎるかも
- エラーバジェットとのギャップを見るべき
- エラーバジェットがどれくらい減っている状態がベストなのか?
- Choosing Targets
- SLOを決めることは、技術的な活動にとどまらない。ビジネス要件も念頭に入れるべき。
- Don’t pick a target based on current performance
- Keep it simple
- Avoid absolutes
- Have as few SLOs as possible
- Perfection can wait
- 緩めの目標→厳し目にしていく
- Control Measures
-
- システムのSLIを監視し測定する。
-
- SLIとSLOを比較し、対策が必要かどうかを判断する。
-
- 対策が必要な場合は、目標を達成するために何が必要かを把握する。
-
- その行動を起こそう。
-
- SLOs Set Expectations
- 期待値を設定→定期的に見直す。
- Keep a safety margin
- 一般ユーザー向けの SLOよりもタイトな内部向けSLOを使用する
- Don’t overachieve
Agreements in Practice
- SRE の役割は、SLA に含まれる SLO を満たす可能性と難易度を理解する手助けをすること。
実践的な話はこちらが参考になる。
Chapter 5 - Eliminating Toil
要約
Summary of Toil in SRE
-
Toil Definition: Manual, repetitive, automatable work with no long-term value that scales with service growth. It's different from "overhead" tasks like emails or meetings.
-
Examples:
- Manual interventions to keep services running.
- Pager alerts, which are reactive and almost always toil.
-
Automation:
- Automating repetitive tasks reduces toil, but if manual intervention is still needed, it remains toil.
- Automation that eliminates future manual work is valuable and not considered toil.
-
When to Automate:
- Automate tasks that occur frequently enough to justify the effort.
- Infrequent tasks might not be worth automating if the effort is too high.
-
Measuring Toil:
- Tracked during on-call periods and assessed via quarterly surveys to determine time spent on toil and areas for reduction.
-
Managing Toil:
- Aim to keep toil between 30% and 50% of an SRE’s time, with the rest spent on engineering work that reduces future toil.
-
Value of Toil:
- Some toil is useful for training new team members, but excessive focus on toil can lead to career stagnation.
-
Toil and DevOps:
- Toil budgets help ensure a balance between maintaining and improving systems, supporting DevOps principles like measurement, and reducing organizational silence.
- What % of resources should be spent on toil reduction?
- max: 50%
- How to measure?
- introduce tracking tool
Chapter 6 - Monitoring Distributed Systems
要約
Key Concepts:
-
Monitoring: This involves collecting and processing real-time data about system performance, including metrics like query counts, error rates, and processing times. Monitoring can be categorized into two types:
- White-box monitoring: Based on internal system metrics.
- Black-box monitoring: Focuses on externally visible behavior from a user's perspective.
-
Alerting: Alerts are notifications intended to inform human operators about issues that need immediate attention. Effective alerting minimizes noise and ensures that only actionable issues trigger alerts.
-
Root Cause Analysis: It’s important to identify the root cause of issues to prevent them from recurring. The root cause could be a defect in software, processes, or even human error.
-
The Four Golden Signals: These are essential metrics that every system should monitor:
- Latency: Time taken to service a request.
- Traffic: Volume of demand placed on the system.
- Errors: Rate of failed requests.
- Saturation: How "full" the system is, indicating resource utilization.
-
Symptom vs. Cause: The distinction between symptoms (what’s broken) and causes (why it’s broken) is crucial in monitoring. White-box monitoring often helps in identifying causes, while black-box monitoring is more symptom-focused.
-
Best Practices:
- Monitoring systems should be simple and robust.
- Alerts should only be triggered by conditions that are urgent, actionable, and user-visible.
- Avoid complex dependency hierarchies in alerting rules to prevent unnecessary alerts.
- Design monitoring systems with long-term goals in mind, understanding that systems evolve.
-
Case Studies:
- Bigtable SRE: This example illustrates the dangers of over-alerting, where too many non-urgent alerts led to alert fatigue. The solution involved refining alerting rules and focusing on improving the underlying system performance.
Practical Applications:
For someone working in SRE or planning to build monitoring systems, this chapter emphasizes the importance of simplicity, focusing on the most critical metrics, and ensuring that alerts are meaningful and actionable. It also encourages continuous improvement and adaptation of monitoring systems to meet evolving needs.
This philosophy aligns well with your goals of gaining SRE experience, focusing on monitoring, alerting, and incident response, as well as understanding the broader infrastructure and dependencies within a system. Integrating these principles into your work can help you build more effective and reliable monitoring systems, and improve your ability to respond to incidents in a timely and efficient manner.
Q. モニタリングはいつ実装すべき? プロダクト開発の前半?後半?
Q. モニタリングの実装で注意すべきポイントは?
-
適切にサンプリングする
-
できるだけシンプルに
- 実際のインシデントを最も頻繁に捕捉するルールは、可能な限りシンプルで、予測可能で、信頼できるものであるべきです。
- 滅多に実行されないデータ収集、集計、アラート設定(例えば、一部の SRE チームでは四半期に 1 回以下)は、削除の対象とすべきである。
- 収集されたものの、ダッシュボードで公開されず、アラートでも使用されないシグナルは、削除の候補となります。
Q. 最低限取るべきメトリクスは?
- latency
- traffic(throughput)
Q. DatadogとPrometheusの使い分け?
Q. モニタリング関連のツールまとめ
感想メモ
- SRE思ったより多い。
Even with substantial existing infrastructure for instrumentation, collection, display, and alerting in place, a Google SRE team with 10–12 members typically has one or sometimes two members whose primary assignment is to build and maintain monitoring systems for their service.
Chapter 7 - The Evolution of Automation at Google
自動頑張りましょ的なやつ。飛ばした。
Chapter 8 - Release Engineering
リリースエンジニア
- 初めて知ったポジション
- SREの仕事の一部としてみんな意識せずにやってる。
Chapter 9 - Simplicity
such as scrutinizing code to make sure that it actually drives business goals, routinely removing dead code, and building bloat detection into all levels of testing.
いいアイデア。
The "Negative Lines of Code" Metric
The term "software bloat" was coined to describe the tendency of software to become slower and bigger over time as a result of a constant stream of additional features. While bloated software seems intuitively undesirable, its negative aspects become even more clear when considered from the SRE perspective: every line of code changed or added to a project creates the potential for introducing new defects and bugs. A smaller project is easier to understand, easier to test, and frequently has fewer defects. Bearing this perspective in mind, we should perhaps entertain reservations when we have the urge to add new features to a project. Some of the most satisfying coding I’ve ever done was deleting thousands of lines of code at a time when it was no longer useful.
不要なコードは消しましょ。
Q. 使われてないコードを検出できる?
静的解析でできそう。
Chapter 10 - Practical Alerting
ん〜〜。。大部分がGoogleではこうやっているよ!ていう話。
Even though Borgmon remains internal to Google, the idea of treating time-series data as a data source for generating alerts is now accessible to everyone through those open source tools like Prometheus, Riemann, Heka, and Bosun, and probably others by the time you read this.
他の記事読んだ方が良さげ。
the cost of maintenance must scale sublinearly with the growth of the service
サービスのスケールに合わせて、メンテが増える状況を避けたい。
→ 適切なモニタリングして、備えましょう。
- incident response
- performance analysis
- capacity planning
- failure detection
The timeseries arena
PrometheusとかDatadogではこんな感じのデータ構造でデータが保存されている。
Chapter 11 - Being On-Call
Balanced On-Call
SREチームにおけるオンコール業務は、量と質のバランスが重要です。オンコールの「量」は、エンジニアがオンコール業務に費やす時間の割合で測定され、「質」はシフト中に発生するインシデントの数で評価されます。SREマネージャーは、この二つの軸で業務量をバランスよく持続可能に保つ責任があります。
量のバランス
SREチームでは、少なくとも50%の時間をエンジニアリング業務に費やし、オンコールは25%までに抑えます。24時間365日のオンコール体制を維持するには、シングルサイトの場合、最低でも8人のエンジニアが必要です。2人のオンコール担当(プライマリとセカンダリ)が週交代で回るためです。複数の拠点にまたがるチームでは、6人が最低人数とされます。また、「夜間シフト」は健康に悪影響を与えるため、複数拠点を使った「追随型ローテーション」により夜間シフトを避けるのが理想的です。
質のバランス
1回のオンコールシフト(12時間の場合)でエンジニアが対応するインシデントの最大数は1日2件までとしています。1件のインシデントの対応には、根本原因の分析、対処、ポストモーテム作成などで約6時間かかるためです。インシデントがこれを超える場合は、運用負荷が持続可能な状態に戻るように調整が必要です。
報酬
オンコール業務に対しては、時間外対応のための適切な報酬が考慮されるべきです。Googleでは、代休または給与での補償が提供され、オンコール業務に対するインセンティブを確保しつつ、過剰な業務による燃え尽き症候群やプロジェクト作業時間の不足を防ぐ仕組みを設けています。
このように、オンコール業務のバランスを保つことは、システムの信頼性を維持しつつ、エンジニアの健康と効率を守るために重要です。
Feeling Safe
SREチームは、Googleの重要なシステムをサポートしており、オンコール業務は高い責任を伴います。エンジニアがインシデント対応で合理的かつ計画的な思考を維持できるよう、オンコール中のストレスを軽減することが重要です。過度なストレスは誤った判断を招き、システムの可用性に影響を与える可能性があります。
オンコール中のエンジニアは、ヒューリスティックス(直感的な判断)に頼る誘惑に駆られがちですが、合理的でデータに基づいた判断が必要です。迅速な対応も重要ですが、データをしっかりと確認し、前提を批判的に検証する姿勢が求められます。
SREは、エスカレーション経路や明確なインシデント管理手順、非難しない事後処理文化といったリソースを活用できます。インシデントの複雑さに応じて、正式なインシデント管理プロトコルを使用し、他チームと連携することが可能です。
インシデント後は、事後報告書を作成し、システム的な問題を特定して対策を講じます。個人を責めるのではなく、インシデントから価値ある教訓を引き出し、今後の自動化やエラー防止につなげることが大切です。
最も重要なオンコールリソース
- 明確なエスカレーション経路
- 明確に定義されたインシデント管理手順
- 責任のない事後処理文化
Avoiding Inappropriate Operational Load
オペレーショナル・オーバーロード(過負荷)
SREチームは、業務負荷が50%を超えないよう四半期ごとに具体的な目標を設定します。必要に応じて、他の経験豊富なSREを一時的に派遣することで支援することも可能です。監視の誤設定が原因であることが多く、不要なアラートは削減し、効果的な対応ができるようにする必要があります。
アラートの管理
一つのインシデントで複数のアラートが発生することがあり、これによりオペレーターが混乱することがあります。関連するアラートをまとめ、不要なアラートを抑制(アラート/インシデントの比率1:1)することで、効率的にインシデントに対応できるようにします。
開発チームとの連携
場合によっては、アプリケーションの変更がシステムの信頼性を損なうことがあります。この場合、SREと開発チームが協力して、システムの改善を目指す必要があります。最悪の場合、SREチームは開発チームにオンコールの責任を一時的に戻すことも可能ですが、通常は協力して負荷を軽減します。
オペレーショナル・アンダーロード(業務負荷不足)
業務が少なすぎる場合も問題です。SREがプロダクションから長期間離れると、知識や自信に問題が生じることがあります。これを避けるため、定期的にオンコールに入る機会を設け、訓練やシミュレーションを通じてスキルを維持することが重要です。