Googleの本番環境を稼働させる:Googleのサイト信頼性エンジニアリングチームがGoをどのように利用しているか

Google Site Reliability Engineering (SRE)

Googleは、ごく少数の非常に大規模なサービスを運営しています。これらのサービスは、開発者が必要とするすべてのもの(ストレージシステム、ロードバランサー、ネットワーク、ロギング、モニタリングなど)を網羅したグローバルインフラストラクチャによって支えられています。それにもかかわらず、それは静的なシステムではなく、そうであってはなりません。アーキテクチャは進化し、新しい製品やアイデアが生まれ、新しいバージョンをロールアウトする必要があり、構成をプッシュし、データベーススキーマを更新する必要があります。その結果、1秒間に数十回もシステムに変更をデプロイしています。

この規模と信頼性に対する重大なニーズから、Googleはサイト信頼性エンジニアリング(SRE)を先駆的に導入しました。SREは、多くの企業がその後採用している役割です。「SREとは、運用をソフトウェアの問題として扱うときに得られるものです。私たちのミッションは、Googleのすべての公共サービスの背後にあるソフトウェアとシステムを、可用性、レイテンシ、パフォーマンス、およびキャパシティを常に監視しながら、保護し、提供し、進歩させることです。」— サイト信頼性エンジニアリング(SRE)

「Goは、他のどの言語(PythonとC ++)も提供できなかった、パフォーマンスと可読性の間のスイートスポットを約束しました。」

2013〜2014年に、GoogleのSREチームは、本番環境管理に対する当社のアプローチが、多くの点で以前ほど有効ではなくなっていることに気づきました。シェルスクリプトからは大きく進歩していましたが、当社の規模にはあまりにも多くの可動部分と複雑さがあり、新しいアプローチが必要でした。私たちは、「Prodspec」と呼ばれる本番環境の宣言モデルに移行し、「アニーリング」と呼ばれる専用のコントロールプレーンを推進する必要があると判断しました。

これらのプロジェクトを開始したとき、GoはGoogleの重要なサービスにとって実現可能な選択肢になり始めたばかりでした。ほとんどのエンジニアはPythonとC ++により精通しており、どちらも有効な選択肢でした。それにもかかわらず、Goは私たちの関心を引きました。斬新さへの魅力は確かに要因の1つでした。しかし、さらに重要なことに、Goは、他のどの言語も提供できなかった、パフォーマンスと可読性の間のスイートスポットを約束しました。私たちは、アニーリングとProdspecのいくつかの初期部分でGoを使った小規模な実験を開始しました。プロジェクトが進むにつれて、Goで書かれたこれらの初期の部分が中核にあることに気づきました。私たちはGoに満足していました。そのシンプルさは私たちにとって好ましいものであり、パフォーマンスはそこにあり、同時実行プリミティブは代替が困難だったでしょう。

「現在、Googleの本番環境の大部分は、Goで記述されたシステムによって管理および維持されています。」

Goを使用するようにという義務や要件は一切ありませんでしたが、PythonやC ++に戻ることは望んでいませんでした。GoはアニーリングとProdspecで有機的に成長しました。それは正しい選択であり、したがって現在では私たちの選択する言語です。現在、Googleの本番環境の大部分は、Goで記述されたシステムによって管理および維持されています。

これらのプロジェクトでシンプルな言語を持つことの力は、どれほど強調してもしすぎることはありません。いくつかの機能が実際に欠落している場合(たとえば、いくつかの複雑な構造をコード内で変更しないように強制する機能)がありました。しかし、それらのケースのそれぞれについて、シンプルさが役立ったケースが数十から数百件あったことは間違いありません。

「Goのシンプルさは、コードがレビュー中にバグを見つけたり、サービスの中断中に実際に何が起こったかを判断しようとしたりする場合でも、簡単に追跡できることを意味します。」

たとえば、アニーリングはさまざまなチームやサービスに影響を与えるため、社内全体の貢献に大きく依存していました。Goのシンプルさにより、チーム外の人が、特定の部分が自分たちにとって機能しない理由を理解し、修正や機能を自分自身で提供することが可能になりました。これにより、私たちは急速に成長することができました。

Prodspecとアニーリングは、非常に重要なコンポーネントを担当しています。Goのシンプルさは、コードがレビュー中にバグを見つけたり、サービスの中断中に実際に何が起こったかを判断しようとしたりする場合でも、簡単に追跡できることを意味します。

Goのパフォーマンスと同時実行のサポートも、私たちの仕事にとって非常に重要です。本番環境のモデルは宣言型であるため、本番環境がどのようなものであるか、またどのようなものであるべきかを記述する構造化されたデータを大量に操作する傾向があります。大規模なサービスがあるため、データは大きくなる可能性があり、多くの場合、純粋なシーケンシャル処理では十分に効率的ではありません。

私たちはこのデータをさまざまな方法や場所で操作しています。それは、頭の良い人がアルゴリズムの並列バージョンを考え出すことではありません。それは、カジュアルな並列処理、次のボトルネックを見つけてそのコードセクションを並列化することです。そして、Goはまさにそれを可能にします。

Goでの成功の結果として、現在ではProdspecとアニーリングのすべての新しい開発にGoを使用しています。

サイト信頼性エンジニアリングチームに加えて、Google全体のエンジニアリングチームも開発プロセスにGoを採用しています。Core Data SolutionsFirebase Hosting、およびChromeチームがGoを使用して、大規模で高速かつ信頼性が高く効率的なソフトウェアを構築する方法についてお読みください。

Google Site Reliability Engineering (SRE) Google Site Reliability Engineering (SRE)

Googleサイト信頼性エンジニアリング(SRE)について

Googleのサイト信頼性エンジニアリングチームのミッションは、Google検索、広告、Gmail、Android、YouTube、App Engineなど、Googleのすべての公共サービスの背後にあるソフトウェアとシステムを、可用性、レイテンシ、パフォーマンス、およびキャパシティを常に監視しながら、保護し、提供し、進歩させることです。

彼らは、PythonとC ++の経験から得られたGoを使用したコア本番環境管理システムの構築経験を共有しました。