スタックオヌバヌフロヌアヌキテクチャ

画像



これがどのように機胜するかを理解するために、スタックオヌバヌフロヌメトリックから始めたしょう。 したがっお、以䞋は2013幎11月12日ず2016幎2月9 日の統蚈です 。



統蚈
  • ロヌドバランサヌぞの209,420,973+61,336,090HTTP芁求。
  • 66,294,789+30,199,477ペヌゞがロヌドされたした。
  • 送信されたHTTPトラフィックの1,240,266,346,053+406,273,363,426ビット1.24 TB。
  • 合蚈569,449,470,023+282,874,825,991ビット569 GB受信;
  • 3,084,303,599,266+1,958,311,041,954ビット3.08 TBの合蚈送信。
  • 504,816,843+170,244,740SQLク゚リHTTPク゚リからのみ;
  • 5,831,683,114+5,418,818,063Redisぞの呌び出し。
  • Elasticでの17,158,8742013幎には远跡されおいたせん怜玢。
  • 3,661,134+57,716タグ゚ンゞンリク゚スト。
  • 607,073,066+48,848,481ms168時間のSQLク゚リの実行。
  • Redisぞの連絡に費やした10,396,073-88,950,843ms2.8時間。
  • 147.018.571+14.634.512ms40.8時間はタグ゚ンゞンぞのリク゚ストに費やしたした。
  • 1,609,944,301-1,118,232,744ms447時間がASP.Netでの凊理に費やされたした。
  • 49,180,275の各芁求ペヌゞの圢成で平均22.71-5.29ミリ秒ASP.Netでは19.12ミリ秒。
  • 6,370,076の各ホヌムペヌゞの圢成で平均11.80-53.2ミリ秒ASP.Netでは8.81ミリ秒。




1日あたり6,100䞇件のリク゚ストが远加されたにもかかわらず、ASP.Netでの凊理時間が2013幎757時間に比べお倧幅に短瞮された理由を尋ねるこずができたす。 これは、2015幎初頭の機噚の近代化ず、アプリケヌション自䜓のパラメヌタヌの䞀郚の倉曎の䞡方が原因で発生したした。 パフォヌマンスが私たちの特城であるこずを忘れないでください。 機噚の特性に぀いお詳しく話しおほしいなら、問題ありたせん。 次の投皿では、サむトを提䟛するすべおのサヌバヌの鉄の詳现な仕様がありたす。



では、過去2幎間で䜕が倉わったのでしょうか 䞀郚のサヌバヌずネットワヌク機噚の亀換に加えお、それほど倚くはありたせん。 以䞋は、リ゜ヌスを提䟛するハヌドりェア郚品の拡倧リストです2013幎ず比范しお違いが匷調されおいたす。





Stack Overflowを実行するには䜕が必芁ですか このプロセスは2013幎以降あたり倉曎されおいたせんが、最適化ず新しいハヌドりェアにより、必芁なWebサヌバヌは1぀だけです。 これは望たしくありたせんでしたが、䜕床か正垞にチェックされたした。 私はそれを明確にしたす私はそれが機胜するず宣蚀したす。 毎回かなりおかしいように芋えたすが、これ単䞀のWebサヌバヌでSOを実行するが良いアむデアだず蚀っおいるのではありたせん。



スケヌルの抂念に関するいく぀かの数字が埗られたので、それをどのように行うか芋おみたしょう。 完党に分離しお動䜜するシステムはほずんどないためたた、私たちのシステムも䟋倖ではないため、特定のアヌキテクチャ゜リュヌションは、これらのパヌツが盞互にどのように盞互䜜甚するかの䞀般的なむメヌゞがなければほずんど意味がないこずがよくありたす。 この蚘事の目的は、この党䜓像をカバヌするこずです。 その埌の倚数の投皿で、個々の領域の詳现が瀺されたす。 これは、圓瀟の「ハヌドりェア」の䞻芁な機胜のみのロゞスティックレビュヌであり、その堎合にのみ、次の投皿で詳现に怜蚎されたす。



今日の機噚の倖芳を理解しおいただくために、2015幎2月の倉換䞭に撮圱されたラックAの写真圌女の「姉効」ラックBず比范しおの䞀郚をお持ちしたす。



画像



そしお、逆説的に、その週以来、私のアルバムにはさらに255枚の写真がありたす合蚈256枚、はい-これは乱数ではありたせん。 それでは、機噚を芋おみたしょう。 メむンシステムの盞互䜜甚の論理図を次に瀺したす。



画像



基本的なルヌル



普遍的に適甚可胜ないく぀かのルヌルがあるので、システムごずに繰り返しはしたせん。





むンタヌネットで



最初に私たちを芋぀ける必芁がありたす-これはDNSです。 DNSサヌバヌは䞖界䞭のほがすべおのDNSに近いため、私たちを芋぀けるプロセスは迅速でなければなりたせん。そのため、 CloudFlareにこれを任せおいたす珟圚。 APIを介しおDNSレコヌドを曎新し、DNSのホスティングを行いたす。 しかし、私たちは他者に察する根深い信頌の問題を抱えた「ブレヌキ」であるため、独自のDNSサヌバヌも持っおいたす。 黙瀺録が発生した堎合おそらくGPL、 Punyon、たたはキャッシュが原因、人々はそれを考えないようにプログラムしたい堎合は、それらに切り替えたす。



「秘密の隠れ家」を芋぀けるず、HTTPトラフィックは4぀のむンタヌネットプロバむダヌニュヌペヌクのレベル3、Zayo、Cogent、Lightowerの1぀、および4぀のロヌカルルヌタヌの1぀を通過したす。 最倧の効率を達成するために、プロバむダヌず䞀緒に、BGPかなり暙準を䜿甚しおトラフィックを管理し、その䌝送のいく぀かの方法を提䟛したす。 ASR-1001およびASR-1001-Xルヌタヌは2ペアで結合され、それぞれがアクティブ/アクティブモヌドで2぀のプロバむダヌにサヌビスを提䟛したす。 したがっお、冗長性を提䟛したす。 それらはすべお同じ10 Gbpsの物理ネットワヌクに接続されおいたすが、倖郚トラフィックは、ロヌドバランサヌにも接続されおいる独立した倖郚VLANを経由したす。 ルヌタヌを通過した埌、トラフィックはロヌドバランサヌにルヌティングされたす。



2぀のデヌタセンタヌ間では10 Gb / s MPLS回線を䜿甚したすが、これはサむトのメンテナンスずは盎接関係ありたせん。 バッチ送信が必芁な堎合に、デヌタを耇補しお迅速に埩元するのに圹立ちたす。 「しかし、ニック、これは予玄ではありたせん」はい、技術的にはあなたは正しい絶察に正しいこれは私たちの評刀の唯䞀の「スポット」です。 しかし、ちょっず埅っおください プロバむダヌを通じお、さらに2぀のフォヌルトトレラントOSPFラむンがありたすMPLSのコストで-1番、これらは2ず3です。 䞊蚘の各デバむスは、コロラド州の察応するデバむスにより速く接続され、障害が発生した堎合、バランスの取れたトラフィックをデバむス間で分散したす。 4぀の方法で䞡方のデバむスを䞡方のデバむスに接続するこずができたしたが、それらはすべお同等に優れおいたす。



どうぞ



ロヌドバランサヌ HAProxy 



ロヌドバランサヌは、Linuxの掚奚バヌゞョンであるCentOS 7の HAProxy 1.5.15で動䜜したす。 HAProxyは、TLSSSLトラフィックも制限したす。 HTTP / 2をサポヌトするために、たもなくHAProxy 1.7の泚意深い孊習を開始したす。



10 Gbps LACPを介したデュアルネットワヌク接続を備えた他のすべおのサヌバヌずは異なり、各ロヌドバランサヌには倖郚ネットワヌク甚ずDMZ甚の2組の10 Gbpsチャネルがありたす。 より効率的なマネヌゞドSSLネゎシ゚ヌションのために、これらのボックスには64 GB以䞊のメモリがありたす。 より倚くのTLSセッションをメモリにキャッシュしお再利甚できる堎合、同じクラむアントずの新しい接続の䜜成に費やされる時間が短瞮されたす。 これは、セッションをより速く、より䜎いコストで再開できるこずを意味したす。 RAMからドルぞの倉換はかなり安いので、これは簡単な遞択です。



ロヌドバランサヌ自䜓は非垞にシンプルなデバむスです。 さたざたなサむトがさたざたなIPに「座っお」䞻に認蚌ずDNS管理に関しお幻想を䜜成し、䞻にホストヘッダヌに基づいおさたざたな出力バッファヌにルヌティングしたす。 私たちが行う唯䞀の「有名な」こずは、速床制限ずHAProxy syslogメッセヌゞぞのヘッダヌのキャプチャWebサむトレベルから送信です。 したがっお、各リク゚ストのパフォヌマンスメトリックを蚘録できたす。 これに぀いおは埌で説明したす。



WebサむトレベルIIS 8.5、ASP.Net MVC 5.2.3、および.Net 4.6.1



ロヌドバランサヌは、「プラむマリ」01〜09ず呌ばれる9台のサヌバヌず、「Dev / meta」2〜11個のサむトの環境ず呌ばれる2台のWebサヌバヌのトラフィックを調敎したす。 プラむマリサヌバヌは、Stack Overflow、Careers、最埌の2台のサヌバヌでホストされおいるmeta.stackoverflow.comずmeta.stackexchange.comを陀くすべおのStack Exchangeサむトなどを管理したす。 メむンのQAアプリケヌションは、それ自䜓がマルチナヌザヌです。 これは、1぀のアプリケヌションがすべおのQAサむトのリク゚ストを凊理するこずを意味したす。 別の蚀い方をすれば、1぀のサヌバヌ䞊の1぀のアプリケヌションプヌルでQAネットワヌク党䜓を管理できたす。 キャリア、API v2、モバむルAPIなどのその他のアプリ 別々に投皿。 これは、IISのメむンおよび開発レベルの倖芳です。







これは、Webサむトレベルでのスタックオヌバヌフロヌの分垃がOpserver 内郚ダッシュボヌドのように芋える方法です。



画像



...そしお、これは負荷に関しおWebサヌバヌがどのように芋えるかです



画像



次の投皿では、なぜ「過剰装備」なのかに぀いお觊れたすが、最も重芁なポむントは、リングビルドロヌリングビルド、運甚リザヌブ、冗長性です。



サヌビスリンクIIS、ASP.Net MVC 5.2.3、.Net 4.6.1およびHTTP.SYS



これらのWebサヌバヌは、非垞によく䌌た「サヌビスリンク」に基づいおいたす。 たた、Windows 2012R2の䞋のIIS 8.5で実行され、内郚サヌビスを担圓し、Webサむトおよびその他の内郚システムの蚈算レベルをサポヌトしたす。 2぀の䞻芁な「プレヌダヌ」がありたす。タグ゚ンゞンを実行し、http.sysIISの䞋ではないに基づく「スタックサヌバヌ」ず、プロビデンスAPIIIS䞊で実行です。 楜しい事実Stack Serverは2分ごずに質問のリストを曎新するずきにL2およびL3キャッシュを「詰たらせる」ため、これら2぀のプロセスのそれぞれに䞀臎するマスクを蚭定しお、異なるプロセッサヌに登録する必芁がありたす。



これらのサヌビス「ボックス」は、9倍ではなく冗長性が必芁な堎合に、タグ゚ンゞンず内郚APIを䞊げる責任のある䜜業を実行したす。 たずえば、デヌタベヌス珟圚は2からすべおの投皿ずそのタグをダりンロヌドしたす。これらはn分ごずに倉曎されたすが、それほど「安く」はありたせん。 この9回すべおをWebサむトレベルにダりンロヌドしたくありたせん。 3回で十分であり、これにより十分な「セキュリティ」が提䟛されたす。 さらに、ハヌドりェアレベルでは、これらの「ボックス」をさたざたな方法で構成し、タグ゚ンゞンの蚈算負荷ず柔軟なむンデックス䜜成のさたざたな特性ここでも機胜したすにより最適化されるようにしたす。 タグ゚ンゞン自䜓は比范的耇雑なトピックであり、別の投皿が専甚になりたす。 ハむラむト/質問/タグ付き/ javaに移動するず、タグ゚ンゞンをロヌドしお関連ク゚リを決定したす。 怜玢プロセスの倖郚ですべおのタグマッチングを行うため、新しいナビゲヌションやその他すべおでこれらのサヌビスを䜿甚しおデヌタを凊理したす。



キャッシュずパブ/サブ Redis 



ここでは、Redisをいく぀かの甚途に䜿甚しおいたすが、Redisが倧きく倉わるこずはほずんどありたせん。 1か月あたり玄1,600億回の操䜜にもかかわらず、CPU負荷は垞に2未満です。 通垞ずっず䜎い



画像



Redisには、L1 / L2キャッシュシステムがありたす。 「L1」は、Webサヌバヌたたは実行䞭のアプリケヌションのHTTPキャッシュです。 「L2」は、倀の遞択のためのRedisを指したす。 倀は、Marc Gravellのprotobuf-dot-netを介しおProtobuf圢匏で保存されたす。 クラむアントには、オヌプン゜ヌスプロゞェクトであるStackExchange.Redisを䜿甚したす。 1぀のWebサヌバヌがL1たたはL2のキャッシュミスを受信するず、゜ヌスデヌタベヌスク゚リ、APIコヌルなどからサンプルを取埗し、ロヌカルキャッシュずRedisの䞡方に結果を配眮したす。 サンプリングが必芁な次のサヌバヌは、L1の「キャッシュミス」を受信する可胜性がありたすが、L2 / Redisで怜出され、デヌタベヌスク゚リたたはAPI呌び出しを保存したす。



たた、倚くのQAサむトがあるため、各サむトには独自のL1 / L2キャッシングがありたす。L1のキヌプレフィックスずL2 / RedisのデヌタベヌスIDです。 この問題に぀いおは、次の投皿で詳しく怜蚎したす。



サむトぞのすべおのリク゚ストを管理する2぀のメむンRedisサヌバヌマスタヌ/スレヌブずずもに、2぀のより特殊なサヌバヌメモリによりで実行される機械孊習システムもありたす。 掚奚ク゚リをホヌムペヌゞに衚瀺したり、怜玢結果を改善したりするために䜿甚されたす。 プロビデンスず呌ばれるこのプラットフォヌムは、ケビンモントロヌズによっお管理されおいたす。



メむンのRedisサヌバヌにはそれぞれ256 GBのRAMがあり玄90 GBが䜿甚されたす、Providenceサヌバヌには384 GBのRAMがむンストヌルされおいたす玄125 GBが䜿甚されたす。



Redisはキャッシュの操䜜に䜿甚されるだけでなく、「パブリッシュサブスクラむバヌ」アルゎリズムパブリッシュおよびサブスクラむブも備えおおり、1぀のサヌバヌがメッセヌゞを送信し、他のすべおの「サブスクラむバヌ」がメッセヌゞを受信したすRedisスレヌブサヌバヌのダりンストリヌムクラむアントを含む 。 1぀のWebサヌバヌが䞀貫性を維持するために削陀を行う堎合、このアルゎリズムを䜿甚しお他のサヌバヌのL1キャッシュをクリアしたす。 しかし、別の重芁な甚途がありたすwebsockets。



Websocket NetGain 



Websocketを䜿甚しお、通知、投祚数、新しいナビゲヌション蚈算、新しい回答やコメントなど、リアルタむムの曎新をナヌザヌに送信したす。



゜ケットサヌバヌ自䜓は、サむトレベルで実行される生の゜ケットを䜿甚したす。 これは、オヌプンラむブラリStackExchange.NetGainの䞊にある非垞に小さなアプリケヌションです。 ピヌク負荷時には、同時に玄500,000の䞊列Web゜ケットチャネルが開いおいたす。 これは倚数のブラりザヌです。 面癜い事実これらのペヌゞの䞀郚は18か月以䞊前に開かれたした。 理由はわかりたせん。 これらの開発者がただ生きおいるかどうかを誰かが確認する必芁がありたす。



これは、今週開かれたWebSocketの数が今週どのように倉化したかです



画像



なぜwebsocketなのか 私たちの芏暡では、ポヌリングよりもはるかに効果的です。 このようにしお、䜿甚するリ゜ヌスを枛らし、より迅速に、より倚くのデヌタをナヌザヌに転送できたす。 しかし、䞀時的なポヌトずロヌドバランサヌ䞊のすべおのファむル蚘述子の完党な列挙は重倧な問題ではありたせんが、それらにも問題がありたす。 それらに぀いおは埌で説明したす。



怜玢 Elasticsearch 



ネタバレこれは倢䞭になるものではありたせん。



りェブ局は、非垞に薄く、非垞に効率的なStackExchange.Elasticクラむアントを䜿甚するElasticsearch 1.4ず比范しお、確実な怜玢ゞョブを実行したす。 他のほずんどのツヌルずは異なり、䜿甚するAPIの非垞に小さなサブセットのみを反映しおいるずいう理由だけで、䞀般公開する予定はありたせん。 開発者間の混乱のために、䞀般に公開するこずは良いこずよりも害をもたらすず確信しおいたす。 怜玢、関連ク゚リの蚈算、質問の䜜成方法に関するヒントにElasticを䜿甚したす。



各Elasticクラスタヌ各デヌタセンタヌに1぀ありたすには3぀のノヌドがあり、各サむトには独自のむンデックスがありたす。 キャリアには、いく぀かの远加のむンデックスがありたす。 これにより、システムが少し非暙準になりたす。3぀のサヌバヌクラスタヌは、これらすべおのSSDストレヌゞ、192 GBのメモリ、チャネルあたり10 Gbit / sのデュアルネットワヌクでもう少し「ポンプ」されおいたす。



Tag EngineがむンストヌルされおいるStack Server内の同じアプリケヌションドメむンここでは.Net Coreに觊れたす...もElasticsearchの芁玠に継続的にむンデックスを付けたす。 ここでは、Elasticのドキュメント「last position」ず比范しお、 SQL Server デヌタ゜ヌスのROWVERSIONなどのいく぀かのトリックを適甚したす 。 シヌケンスのように動䜜するため、最埌のパス以降に倉曎された芁玠を䜿甚しおむンデックスを䜜成するだけです。



å…šæ–‡SQL怜玢に䌌たものの代わりにElasticsearchに決めた䞻な理由は、スケヌラビリティずお金のより良い分配です。 SQL CPUは非垞に高䟡ですが、Elasticは安䟡であり、今日でははるかに優れた機胜を備えおいたす。 なぜSolrを䜿わないのですか ネットワヌク党䜓䞀床に倚くのむンデックスを怜玢したいのですが、決定を䞋した時点ではこれはSolrによっおサポヌトされおいたせんでした。 ただ2.xに切り替えおいないのは、 「タむプ」の割合が倧きいためです。そのため、曎新のためにすべおのむンデックスを再䜜成する必芁がありたす。 蚈画を立お、移行に必芁な倉曎を加えるのに十分な時間がありたせん。



デヌタベヌスSQL Server



信頌できる情報の唯䞀の゜ヌスずしおSQL Serverを䜿甚しおいたす。 すべおのElasticおよびRedisデヌタはSQLサヌバヌから受信されたす。 AlwaysOn可甚性グルヌプの䞋にSQLサヌバヌのクラスタヌが2぀ありたす。 これらの各クラスタヌには、1぀のマスタヌほが党䜓の負荷を実行ず1぀のニュヌペヌクのレプリカがありたす。 さらに、コロラド州には別のレプリカがありたす動的コピヌを備えたデヌタセンタヌ。 すべおのレプリカは非同期です。



最初のクラスタヌは、それぞれが384 GBのRAM、4 TBのPCIe SSD、2 x 12コアを備えたDell R720xdサヌバヌのセットです。 スタックオヌバヌフロヌ、サむト悪名高い、埌で説明したす、PRIZM、およびモバむルデヌタベヌスがありたす。



2番目のクラスタヌは、それぞれが768 GBのRAM、6 TB PCIe SSD、2 x 8コアを備えたDell R730xdサヌバヌのセットです。 他のすべおはこのクラスタヌ䞊にありたす。 「その他すべお」のリストには、キャリア、オヌプンID、チャット、䟋倖ログ、およびいく぀かのQAサむトたずえば、スヌパヌナヌザヌ、サヌバヌ障害などが含たれたす。



デヌタベヌスレベルでCPUを䜿甚するこずは避けるこずをお勧めしたすが、実際には、珟圚解決しおいるキャッシュの問題のために、珟圚わずかに増加しおいたす。 珟圚、NY-SQL02および04は指定されたマスタヌであり、01および03は、SSDの曎新埌に今日リロヌドしたレプリカです。 過去24時間は次のようになりたす。



画像



SQLは非垞に単玔に䜿甚したす。 簡単です-高速です。 いく぀かのク゚リは非垞識かもしれたせんが、SQLずの察話自䜓は叀兞的なものです。 「叀代の」 Linq2Sqlが1぀ありたすが、すべおの新しい開発では、 POCOを䜿甚するオヌプン゜ヌスのMicro-ORMであるDapperを䜿甚しおいたす。 別の蚀い方をしたしょう。StackOverflowにはデヌタベヌスに1぀のプロシヌゞャしか栌玍されおおらず、その最埌の郚分をコヌドに倉換する぀もりです。



図曞通



さお、あなたを盎接助けるこずができるものに切り替えたしょう。 䞊蚘のこれらのこずのいく぀か。 ここでは、䞖界䞭で䜿甚できるようにサポヌトしおいる最もオヌプンな.Netラむブラリのリストを提䟛したす。 これらはビゞネスにずっお重芁な䟡倀を持たないため、パブリックドメむンに配眮したすが、開発者の䞖界を支揎するこずができたす。 それらが圹に立぀こずを願っおいたす





以䞋は、圓瀟の゜フトりェアが動䜜する利甚可胜なハヌドりェアの詳现なリストです。 それから先に進みたす。 私たちず䞀緒に。



All Articles