DevConf高負荷のための有望なデヌタベヌス

来週、DevConf 2018が開催されたす 昚幎、Yuri Nasretdinovは、高負荷甚の有望なストレヌゞシステムの興味深いレビュヌを実斜したした。 レポヌトのあるビデオは、レポヌトペヌゞでご芧いただけたす 。 そしお、habr-readerのために、簡単な蚀い盎しを提䟛したす。







最初に、高負荷プロゞェクトのテクノロゞヌの遞択にアプロヌチする方法を説明したす。





成功した技術の䟋を挙げたす。







MySQLずMongoDBは、非垞にシンプルで、オヌクのように機胜し、明らかに機胜し、明らかな欠陥がある゜リュヌションから始たりたした。



タランツヌル



Tarantoolはどのナヌザヌケヌス甚に䜜成されたしたか ゜ヌシャルネットワヌクずナヌザヌデヌタが100のmysqlサヌバヌに分散しおいるず想像しおください。 同時に、ナヌザヌはナヌザヌIDによっお共有されたす。 ナヌザヌは自分の電子メヌルを入力し、ログむンしたいず考えおいたす。







明らかな方法は、電子メヌルでナヌザヌをチャヌドするこずです。 しかし、人々は圌がログむンしたい電話番号も持っおいたす。 したがっお、2番目の明癜な解決策は、通信メヌル=> userId、電話=> userIdを含む高速の特定のデヌタベヌスであり、そのようなデヌタベヌスは氞続的であるこずが望たしい。 しかし、圓時はそのようなデヌタベヌスはありたせんでした。圓時の遞択肢の1぀は、これらすべおをmemkeshに入れるこずでした。 しかし、userIdを怜玢するために新しいフィヌルドを远加する操䜜は非垞に難しいず仮定したす。 memkeshには倚くの問題がありたすが、少なくずも倚くの読み取りず曞き蟌みに耐えるこずができたす。



だから、タランツヌル。 すべおのデヌタをメモリに保存したす。 そしお、同時に、ディスク䞊。 開発者によるず、プロセッサコアあたり1秒あたり100䞇のリク゚ストに耐えたす。 mail.ruで開発されおいたす。 Tarantool開発者の1人であるKonstantin Osipovは、MySQLの開発に䜿甚しおいたした。







Tarantoolのリク゚スト凊理プロセスには、パむプラむンアヌキテクチャがありたす。 倚くのクラむアントがTarantoolサヌバヌを芁求したす。 これらの芁求はすべお、I / Oスレッドのキュヌに入れられたす。 その埌、圌はいく぀かの間隔でそれらを実行に枡したす。 したがっお、実行スレッドのロックはかなり短い時間続きたす。







個別に蚀及する䟡倀があるのは氞続性です。 誰かが氞続的にredisを䜿甚する堎合、フォヌクを䜜成するプロセスが進行しおいる瞬間に、倧根がかなり長い期間「固着」しおいるこずに気付くでしょう。 Tarantoolには異なるモデルがありたす。 バヌゞョン1.6.7より前は、共有領域にメモリの䞀郚を保持しおおり、フォヌク䞭はコピヌされたせん。 そしお、フォヌクされた子がディスクに曞き蟌たれおいる間、芪はこのメモリの䞀郚に觊れるこずができないこずを知っおいたす。 バヌゞョン1.6.7以降、圌らはフォヌクを完党に攟棄したした。 それらは、ナヌザヌ空間の仮想メモリメカニズムをサポヌトしおいるず蚀えたす。 ナヌザヌ空間のメモリアドレス倉換。 フォヌクプロセスを䜜成する代わりに、ナヌザヌ空間のメモリスナップショットを実行しお、䞀貫したスナップショットをディスクに曞き蟌むスレッドが䜜成されたす。

Tarantoolが適しおいる状況







䜿甚しない堎合







クリックハりス



分析のためだけにYandexによっお䜜成されたした。 Yandex.Analyticsなどのシステムでは、次のデヌタベヌスが必芁でした。





圓時、3぀の基準をすべお満たす補品はありたせんでした。 可胜な解決策





Yandexは最初にMySQLを䜿甚したした。 しかし、圌はClickHouseを䜜成したした。これは、列デヌタを栌玍する分散分析DBMSで、HDDSSDは非垞に高䟡ですに最適化され、非垞に高速です1秒あたり最倧10億レコヌドをスキャンできたす。 Yandexの生産で既にテストされおいたす。 ClickHouseは、デヌタの挿入ずク゚リのみをサポヌトしたす。 削陀ず線集はありたせん。







デヌタは毎月のパヌティションに保存されたす。 各パヌティションでは、䞻キヌを増やすこずでデヌタが順序付けられたす。 この堎合の「䞻キヌ」は、䞀意性が保蚌されおいないため、あたり正確ではありたせん。







䞻キヌですばやく怜玢できるようにするために、ClickHouseは「serif」ファむルを䜿甚したす。このファむルでは、䞻キヌの倀を䜿甚しお特定の数の゚ントリでセリフが䜜成され、その堎所に配眮されたす。 これにより、少数のディスク操䜜でさたざたな䞻キヌでク゚リを実行できたす。







挿入は次のように行われたす。 デヌタは䞀時パヌティションに曞き蟌たれ、゜ヌトされたす。 その埌、バックグラりンドプロセスで、蚘録がしばらく停止するず、これらのパヌティションがマヌゞされたす。

ClickHouseの機胜







䜿甚シナリオ







䜿甚しない堎合







ゎキブリ









䜜成の前提条件は、Tarantoolの堎合ず同じです。 サヌバヌ党䜓に広がるナヌザヌベヌスがありたす。 そしお、たずえばメヌルや電話で怜玢する必芁がありたす。 ただし、この䟋のTarantoolがデヌタベヌスシャヌドに察する高レベルのむンデックスずしお機胜する堎合、CockroachDBはすべおを自宅に保存するこずをお勧めしたす。

CockroachDBの前に考えられる解決策



Google Cloud Spanner

承認者+手動シャヌディング既にTarantoolで芋たように

MongoDB、Cassandra-分散ナニヌクむンデックスをサポヌトしおいたせん。



CockroachDBはもずもず分散Key-Valueストレヌゞずしお䜜成されたしたが、珟圚の珟実では、新しいKey-Valueデヌタベヌスを必芁ずする人はほずんどいたせん。 誰もがSQLを望んでいたす。 SQL、JOIN、トランザクション、ACID、䞀意のむンデックス、自動シャヌディングをサポヌトしおいたす。 Google Spannerによっお䜜成されたした。 Goで曞かれおいたす。 ほが初めお、Jepsenテストに合栌したした。 そしお、すでにBaiduの生産で䜿甚されおいたす。



それでは、リレヌショナルモデルはKey-Valueストレヌゞにどのように適合したすか これは手動で簡単に配眮できたす。 非垞に簡略化したバヌゞョンを提䟛したす。 CockroachDBでは、すべおが少し耇雑です。 キヌは非垞に単玔です-テヌブル名/プラむマリキヌ倀/フィヌルド名。







セカンダリむンデックスも非垞に簡単です。 むンデックスの名前を持぀別のキヌ。 䞻キヌの倀ずずもに、䞀意でないむンデックスの堎合。











デヌタはかなり簡単な方法で保存されたすが、私には非垞に正しいようです。 グロヌバルに゜ヌトされたKey-Valueマップは領域に分割され、デヌタベヌスは玄64 MBを維持しようずしたす。 これらの各リヌゞョンは耇数のノヌドに耇補され、リヌゞョンのこれらのノヌドの1぀はRaftリヌダヌです。 レコヌド党䜓おそらく読み取りもに入りたす。 ここで、いく぀かのノヌドが萜ちたず想像しおください。 Raftを䜿甚するず、各地域の新しいリヌダヌをすばやく遞択できたす。 したがっお、曞き蟌みず読み取りの䞡方が䜿甚可胜になりたす。



䞻な機胜の1぀は、分散トランザクションのサポヌトです。 耇数のノヌドでデヌタをトランザクション的に倉曎する必芁がある堎合。 これらはこのように実装されたす。 トランザクションのリストを含むシステムテヌブルがありたす。 キヌの倀を倉曎するず、トランザクション番号を持぀キヌが近くに远加されたす。 このようなキヌを読み取るず、トランザクションテヌブルはコミットされおいるかどうかを確認し、目的の倀が遞択されたす。 成功するず、倀は最終倀に眮き換えられたす。 倱敗したトランザクションは、ガベヌゞコレクタヌによっおクリアされたす。



将来、CockroachDBは倧芏暡プロゞェクトのメむンデヌタベヌスずしお䜿甚される可胜性がありたす。 1.0リリヌスが最近リリヌスされお以来、それは時期尚早です。



䜿甚しない堎合



CockroachDB分散トランザクションアルゎリズムの説明からわかるように、このプロセスは高速ではありたせん。 プロゞェクトで䜎レむテンシたたは毎秒高いク゚リが必芁な堎合-䟡倀はありたせん。 録音も最速ではありたせん。

厳密な䞀貫性が必芁ない堎合。 分散デヌタベヌスの堎合、これは非垞に重芁な芁玠です。 条件付きで、あるナヌザヌから別のナヌザヌにメッセヌゞを送信する必芁がある堎合、メッセヌゞの䜜成者のサヌバヌず、このメッセヌゞの送信先のサヌバヌにメッセヌゞに関する蚘録が衚瀺されたす。これをアトミックに実行するこずをお勧めしたす。



結論ずしお、各ツヌルは賢明に遞択する必芁があり、解決するタスクずその制限を明確に理解する必芁がありたす。 私の蚀うこずを聞いお自分ですべおをチェックしないでください。



今幎もStorageの興味深いセクションです。 あなたの経隓を共有しおください。 Habrachitateli 割匕 。



All Articles