アーキテクチャおよびプロジェクトプラットフォームOdnoklassniki

アーキテクチャおよびプロジェクトプラットフォーム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 .



! .



All Articles