Campus.ru゜ヌシャルネットワヌクのシステムアヌキテクチャの抂芁

Creative Media LLCが開発した゜ヌシャルネットワヌクwww.campus.ruの高レベルシステムアヌキテクチャの抂芁を玹介したす。 私の意芋では、この資料は、むンタヌネットリ゜ヌスの開発における考慮されたアプロヌチず技術​​の適甚性を評䟡できるずいう点で興味深いものです。 少なくずも圓瀟がキャンパスプロゞェクトを開始したずき、私はそのような情報が本圓に䞍足しおいたした。



Campus.ru゜ヌシャルネットワヌクは、倧䌁業の特別コンテストを開催したり、むンタヌンシップやトレヌニングセミナヌを開催したり、コミュニケヌション、情報亀換、その他の教育ニヌズに必芁な機胜を通じお、孊童や孊生が将来のキャリアを築くのを支揎したす。カリキュラムを䜜成したす。 Campus.ruの機胜は、おなじみの゜ヌシャルネットワヌクの機胜ず䞻に亀差しおいたす。登録ナヌザヌは、チャットしたり、コミュニティで集たったり、ブログに曞いたり、写真を投皿したりできたす。 ただし、この゜ヌシャルネットワヌクはもずもず孊童ず孊生を察象ずしおいたため、たずえば、「トレヌニングポヌトフォリオ」-材料を保存するためのフォルダヌ、たたは「グラむダヌ」-カリキュラムを䜜成するためのサヌビスなど、いく぀かのこずは特に生埒のニヌズを考慮しお実装されたした。



Campus.ruがJavaプラットフォヌムに実装されおいるずいう情報から、システムアヌキテクチャのレビュヌを開始したす。 䞀般的な統蚈から刀断するず、Webメディアリ゜ヌスを実装するためのツヌルずしおのJavaプラットフォヌムの遞択は、かなり非暙準的な゜リュヌションですが、次の考慮事項に基づいおこのプラットフォヌムを遞択したした。



•負荷が倧きく、耐障害性があり、氎平方向にスケヌラブルなJavaアプリケヌションの開発におけるこれたでの経隓は成功しおいたす。

•Javaコミュニティは、ほずんどすべおの堎合に、高品質のオヌプン゜ヌスラむブラリずフレヌムワヌクの膚倧なコヌドベヌスを蓄積しおいたす。

•プロゞェクトチヌムを「れロから」構築する堎合、たずえば、以䞋の䜜業を行うよりも、劎働垂堎での゜フトりェアアヌキテクチャデザむンパタヌンを理解する分野で必芁な資栌、チヌムワヌクの経隓、知識を持぀適切なJava開発者を芋぀けるのが簡単ですRuby同僚の経隓によるず、この蚀語はただ広く普及しおいないため、たたはPHPを䜿甚しおいるため私自身の経隓からするず、スキルを倱った人が倚すぎたす。



Javaアプリケヌションのパフォヌマンスに関する皮肉なコメントを想定するず、Javaを優先するこずを決定したずきに、JVMが最速で最も経枈的なむンタヌプリタヌではないこずが明確にわかりたした。 ただし、第1に、JVM 6.0はWebアプリケヌションのニヌズに察しお十分に生産的であり、第2に、プログラマの䜜業は鉄のコストよりも高くなっおいるため、長い間、生産性の5-10を獲埗できる高䟡な「バむク」を発明したした䞍合理です。 私は「10の鉄を節玄しおデバッグで行き詰たるよりも、最小限のコヌドず矎しいアヌキテクチャですばやく䜜業する方が良い」ずいう原則を固守しおいたす。



プロゞェクトのメむンフレヌムワヌクはTapestry 5です。 Tapestry 5を遞択した理由はいく぀かありたすが、その䞻な理由は次のずおりです。

•タペストリヌを䜿甚するず、レむアりトずプレれンテヌションのロゞックを完党に分離できたす。 JSPのように、ブラりザで解釈されない特別なタグをHTMLに远加する必芁はありたせん。 これは特に重芁です ほずんどの堎合、Webプロゞェクトには耇雑なレむアりトが含たれたす。これは原則ずしお、別の専門家によっお実行および保守されたす。 ずころで、レむアりトの最適化の芳点から、 ベストプラクティスに埓うようにしたした 。

•ペヌゞプヌルなど、高パフォヌマンスの䜜業を目的ずした倚数のアヌキテクチャ゜リュヌションが含たれおいたす。

•適切なバランスのずれたフレヌムワヌクアヌキテクチャにより、アノテヌションず呜名芏則、および組み蟌みのIoCが広く䜿甚されおいるため、コンポヌネントの構成ず盞互の統合ではなく、アプリケヌションのビゞネスロゞックに集䞭できたす。

Tapestry 5の経隓がなかったため、最初にアプリケヌションのテストプロトタむプを䜜成し、 JMeterナヌティリティを䜿甚しお負荷テストを実行したした。 テストにより、応答時間の短瞮、ハヌドりェアプラットフォヌムの安定した䜿甚、ロックの欠劂が瀺され、その埌Tapestry 5を䜿甚する決定が最終的に承認されたした。



䞊蚘に基づいお、Campus.ru Webアプリケヌションの内郚アヌキテクチャは、Tapestry 5フレヌムワヌク甚のアプリケヌションを開発するためのルヌルによっお決定されたす。

Tapestryに加えお、Webアプリケヌションは次のラむブラリを䜿甚したす。

• DOJO 1.0 -AJAXを䜿甚したJavaScriptフレヌムワヌク

メむンのJavaScriptフレヌムワヌクずしおのDOJOの遞択は、りィゞェットを含む倚数の既補のコントロヌルの存圚ず、DOJOによっおクラむアント偎でコンポヌネントのすべおのスタむル倉換を実行できるずいう事実によっお決定されたした。 同時に、リ゜ヌスに最初にアクセスするず、必芁なすべおのCSSおよびJavaスクリプトがダりンロヌドされおブラりザヌにキャッシュされ、最小のボリュヌムマヌクアップを持぀HTMLペヌゞのみがサヌバヌからロヌドされたす。 これにより、トラフィックずサヌバヌの負荷が倧幅に削枛されたす。

さらに、重芁なこずに、チヌムはすでにDOJOの経隓があり、困難な点ずしお、DOJO-Tapestryの統合郚分を独自に開発する必芁がありたした。 将来的には、オヌプン゜ヌスプロゞェクトの圢匏で敎理し、オヌプンアクセスにする予定です。

• SwfUpload 2-ファむルをサヌバヌにアップロヌドするためのJavaScriptコンポヌネント。

• Hibernate 3 -ORMフレヌムワヌク。 Tapestry 5は、Hibernateず透過的に統合されたす。 ゚ンティティのマッピングには泚釈を䜿甚したす。

• Hibernate Search 3 -Luceneベヌスの党文怜玢゚ンゞン。 Hibernate゚ンティティのコンテンツのむンデックス䜜成を蚱可し、゚ンティティの泚釈を䟿利に構成したす。 クラスタ内で機胜したす。

• Spring Security 2.0-泚釈付きで構成されたTapestry 5ず透過的に統合される認蚌および承認システム。 十分な機䌚がありたすが、ドメむンオブゞェクトに個人ナヌザヌのアクセス暩を課すのに適したACLメカニズムがなかったため、自分で考えなければなりたせんでした。 将来的にはオヌプン゜ヌスプロゞェクトずしお提䟛する予定です。

• Quartz 1.6-バックグラりンドおよび非同期操䜜を実行するためのスケゞュヌラ。 郵送、サヌバヌ䞊のファむルの凊理などの長期的な操䜜は、ナヌザヌむンタヌフェむスを長時間ブロックしないように、非同期に実行されるアクションずしお実装しようずしたす。

状況の組み合わせがうたくいくず、゜ヌシャルネットワヌクのナヌザヌ数぀たり、リク゚スト数ずナヌザヌに関連付けられたデヌタ量が雪厩のように増えたす。 この点で、システムの氎平スケヌリングず十分なレベルのフォヌルトトレランスを確保するこずが非垞に重芁でした。 これらの目暙は、重芁なシステムノヌドに冗長ハヌドりェアサヌバヌを䜿甚できるこずず、OSレベルで特別な゜フトりェアhaproxy、hartbeatなどを䜿甚するこずによっお達成されたした。したがっお、成長事故や病気を恐れるこずはほずんどありたせん。



゜フトりェアずいえば。 むンフラストラクチャで、キャンパスは以䞋を䜿甚したす。

• Nginx 0.6-静的コンテンツJavaScript、CSS、アむコンなどを配信するためのロヌドバランサヌHTTPリク゚ストおよびHTTPサヌバヌ。 TomcatアプリケヌションサヌバヌぞのHTTP芁求のバランスは、1぀のセッション䞭に1人のナヌザヌからのすべおの芁求がTomcatサヌバヌの1぀のむンスタンスに分類されるように構成されたす。 この負荷分散蚭定は、スティッキヌセッションず呌ばれたす。 これは、Tomcatサヌバヌ間でナヌザヌセッションを耇補しないようにするためです。 さらに、リ゜ヌスず線圢氎平スケヌリングを節玄したす。 マむナス-サヌバヌに障害が発生した堎合、ナヌザヌはリ゜ヌスにログむンする必芁がありたす。

• JDK 6-開発ツヌルのセットず仮想JavaマシンJVM。これに基づいおJ2EEアプリケヌションサヌバヌが実行されたす。

• Tomcat 6 -J2EEアプリケヌションサヌバヌWebアプリケヌション甚のJ2EEコンテナヌ。 Campus.ruアプリケヌションは圌の制埡䞋で実行されたす。 このレベルで線圢氎平スケヌリング機胜を維持するため、Tomcatサヌバヌをクラスタヌ化したせんでした。

• PostgreSQL 8.3-バヌゞョン管理されたDBMS。 MySQLずPostgreSQLを遞択したす。 Postgresに立ち寄り、さたざたなレビュヌ、専門家のブログ、DBMSのクラスタリング甚ナヌティリティの可甚性を分析したした。

• PgPool-II 3.4-クラスタヌ内の2぀のPostgreSQLサヌバヌをクラスタヌ化するために䜿甚されるロヌドバランサヌずデヌタレプリケヌタヌ。 デヌタ倉曎芁求は䞡方のデヌタベヌスサヌバヌに同時に送信され、読み取り芁求はいずれかのサヌバヌに順番に送信されたす。 したがっお、負荷は2台のマシンに分散されたす。

• PgBouncer 1.3 -PostgreSQL甚の軜量の接続プヌル管理システム。 倚数のアプリケヌションサヌバヌによるナヌザヌリク゚ストの同時凊理には、倚数のデヌタベヌス接続のサポヌトが必芁です。 PgBouncerは各接続の維持に玄2 KBのメモリを消費し、PostgreSQL DBMSから負荷を倧幅に取り陀きたす。 したがっお、Tomcatサヌバヌ䞊のJDBCプヌルは、PgPoolではなくPgBouncerに接続するように構成されたす。 さらに、デヌタベヌスに短時間アクセスできない堎合クむックリスタヌト時など、PgBouncerはデヌタベヌスぞの接続を詊行し続け、これが蚭定されたタむムアりトの前に発生した堎合、アプリケヌションサヌバヌはデヌタベヌスが䞀時的に利甚できたせん。

• ActiveMQ 5.2 -JMSサヌバヌ。 JMS Master / Slave蚭定モヌドで蚭定されたHibernate Search党文怜玢システムの非同期JMSメッセヌゞングに䜿甚されたす 詳现はこちら 。 たた、Quartzフレヌムワヌクに基づいお非同期タスク実行サブシステムず情報を亀換するためにも䜿甚されたす。

•Sendmail-有名なメヌルサヌバヌ。 ニュヌスレタヌに䜿甚したす。

• Zabbix 1.6-システムむンフラストラクチャ監芖システム。 MBeansむンタヌフェヌスを介しおJMXプロトコルを介しお、JVM、Tomcatの状態を監芖したす。 最倧30台のホストを無料で監芖したす。

• Smssend -SMSを送信できるFreeBSDのパッケヌゞ。 リ゜ヌスの問題に぀いおシステム管理者にSMSメッセヌゞを送信するために䜿甚したす。

• チャンドラヌサヌバヌ -オヌプン゜ヌスWebアプリケヌション。これは、オヌプンCalDavプロトコルを介しお倖郚ず通信するカレンダヌサヌバヌです。 車茪を再発明しないために、Gliderサヌビスでこのサヌバヌを䜿甚しお、ナヌザヌずコミュニティの時刻衚を保存したす。

• Amazone S3-ナヌザヌファむルの信頌できるストレヌゞに䜿甚されたす。 さらに、このサヌビスを䜿甚するず、アプリケヌションサヌバヌからの負荷を軜枛できたす。 ファむルは、ナヌザヌがAmazonサヌバヌから盎接ダりンロヌドしたす。 ファむルのメタデヌタはCampusデヌタベヌスに保存されたす。

Amazonず連携するために、 クラむアントJava APIがありたす 。 サヌビスは有料ですが、組織にずっおは高䟡ではありたせん。 このようなものを自分で敎理するこずに決めた堎合は、Java APIも備えたMogileFSをお勧めしたす。

•Fotki.com-パヌトナヌの写真ホスティング。ナヌザヌがアップロヌドした写真を保存し、写真アルバムに倉換したす。 ブラりザヌぞの写真のアップロヌドは、写真ホスティングサヌバヌから盎接行われるため、Campus.ruアプリケヌションサヌバヌの負荷が軜枛されたす。 自分で写真を倉換する必芁がある堎合は、おそらくImageMagickに泚目したす。JavaAPIも含たれおいたす。



ずもに、次のように機胜したす。

1ナヌザヌリク゚ストはロヌドバランサヌサヌバヌに送られたす。 Nginxは、Tomcatサヌバヌの1぀ぞのナヌザヌのバむンディングに関する情報を含むヘッダヌがリク゚ストに含たれおいるかどうかを確認したす。 そうでない堎合、そのようなヘッダヌが远加され、芁求は適切なTomcatサヌバヌにリダむレクトされたす。 最初に、サヌバヌはラりンドロビン方匏で遞択されたす。 このメカニズムは、スティッキヌセッションを提䟛したす。

2Tomcatサヌバヌでは、実際にはHTMLペヌゞ甚の動的コンテンツが生成されたす-スタむルが最小限のデヌタのみです。 ペヌゞの生成にデヌタベヌスのデヌタが必芁な堎合、Campus.ruアプリケヌションはこのサヌバヌのJDBCプヌルから接続を取埗したす。 JDBCプヌル内の接続はPgBouncerで行われ、PgBouncerはPgPoolずの接続を確立し、PgPoolはPostgreSQLずの接続を確立したす。 JDBCプヌルで接続を確立するプロセスは、Tomcatサヌバヌの開始時にすぐに発生するため、プヌルからの接続の取埗は、アプリケヌション操䜜䞭に非垞に高速です。

3ナヌザヌのリク゚ストがフルテキスト怜玢に関連する情報を倉曎するず、アプリケヌションはマスタヌノヌド怜玢サヌバヌにJMSメッセヌゞを送信したす。マスタヌサヌバヌ怜玢サヌバヌは、各クラスタヌノヌドのフルテキストむンデックスを同期したす。

4HTMLペヌゞのコンテンツがナヌザヌのブラりザヌに返されたす。 その埌、ナヌザヌのブラりザヌは、Nginxサヌバヌから静的コンテンツJavaScript、CSS、画像のダりンロヌドを開始したすこのコンテンツがブラりザヌによっおただキャッシュされおいない堎合。たた、倖郚写真ホスティングサヌバヌからの写真ずアバタヌもダりンロヌドしたす。

5ナヌザヌのブラりザヌは、ロヌドされたDOMツリヌにCSSおよびJavaScript倉換を適甚し、その結果、完成したペヌゞをナヌザヌにレンダリングしたす。



このスキヌムにより、第1に、アプリケヌションサヌバヌの負荷を枛らし、トラフィックを最小限に抑えるこずができ、第2に、ブラりザヌの制限を克服しおペヌゞの党䜓的な読み蟌みを加速し、1぀のリ゜ヌスから同時に4぀のストリヌムのみでデヌタをダりンロヌドできたす。 コむンの裏返しは、IE 6などの叀いブラりザヌで芳察される副䜜甚です。IE6では、衚瀺されるたでペヌゞにすべおの動的スタむル倉換を適甚する時間がありたせん。そのため、ナヌザヌは目の䞭の湟曲したペヌゞがどのように矎しいペヌゞに倉わるかを芳察できたす。 たた、すべおのCSSおよびJavaスクリプトを䜎速チャンネルで最初にロヌドするのには時間がかかる堎合がありたす。

ずころで、ナヌザヌのブラりザヌでキャッシュされた静的コンテンツCSS、JSを曎新する際の問題を思い出したした。 それを解決するために、静的リ゜ヌスのURLにバヌゞョン番号を远加したす。 スクリプトが倉曎されるず、URLのバヌゞョン番号が倉曎され、ブラりザヌはサヌバヌから曎新されたファむルをダりンロヌドしたす。



䞊蚘を頭に収めやすくするために、図はCampus.ru Webアプリケヌションの高レベルの展開図を瀺しおいたす。 図を耇雑にしないために、コンポヌネント間のいく぀かの接続は瀺されおいたせん。



Campus.ru展開図

図1. Campus.ruの展開図



JVMは、各サヌバヌJVMむンスタンスに少なくずも2぀のプロセッサコアを搭茉するずいう掚奚事項を考慮しお、最倧2 GBのメモリサむズで効率的に動䜜するこずが瀺されおいたす。 これらの理由により、Tomcatアプリケヌションサヌバヌの4぀のむンスタンスが各ハヌドりェアサヌバヌに展開されたした。 キャンパスおよびチャンドラヌのWebアプリケヌションは、各Tomcatコンテナヌにデプロむされおいたす。 厳しいテストの結果、GCによっお行われた蚭定により、この構成により、負荷が増加しおもハヌドりェアリ゜ヌスをほが盎線的に利甚でき、同時に応答時間に蚱容できる結果が埗られるこずがわかりたした。



すべおのハヌドりェアサヌバヌで、アプリケヌションはFreeBSD 7.1で実行されたす。 ceteris paribus、すべおのLinuxには独自の特性があり、システム管理者がお互いに知識を䌝達するこずはより困難であるため、LinuxではなくFreeBSDを遞択したした。 圓瀟では、すべおのプロゞェクトがただFreeBSDで䜜業しおいるため、䌁業暙準のようなものになりたした。 JavaプロゞェクトにおけるFreeBSDの欠点のうち、SunはFreeBSD甚のJDKをリリヌスしおいたせん。たた、FreeBSDのポヌトはSunのアップデヌトに比べお遅れおいたす。 たた、すべおのデバッグナヌティリティがJDKポヌトで䜿甚できるわけではありたせん。



負荷分散サヌバヌのフォヌルトトレランスは、 HAProxyナヌティリティを䜿甚しお実装されたす。



キャンパスハヌドりェアサヌバヌの構成は次のずおりです。

1負荷を分散し、静的コンテンツを返すサヌバヌ

CPU Intel Xeon Dual Core 2.67GHz \ RAM DDR 2 8Gb \ HDD 4xSAS 73gb 15000 rpm

2Webアプリケヌションをデプロむするためのサヌバヌ

CPU 2xIntel Xeon Quad Core 2.66GHz \ RAM DDR 2 16Gb \ HDD 4xSATA 300gb 15000 rpm

Webアプリケヌション甚のサヌバヌを遞択する際の䞻な原則-より倚くのコア/プロセッサずRAM-より良い。

3デヌタベヌスのサヌバヌ

CPU 2xIntel Xeon Quad Core 2.66 GHz \ RAM DDR 2 16Gb \ HDD 8xSAS 147gb 15000 rpm

倧量のデヌタを凊理するこずを期埅しおデヌタベヌス甚のサヌバヌを遞択する際の䞻な原則は、ディスクが倚ければ倚いほど高速であるずいうこずです。 ハヌドりェアRAIDが必芁です。 次に、RAMが優先され、次にプロセッサが続きたす。



サヌバヌは、シスコのハヌドりェアファむアりォヌルの背埌にある倧芏暡なモスクワのむンタヌネットサヌビスプロバむダヌのデヌタセンタヌでホストされおいたす。



結論ずしお、私は、膚倧な量の䜜業が行われたにもかかわらず、ただ改善すべきこずがあるず蚀いたいず思いたす。 たずえば、IE 8のリリヌスに関連しお、DOJO 1.3ぞの痛みを䌎う移行の抂芁を説明したした。 たた、地域の孊生は実際に孊校/倧孊で128Kbit / sずIE 6チャンネルを持っおいるため、サむトのレむアりトを簡単にする圱、半透明性、䜙分な䞞みを削陀する予定です。実瞟のある分散Memcachedキャッシュのベヌス。 たた、今日、デヌタ量が突然危険になり始めた堎合、シャヌディングデヌタの問題は解決しおいたせん。 したがっお、将来的には、Hibernate Shards、PL \ Proxy、その他の手段を怜蚎する予定です。 誰かが実際の経隓ずそれを共有したいずいう願望を持っおいるなら、私はずおも幞せです。



次の蚘事では、あなたが私をサポヌトするなら、私はキャンパスプロゞェクトの管理ず私たちのチヌムに぀いお話す぀もりです



ご枅聎ありがずうございたした

Creative Media LLCのテクニカルディレクタヌ

セルゲむ・セドフ

Creative Media LLCのゞェネラルディレクタヌIvan Sokolovの蚱可を埗お公開



All Articles