約束どおり、英語の
テクノブログEvernoteからいくつかの投稿を翻訳し始めました。そこでは、エンジニアと開発者がサービスの技術的な実装の詳細について話し、ストーリーと彼らの仕事の興味深い事実を共有します。
今日は、サービスの構造の一般的な考え方からEvernoteアーキテクチャのレビューを始めたいと思います。 これで、各コンポーネントの詳細については説明しませんが、今後の投稿のために残しておきます。
上記のスキームから始めましょう。 そこに示されているすべての統計は2011年5月17日に提供されています。
ネットワーク: Evernoteとの間のほとんどすべてのトラフィックは、HTTPSポート443経由で
www.evernote.comに送られます。これには、すべての「Webアクティビティ」と、
ThriftベースのAPIを介したすべてのソフトウェアクライアントとの同期が含まれます。 合計で、1日あたり約1億5千万のHTTPSリクエストが生成され、ピーク時のトラフィックは約250メガビット/秒です。 毎日のピークは太平洋時間の午前6時30分頃に発生するため、管理者の夜間のシフトはこの状況に特に「喜んで」います。
BGPを使用して、プライマリ(
NTT )および追加(
レベル3 )プロバイダーによって提供される完全に独立したチャネルのネットワークを介してトラフィックを直接送信します。 古いバランサーのSSLパフォーマンス制限に達した1月にインストールした
A10ロードバランサーへの途中で、Vyattaを介してフィルタリングされます。 1台の
AX 2500とフェールセーフサーバーを使用して既存のトラフィックを処理することは非常に便利ですが、将来の成長に備えてクラスターを作成するときにN + 1構成をテストする準備をしています。
シャード: Evernoteサービスの中核はサーバーファームであり、これをシャードと呼びます。 各シャードは、100,000人のEvernoteユーザーのコホートのすべてのデータとすべてのトラフィック(WebおよびAPI)を処理します。 すでに900万人を超えるユーザーがいるため、約90個のシャードを取得します。
各シャードは、Intelデュアルコアプロセッサ、巨大なRAM、ミラー化されたRAIDアレイで構成された完全に詰まった
Seagate産業用ドライブを備えた
SuperMicroサーバーのペアです。 各サーバーのヘッドには、一対の
Xen仮想マシンを管理する
Debianホストがあり
ます 。 次の一連のアプリケーションのコアがメイン仮想マシンで起動されます:Debian +
Java 6 +
Tomcat +
Hibernate +
Ehcache +
Stripes +
GWT +
MySQL (メタデータ用)+階層ローカルファイルシステム(ファイルデータ用)。
あるサーバーのメイン仮想マシンのすべてのユーザーデータは、
DRBDを使用して別のサーバーの追加マシンに同期的に複製され
ます 。 つまり、ユーザーデータの各バイトは、物理的に2つの異なるサーバーにある少なくとも4つの異なる産業用ドライブに保存されます。 さらに、夜間バックアップを追加します。 サーバーに問題がある場合は、
Heartbeatを使用して、ダウンタイムを最小限に抑えて、メインの仮想マシンから別のサーバーにある追加の仮想マシンに作業を転送できます。
各ユーザーのデータはシャードの1つの(仮想)ホストに完全にローカルに保存されるため、ファームの残りの状況に関係なく、各シャードを実質的に干渉することなく独立したアイランドとして実行できます。 また、1つのシャードの問題が他のシャードの作業に影響しないことも意味します。
ユーザーをシャードに送信する作業の大部分は、ロードバランサーによって説明されます。ロードバランサーは、URLやCookieを使用してシャードを見つけるための一連の指示を持っています。
UserStore:すべてのデータの大部分は論理的に独立したシャード(「NoteStore」)に格納されますが、それらはすべて、ユーザー名、MD5関数などの各アカウントに関する少量の情報を持つアカウント「UserStore」(MySQLでも機能)の単一のデータベースに関連付けられていますパスワードとユーザーのシャードID。 このデータベースはRAMに収まるほど小さいですが、セカンダリバックアップと夜間バックアップ用にミラーRAIDとDRBDレプリケーションを同様に組み合わせた同じ信頼性の高いバックアップも提供します。
画像認識ファーム:メモ内の画像内の単語を検索できるように、8コアプロセッサを毎日使用して新しい画像を処理する28台のサーバーのプールを割り当てました。 忙しい日には、フローは130万または140万の個別の画像に達する可能性があります。 現在、そこではLinuxとWindowsの組み合わせが使用されていますが、先日、Debianへの移行を完了して不要な依存関係を取り除く予定です。
これらのサーバーは、AIR(「Advanced Imaging and Recognition」)と呼ばれる認識プロセスを提供します。 そのためのソフトウェアは、R&Dチームによって開発されました。 このソフトウェアは各画像を処理し、テキストを含む領域を特定し、仮定のセットを生成する「認識エンジン」を使用して、各単語の可能な一致の重み付きリストをコンパイルしようとします。 この作業では、AIRに特化した私たちのチームが開発したメカニズム(手書き認識など)と、業界で最高の発展を遂げた商業パートナーからのライセンス技術の両方を使用します。
その他のサービス:上記のサーバーはすべて、カリフォルニア州サンタクララのデータセンターのラックにペアで設置されています。 サービスの基本操作を提供するハードウェアに加えて、1つまたは2つのXenサーバーまたは仮想マシンを必要とする簡単なタスクのための小さなサーバーグループもあります。 たとえば、着信メールに対するSMTPゲートウェイの動作は、
Postfixと
Dwarfの上にインストールされたJavaで書かれた特別なメールプロセッサを備えたDebianサーバーのペアによって提供されます。
@myenを使用してアカウントにメモを送信するためのTwitterゲートウェイは、
twitter4jを使用する小さなスクリプト
です 。
私たちの企業のウェブサイトは
Apache 、ブログは
WordPressを使用してい
ます 。 当社の内部冗長トポロジのほとんどは、HP製品によって提供されます。 構成管理には
Puppetを使用し、監視には
Zabbix 、
Opsviewおよび
AlertSiteを使用します。 夜間バックアップは、専用のギガビットチャネルを介してバックアップデータセンターにデータを転送するさまざまなソフトウェアの組み合わせによって提供されます。
なんで? この投稿では、さまざまな状況でYではなくXを選択した理由について多くの明白な疑問が生じることを理解しています。 クラウドプロバイダーのサービスを使用する代わりに、独自のサーバーを選択したのはなぜですか? 最新のレシピを適用するのではなく、なぜ古いソフトウェア(Java、SQL、ローカルストレージなど)を好んだのですか?
今後数か月以内に、これらの質問にさらに詳細に答えようとします。