NoSQL-䞻なものに぀いお簡単に





セルゲむ・チュレンツェフTextMaster



私の名前はSergey Tulentsevです。数幎前からNoSQLデヌタベヌスに興味があり、今日は私の知識ず経隓を皆さんず共有したいず思いたす。



このレポヌトの恩恵を受けるのは誰ですか これは、構造化されおいるず䞻匵するレビュヌレポヌトです。 どこかでNoSQLに぀いお聞いたこずがあれば、40分埌にはさらに倚くのこずを知るようになり、甚語でナビゲヌトしやすくなり、プロゞェクトのデヌタベヌスをより自信を持っお遞択できるようになりたす。



たた、䞀般的なアプリケヌションの䟋ず、NoSQLデヌタベヌスの䜿甚方法に぀いおも説明したす。



少し歎史。







この甚語は1998幎に初めお登堎したした。CarloStrozziずいう名前の男が圌のリレヌショナルデヌタベヌスず呜名したした。 ただし、それ自䜓を操䜜するためのSQLむンタヌフェヌスは提䟛されず、XMLファむルを゜ヌセヌゞするbashスクリプトのセットでした。 りィキペディアによるず、このデヌタベヌスの最埌のリリヌスは2010幎にリリヌスされ、䜕らかの圢で正垞に機胜したした。 圌女のこずは報告曞の準備の過皋でしか知りたせんでしたが、以前圌女のこずを知らなかったのは良いこずだず思いたす。



2009幎に、サンフランシスコの他の男たちが新しい分散デヌタベヌスに぀いお議論する䌚議を開催し、ツむッタヌ甚のハッシュタグ、長い短いハッシュタグが必芁になりたした。 誰かがNoSQLハッシュタグを思い぀いお、SQL、ACID、およびあらゆる皮類のクヌルなものがあるデヌタベヌスがあるこずを匷調したしたが、これを持たない他のデヌタベヌスに぀いお説明したす。 人々はハッシュタグが奜きでした、それは制埡䞍胜になっお、ただむンタヌネットをサヌフィンしたす。



NoSQLずいう甚語。 2぀の解釈がありたす。1぀は叀いもの、もう1぀は新しいものです。 元のものはNoSQLです。぀たり、䞀般に、SQLはありたせんが、このデヌタベヌスを操䜜するための他のメカニズムがありたす。 そしお、新しい解釈は「SQLだけではありたせん」-これはSQLだけではありたせん。 おそらくSQLですが、他にも䜕かがありたす。



そのようなサむトhttp://nosql-database.orgがありたす-これは異なるNoSQLデヌタベヌスのリストです。 説明、タむプ、公匏プロゞェクトぞのリンク、知っおおく䟡倀のある簡単な重芁事項が含たれおいたす。 自由に登っお読むこずもできたすが、最も人気のあるものに぀いお説明したす。



デヌタベヌスの最も䞀般的な分類は、デヌタ型によるものです。



重芁なタむプは、キヌ/倀ストア、たたはキヌず倀のペアのストレヌゞです。







これは最もポピュラヌなタむプであり、同時に最も単玔でもありたす。最も原始的なむンタヌフェむスを備えおいたす。 そしお、理論的には、そのようなデヌタベヌスの最小むンタヌフェヌスは、取埗、蚭定、削陀の3぀の操䜜のみで構成されおいたす。 おそらくこのむンタヌフェヌスを満たすデヌタベヌスがいく぀かありたすが、通垞、珟代の䞀般的なデヌタベヌスはより倚くの利点を提䟛したす。たずえば、䞀床に倚くのキヌを取埗したり、キヌの有効期間を蚭定したり、キヌの有効期間を取埗したり、サヌバヌの状態を確認するサヌビスチヌム...



このクラスの顕著な代衚はMemcashedです。 そしお、これはRedisのおかげです。 なぜストレッチで 圌は実際には圌が単独でいる独自のカテゎリを持っおいるため、このカテゎリは「デヌタ構造サヌバヌ」ず呌ばれたす。 いく぀かのタむプのキヌず想像を絶するものを䜜成するために䜿甚できる非垞に豊富なコマンドセット150以䞊があるため、このカテゎリに属したすが、このカテゎリを考慮しない堎合は、キヌ/倀でここに起因するこずができたす。 Riakもありたす。



ドキュメント指向デヌタベヌス。







これは、前のカテゎリの非垞に耇雑なバヌゞョンです。 これにより耇雑さが増したす。たた、ボヌナスも提䟛されたす。倀は、読み取りたたは削陀以倖の操䜜ができない䞍透明なテキストBLOBの皮類ではなくなり、倀をさらに埮劙に操䜜できるようになりたした。 ドキュメントの䞀郚のみが必芁な堎合は、それを読むか、䞀郚のみを曎新できたす。



通垞、このタむプのデヌタベヌスには、豊富なドキュメント構造が含たれおいたす。 朚。 おおたかに任意のJSONを想像するず、想像できるあらゆるJSONをそのようなデヌタベヌスに曞き蟌むこずができたす。 そしお、通垞、広告では、プレスリリヌスによるず、JSONをデヌタベヌスに入れお分析するこずができたす。 通垞、問題は最初の項目だけで発生するのではなく、実際にはデヌタベヌス内のJSONの配眮で発生し、その埌埮劙な違いが始たりたす。



兞型的な代衚者は、MongoDB、CouchDB、ElasticSearchなどです。



列デヌタベヌス。







圌らの長所は、倚数の属性を持぀倧量のデヌタを保存できるこずです。 数十億のレコヌドがあり、各レコヌドに300の属性がある堎合、これは列デヌタベヌスにありたす。



たずえば、リレヌショナルデヌタベヌスずは少し異なる方法でデヌタを保存したす-リレヌショナルデヌタベヌスは行に保存したす。 1぀の行のすべおの属性は暪に䞊んでいたす。 これらは逆のこずを行い、列を個別に保存したす。



ファむルがありたす-それはすべおの30億レコヌドからこの列のすべおのフィヌルドを保存したす、すべおは近くに保存されたす。 したがっお、別の列は別のファむルに栌玍されたす。 このため、列のデヌタ型に関する情報を䜿甚しお、改善された圧瞮を適甚できたす。 たた、たずえば300列のうち3列が必芁な堎合、リク゚ストを高速化できたす。残りの297列をロヌドする必芁はありたせん。



代衚者はHBase、Cassandra、Verticaです。 ちなみに、VerticaにはSQLむンタヌフェむスがありたすが、䟝然ずしお列デヌタベヌスです。



グラフデヌタベヌス。







グラフ凊理甚に蚭蚈されおいたす。 念のために、グラフは離散数孊、぀たり゚ッゞで接続された頂点のセットから埗られるものであるこずを思い出させおください。 興味深い困難なタスクを芋るず、そこにグラフが芋぀かる可胜性が高くなりたす。 たずえば、゜ヌシャルネットワヌクは1぀の倧きなグラフです。 道路ネットワヌクずルヌティング、補品の掚奚。



これらのデヌタベヌスの長所は、特殊化のために、グラフに察しおあらゆる皮類の操䜜を効果的に実行できるこずですが、同じ特殊化のため、あたり䞀般的ではありたせん。



それでも、すべおのタスクにグラフがあるわけではありたせん。グラフがある堎合、それはおそらくそれほど倧きくなく、リ゜ヌスによっお、新しいデヌタベヌス党䜓をプロゞェクトにドラッグするよりも、䜕らかの皮類のグラフ凊理をアプリケヌションでひざにかける方が安䟡です。埓う必芁がありたす。 そしお、この新しいデヌタベヌスには倚くの問題がありたす。 私の緎習ではそうでした。



マルチモデルデヌタベヌス。







これらは、以前のカテゎリからの2぀以䞊のカテゎリを同時に含むデヌタベヌスです。



必芁に応じお-文曞を䜜成し、必芁に応じお-グラフを䜜成したす。 たずえば、FoundationDBにはメむンレむダヌであるキヌ/倀があり、SQLレむダヌはこのレむダヌの䞊に䜕らかの圢で適合しおいたす。 配垃キットをダりンロヌドしおニュヌスレタヌにサむンアップし、毎週メヌルを送られたしたが、配信キットを起動しお起動するこずができず、その仕組みを感じたした。 数か月前の3月にAppleがこれらのナヌザヌを賌入し、サむトから配垃ダりンロヌドぞのすべおのリンクをすぐに削陀したため、今では成功したせん。珟圚、この補品はパブリックドメむンに含たれおいないようです。 圌らは賌入されたので、圌女はおそらくうたくいった。



誰かがそれらを賌入するたで、私たちが觊れる機䌚がもう2぀ありたす。



デヌタの保存方法に応じた分類がただありたす。







デヌタをたったく保存しないデヌタベヌスがあり、すべおがメモリに保存されたす。 したがっお、プロセスを再起動するず、デヌタが倱われたす。 解決方法は2぀ありたす。埩元できない重芁なデヌタを保存しないか、レプリケヌションを積極的に䜿甚したす。 重芁でないデヌタ-これは、たずえば、キャッシュです。キャッシュがどこかに消えた堎合、アプリケヌションは萜ちず、キャッシュが回埩しおりォヌムアップするたで枛速したすが、臎呜的なこずは䜕も起こりたせん。



このモヌドは、パフォヌマンスを高速化するために䜿甚される堎合がありたす。 たずえば、Redisを芋おください。 1秒あたり数十、数十䞇の操䜜を凊理できたす。 もちろん、䞀郚の人々はこれを利甚しお最倧限にロヌドしたすが、デヌタストレヌゞモヌドで動䜜する堎合、぀たり スナップショットをリセットするか、ログに曞き蟌むず、ディスクはこれを実行できなくなり、ディスクを操䜜するずサヌバヌの速床が䜎䞋したす。 したがっお、このトリックを適甚できたす。3぀のRedis'ov、1぀のマスタヌ、2぀のスレヌブのシステムを䜿甚したす。 マスタヌでは、すべおの氞続性をオフにし、ディスクにたったく觊れたせん。マスタヌであるため、そこに曞き蟌みたす。 最初のスレヌブでは、氞続性も無効にし、そこから読み取りたす。 そしお、最埌の奎隷-誰もそれに觊れず、それを読んでいない、そしおそれで私たちは氞続性をオンにしたす。 そしお、圌は、蚭定に埓っお、デヌタをディスクに保存したす。 灜害が発生した堎合、埩旧可胜なデヌタのコピヌが䜜成されたす。



Redisには、デヌタをディスクに保存できる2぀のモデルがありたす。 たず、スナップショットを保存できたす-これは珟時点でのデヌタベヌスのキャストです。 このキャストを適切にするために、Redisはプロセスのコピヌを䜜成し、マスタヌに発生するレコヌドによっおキャストが砎損しないようにしたす。 そしお、このフォヌクは誰もこのスナップショットに曞き蟌みをしないため、すでにこのスナップショットを保存しおいたす。



このメ゜ッドは、远加のメモリを必芁ずするこずを陀いお非垞に優れおいたす。 サヌバヌで発生するアクティビティによっおは、最倧2倍のメモリが必芁になる堎合がありたす。 2 GBのデヌタベヌスがある堎合、スナップショットを保存するために別の2 GBを空けおおく必芁がありたす。



ログにデヌタを曞き蟌むように構成するこずもできたす-これは別の手法です。 ぀たり、曞き蟌みコマンドが圌に届くず、圌はすぐにそれをログにすぐに曞き蟌み、動䜜し続けたす。 これら2぀のモヌドスナップショットずログは独立しおいたすが、どちらか䞀方、たたは䞡方を䞀緒に構成できたす。 䞀般に、このログはここでのみ远加されたす-これはプラスであり、すでにログに入力されたデヌタは倉曎されず、砎損するこずはできたせん。 そのため、通垞、このログは別のヘッドを持぀別のディスクにこのログを配眮したす。このディスクでは、Redis以倖は䜕もせず、ディスクヘッドには觊れたせん。 そしお、この頭は垞にファむルの終わりを指しおいたす。 たた、ファむルの最埌に新しい操䜜を曞き蟌むこずは、他のアクティビティが発生する通垞のシステムで発生する堎合よりもはるかに高速です。



MongoDBなどの他のデヌタベヌスには、むンプレヌス曎新ず呌ばれる異なるモデルがありたす。 デヌタベヌス、デヌタファむルのコピヌが1぀あり、それらを盎接「ラむブ」で倉曎したす。 これはあたり安党な方法ではありたせん。たずえば、倉曎䞭に電源が切れた堎合は、デヌタベヌスが砎損しおいるため、責任がありたす。 そのため、いく぀かのバヌゞョンの前に、ログを添付しおいたした-制埡ログを呌び出し、デフォルトで有効にしたした。 したがっお、2぀のレプリカなしでMongoを実行できるようになり、デヌタが損なわれない可胜性がありたす。



NoSQLに぀いお蚀えば、CAP定理に蚀及するこずはできたせん。それは2぀のブヌツのようなものです。







定理は2001幎に定匏化され、その劥圓性を倱い、䞀般的に語る䟡倀がないず考える人もいたすが、蚀及する䟡倀はありたす。 このように聞こえたす分散システムは、次の3぀の特性のうち2぀以䞊を同時に持぀こずはできたせん-可甚性、䞀貫性、およびパヌティションの蚱容範囲です。



実際、デフォルトではパヌティションの蚱容範囲はどこにでもあるため、アクセシビリティたたは䞀貫性の2぀の遞択肢しかありたせん。 私は、ネットワヌクが切断された堎合、ネットワヌクが切断された堎合に自力で切断されるようなネットワヌク切断に耐えるこずができないシステムを知りたせん。



可甚性は、分散システムがあり、そのノヌドのいずれかを䜿甚し、回答を受け取るこずが保蚌されおいる堎合です。 デヌタをリク゚ストするず、このデヌタの叀いバヌゞョンを取埗できたすが、゚ラヌではなくデヌタを受信するか、このサヌバヌに到達しない可胜性がありたす。 デヌタを受け取った堎合、システムは利甚可胜です。



察照的に、システムは調和させるこずができたす。 䞀貫性ずはどういう意味ですか あるノヌドでデヌタを蚘録し、しばらくしお別のノヌドでこのデヌタを読み取ろうずするず、システムに䞀貫性がある堎合、他の堎所で蚘録したデヌタの新しいバヌゞョンが取埗されたす。



したがっお、分散システムは、APたたはCPの2぀のキャンプのいずれかに関連したす。







実際には、3番目の秘密クラスがありたす-それは単なるPですが、圌のシステムがそのようなものであるこずを認めたがっおいるデヌタベヌスメヌカヌはありたせん。 ぀たり、Pだけの堎合、アクセシビリティも䞀貫性もありたせん。



したがっお、システムがCP぀たり、䞀貫性ずパヌティション蚱容倀自䜓を呌び出す堎合、䞭断時にたずえば、クラスタヌがあり、2぀のデヌタセンタヌ間に間隔があり、デヌタセンタヌ間の接続が切れおいる堎合䞀貫したシステムですか ノヌドに目を向けるず、ノヌドは、このレコヌドを確実に提䟛できないこず、たずえばシステムのほずんどのノヌドず通信しおいないこずがわかるず、このレコヌドのアプリケヌションを単に拒吊し、倱敗したす。 その埌、接続が埩元されるず、アプリケヌションは再詊行でき、成功する可胜性がありたす。



たた、システムがAPず呌ばれる堎合、叀いデヌタを返すこずでアプリケヌションの芁求を満たすために最善を尜くしたす。曞き蟌み芁求を受け入れおどこかに曞き蟌み、クラスタヌ党䜓で実行できたす。 ここには埮劙な違いがありたす。 たずえば、クラスタヌを2぀に分割し、䞡方の郚分に曞き蟌む堎合、競合が発生する可胜性がありたす。 ある郚分では1぀のキヌに1぀のデヌタを曞き蟌み、別の郚分では別のデヌタを曞き蟌みたした。接続が埩元されるず、問題が発生したす。デヌタのどのバヌゞョンが正しいのでしょうか。



特にAPシステムの堎合、ロシア語ぞの倧たかな翻蚳で-最終的な䞀貫性-ずいう甚語を思い付きたした。これは、競合する゚ントリがなければ、い぀かクラスタヌが調敎された状態になるこずを意味したす。 。



しかし、珟実の生掻では、玛争の䞍圚に頌る必芁はなく、玛争にどのように察凊するかを事前に考えなければなりたせん。



競合する゚ントリが2぀ある堎合の最も簡単なオプションは、時間の競合を解決するこずです。倧たかに蚀えば、最埌の゚ントリがすべおの勝者よりも遅くなりたす。



さらにいく぀かのシステムは、このすべおをアプリケヌションにダンプしたす。 アプリケヌションがデヌタを読み取ろうずするず、デヌタベヌスは競合があるこずを認識するず、競合するすべおのバヌゞョンをアプリケヌションに返したす。アプリケヌション自䜓は、独自のロゞックによっお導かれ、正しいバヌゞョンを遞択しおデヌタベヌスに提䟛する必芁がありたす。



よりスマヌトなアプロヌチは、䞍可胜ではないにしおも非垞に難しい競合を匕き起こすデヌタ型を䜿甚するこずです。 たずえば、デヌタ型は耇数です。 クラスタヌが壊れおいお、半分にメンバヌAを远加し、残りの半分にBずCを远加した堎合。接続が埩元されたら、これらのレコヌドを保持するのは非垞に簡単です。結果セットA、B、C。



別の䟋はカりンタヌです。 カりンタヌを個別にむンクリメントし、接続が埩元されたら、それらを远加しお、結果のカりンタヌを取埗したす。 Riakデヌタベヌスには特別な甚語がありたす-CRDT-競合のない耇補デヌタ型を衚したす。 略語により、興味がある堎合はグヌグルで怜玢できたす。



NoSQLの䜿甚に぀いお話したしょう。 い぀䜿甚したすか





NoSQL ?









.







, . , — , . , -. . , - , . — . - — , , , - , - , - 3- service pack'a. , , .



連絡先



» sergei.tulentsev@gmail.com

» twitter

» tech.tulentsev.com



— HighLoad++ Junior .



たた、これらの資料の䞀郚は、高負荷システムHighLoadの開発に関するオンラむントレヌニングコヌスで䜿甚されたすガむドは、特別に遞択された文字、蚘事、資料、ビデオのチェヌンです。 私たちの教科曞にはすでに30以䞊のナニヌクな資料がありたす。 接続しおください



— " - ", , HighLoad++ Junior . NoSQL ?
確かに



All Articles