Hi%username%!
今日、私たち(私のパートナー)と私は、複雑な選択と並べ替えのためにSphinxを支持してMySQLを放棄することを決めました。
どうでしたか
それは、MySQLが安定したペースで静かに勢いを増し、サーバーにますます負荷をかけているという事実(すでにご想像のとおり)から始まりました。 そして、犯人は1つのテーブルでした-トレント(ええ、トラッカーについて話している)。 時が来て、私たちは状況を解決する方法を考え始めました。
私たちはどこでボトルネックを知っていました、そして彼らは分布をフィルタリングしてソートしていました。 キャッシングはすぐに消え、サンプルの組み合わせの数は非常に多く、さらに最新のデータが常に必要でした(シード、リーチャー、ダウンロードの数...)。 2つのサーバーが既にマスター/マスターモードで動作していたため、レプリケーションについても考えませんでした。また、レプリカからツリーを構築したくありませんでした。 パーティショニングは私たちの最初の考えでしたが、それはブレーキだけを与えました。 2番目の考えは、テーブルを別のサーバーに送信することでしたが、ここでは残念なことに待っていました...そのとき、
XBTトラッカーが回転していました。 問題は、彼が同じデータベースにあるテーブルでのみ作業する方法を知っていたことです。 「だから何?」-私たちは、それがオープンソースだから書き換えることができると思った。 彼と私はC ++の友達ではなく、アイデアは実現可能であり、生命の権利があることに同意したため、金銭的な費用とサイトエンジンの書き換えという形でコストが発生します。
インターネットを歩き回って解決策を見つけようと必死になり、
検索だけでなく、スフィンクスというポストに出会いました
! 。 それから、これが私たちに必要なものだと気付きました! Sphinxは長い間検索エンジンとして機能しており、非常に満足しています。 袖をまくり、パートナーはスフィンクスの更新とセットアップを開始し、ディストリビューションのフィルタリング方法の書き直しを始めました。 次に、
投稿方法SphinxQLを見てから、SphinxQLを使用することにしました。
Sphinxの場合、検索と分布のフィルタリングの両方に使用される1つのインデックスを取得しました。 5分ごとにインデックスの完全な再作成が行われます(結局、常に最新のデータが必要です)。 インデックスの再作成にかかる時間は1分未満です。
PHPの場合、すべてが単純でした。 クエリジェネレータはほとんどやり直されませんでした。 クエリ自体は無害からのものでした
SELECT *, leechers+seeders AS peers FROM torrents WHERE parent_cid=1 ORDER BY ctime DESC LIMIT 0,30 OPTION max_matches=30
MySQLをかろうじて動かした人に
SELECT *, leechers+seeders AS peers FROM torrents WHERE parent_cid=1 ORDER BY ctime DESC LIMIT 40380,30 OPTION max_matches=40410
SELECT *, leechers+seeders AS peers FROM torrents WHERE MATCH('@quality DVDRip') AND cid=6 AND year=2009 ORDER BY peers DESC LIMIT 360,30 OPTION max_matches=390
スフィンクスにアクセスした後、配列に分布に関する情報を入力します。 Sphinxは文字列値(たとえば、ディストリビューションの名前)を返さないので、別の配列にディストリビューションキャッシュのキー(1つのディストリビューション-1つのキャッシュ)を入力し、必要なすべての情報を取得するためにmemcacheに1つのマルチリクエストを行う必要があります。 最後に、サイクルを実行し、すべてをまとめてユーザーに提供します。
おわりに
結果に非常に満足しています。 その結果、何が得られましたか? 主なことは、MySQLの負荷がほぼ3倍低下し、インデックスのクラウドがトレントテーブルから削除され、MySQLフィルタリングページがまったくプルされないことです。
このフォームでは、私が言ったように、このケースは1年以上にわたって今日まで機能しています。 このようなソリューションで問題は発生しませんでした。 解決策は非常に松葉杖であることがわかっていますが、それでも大丈夫です。 現在、Sphinxとmemcacheは、大量のRAMを備えた別個のサーバーに存在し、悲しみを知りません。
ご清聴ありがとうございました。