アーキテクチャおよびプロジェクトプラットフォームOdnoklassniki
この投稿では、高負荷のプロジェクトを維持する上で5年以上にわたって蓄積された経験について説明します。 仲間の開発者が、私たちが何をどのように、どのような問題や困難を抱え、どのようにそれらに対処するのかを知りたいと願っています。
基本的な統計
ピーク時に最大280万人のオンラインユーザー
1日あたり75億件のリクエスト(ピーク時に1秒あたり150,000件のリクエスト)
2,400台のサーバー、ストレージシステム
ラッシュアワーのネットワークトラフィック:32 Gb / s
建築
パフのアーキテクチャ:
•プレゼンテーション層(プレゼンテーション層、またはHTMLを形成する単純なWEBサーバー)
•ビジネスサービスレイヤー(データの選択と処理を提供するサーバー)
•キャッシングレイヤー(頻繁に使用されるデータのキャッシング)
•永続層(データベースサーバー)
•共通インフラストラクチャシステム(統計ロギングシステム、アプリケーション構成、リソースのローカリゼーション、監視)
プレゼンテーション層:
•独自のフレームワークを使用します。これにより、独自のGUIファクトリ(タイポグラフィ、リスト、テーブル、ポートレット)を使用してJAVA言語でページの構成を構築できます。
•ページ構成は独立したブロック(通常はポートレット)で構成され、AJAXリクエストを使用して画面の情報を部分的に更新できます。 このナビゲーションへのアプローチにより、一定のページのリロードを取り除くことができます。これにより、ユーザーは常に重要なサイト機能(メッセージ、ディスカッション、アラート)を利用できます。 JavaScriptを使用しない場合、GWTで記述された機能を除き、ページは完全に機能します。リンクをクリックすると、ページが完全に再描画されます。
•メッセージ、ディスカッション、アラートなどの機能コンポーネント、およびすべての動的部分(ショートカットメニュー、写真タグ、写真の並べ替え、ギフトローテーション)は、Google Web Toolkitフレームワークを使用して記述されています。
データの選択、処理、およびキャッシュ:
コードはJavaで記述されています。 例外があります-データをキャッシュするためのいくつかのモジュールはCおよびC ++で記述されています。
Javaは便利な開発言語であり、さまざまな分野の多くの基礎、ライブラリ、Javaのオープンソースプロジェクトだからです。
ビジネスロジックレベルでは、リモートインターフェイスを介して相互に通信する約25種類のサーバー/コンポーネントおよびキャッシュがあります。 毎秒、これらのモジュール間に約3,000,000のリモート要求があります。
odnoklassniki-cacheモジュールは、データのキャッシュに使用されます。 Java Unsafeを使用してデータをメモリに保存する機能を提供します。 頻繁にアクセスされるすべてのデータをキャッシュします。 例:ユーザープロファイル、ユーザーグループ、グループ自体に関する情報、もちろん、ユーザー関係のグラフ、ユーザーとグループの関係のグラフ、ユーザーの休日、写真に関するメタ情報など。
たとえば、ユーザー接続のグラフをキャッシュするサーバーの1つは、ラッシュアワー時に1秒あたり約16,600のリクエストを処理できます。 CPUは最大7%でビジーであり、5分間の最大負荷平均は1.2です。 グラフの頂点の数は85百万を超え、結合は25億(25億)です。 メモリでは、グラフは30 GBを占有します。
ロードバランシングとバランシング:
•システム内の加重ラウンドロビン。
•データベース内とキャッシュレベルの両方でのデータの垂直および水平分割。
•ビジネスロジックレベルのサーバーはグループに分割されます。 各グループは異なるイベントを処理します。 イベントをルーティングするメカニズムがあります。 任意のイベント(またはイベントのグループ)を選択して、特定のサーバーグループに処理するために送信できます。
サービス管理は、一元化された構成システムを通じて行われます。 システムは自己記述型です。 WEBインターフェースを介して、ポートレットの場所、クラスターの構成、一部のサービスのロジックなどを変更できます。 変更された構成はデータベースに保存されます。 各サーバーは、そのサーバーで実行されているアプリケーションの更新があるかどうかを定期的に確認します。 ある場合-それらを適用します。
データ、データベースサーバー、バックアップ:
冗長性のないデータの総量は160 TBです。 データの保存と提供には、MS SQLとBerkeleyDBの2つのソリューションが使用されます。 データは少なくとも2つのコピーに保存されます。 データのタイプに応じて、コピーは2〜4になります。 すべてのデータの毎日のバックアップがあります。 15分ごとに、蓄積されたデータのバックアップが作成されます。 このバックアップ戦略の結果、最大のデータ損失は15分です。
機器、データセンター、ネットワーク:
デュアルプロセッサ、4コアサーバーを使用。 メモリ容量は、機能に応じて4〜48 GBです。 データの種類と用途に応じて、サーバーのメモリ、サーバーのディスク、または外部ストレージシステムに保存されます。
すべての機器は3つのデータセンターにあります。 合計約2,400台のサーバーとストレージシステム。 データセンターは光リングに結合されます。 現時点では、各ルートの容量は30 Gb / sです。 各ルートは、物理的に互いに独立したファイバーペアで構成されています。 これらのペアは、ルートルータ上の共通の「パイプ」に集約されます。
ネットワークは内部と外部に分かれています。 ネットワークは物理的に分離されています。 異なるサーバーインターフェイスが異なるスイッチに接続され、異なるネットワークで動作します。 外部ネットワークWEBサーバーで、世界中と通信します。 内部ネットワークでは、すべてのサーバーが相互に通信します。
内部ネットワークのトポロジはスターです。 サーバーはL2スイッチ(アクセススイッチ)で接続されます。 これらのスイッチは、少なくとも2つのギガビットリンクによってルーターの集約スタックに接続されます。 各リンクは、スタック内の個別のスイッチに移動します。 このアーキテクチャが機能するために、 RSTPプロトコルを使用します。 必要に応じて、アクセススイッチは3つ以上のリンクによって集約スタックに接続されます。 次に、ポートのリンク集約を使用します。
集約スイッチは10Gbリンクでルートルーターに接続され、データセンター間の通信と外部との通信の両方を提供します。
シスコのスイッチとルーターを使用します。 外の世界と通信するために、いくつかの大手通信事業者と直接接続しています
ラッシュアワーネットワークトラフィック-32 Gb / s
統計システム:
イベントロギングを担当するライブラリがあります。 ライブラリはすべてのモジュールで使用されます。 統計を集計し、一時データベースに保存できます。 自身の保存は、log4jライブラリを使用して行われます。 通常、コール数、最大実行時間、最小実行時間、平均実行時間、実行中に発生したエラーの数を保存します。
一時データベースから、すべての統計はDWHに保存されます。 DWHサーバーは毎分、実稼働環境の一時的な拠点に行き、データを収集します。 一時データベースのデータは定期的に消去されます。
送信メッセージに関する統計を保存するサンプルコード:
public void sendMessage(String message) {
long startTime = LoggerUtil.getMeasureStartTime();
try {
/**
* business logic - send message
*/
LoggerUtil.operationSuccess(LogFactory.getLog({log's appender name}), startTime, "messageService", "sendMessage");
} catch (Exception e) {
LoggerUtil.operationFailure(LogFactory.getLog({log's appender name}), startTime, "messageService", "sendMessage");
}
}
DWH . Microsoft. – MS SQL 2008, – Reporting services. DWH – 13 , production . (.. ). . — 13 TB.
(multi-dimension) OLAP.
:
1.
2. (, )
. , DWH. , - .
, “” (, : CPU, RAM, ..), ( CPU, RAM, ..). “” Zabbix, Cacti.
, .
:
• : MS Windows, openSUSE
• Java, C, C+. Java. + .
• GWT WEB . GWT ,
• WEB – Apache Tomcat
• JBoss 4
• WEB – LVS. IPVS Layer-4
• Apache Lucene
• :
MS SQL 2005 Std edition. , . MS SQL failover . , standby
BerkeleyDB – BDB , . BDB, C , 4.5. master-slave . BDB . master, . tmpfs, transaction . 15 . .
. .
• , JBoss Remoting
• SQL JDBC
:
70 . 40 , 20 , 8 .
(1-3 ). - , . . , . , .
, . , ( , , ). , , , . – .
. 3- :
0 —
1 — ,
2 — pre-production , production
«». «» :
1. production
2. . ,
3. , . , , , , , 1-
Best practices, tricks & tips
:
• , , .. ( ), ( ). — .
• — . , 1 , , .
• JOIN CPU. JOIN . JOIN , .
• , . CPU .
• SQL DELETE — DML. — , .
• . , . .
:
• , Java. , , , .. .
• . .
• , , .
• , -, , , . map-reduce . , , C. .
• Java (off heap memory) Java GC.
• , .
• (Expires Cache-Control ). CSS JavaScript (gzip).
• HTTP , JavaScript CSS . .
• , .
• CSS . ( ).
• CSS expressions, «». .
• DOM , , reflow. DOM «».
• GWT UIBinder HTMLPanel .
! .