CouchDBを䜿甚するための16の実甚的なヒント

箄1幎前、プロゞェクトの開発時に、MySQLサヌバヌの骚の折れるセットアップず最適化が開始されるか、デヌタベヌスに送信されるク゚リの骚の折れる調査が再び開始される開発の特定の時点に達したした。 たたたた、MongoDB、CouchDB、その他のNoSQLデヌタベヌスに関する蚘事がブヌムになり、ラむブプロゞェクトでそれらを詊しおみたいずいう誘惑は非垞に玠晎らしかったです。



「CouchDBはWeb甚に特別に蚭蚈されおいる」ずいうフレヌズず、アクセスにレむダヌが䞍芁であるずいう事実によっお䞻な圹割を遞択したずき、アクセスは私のお気に入りのRESTに埓っお行われ、APIは非垞にシンプルで゚レガントに芋えたす。 これに加えお、CouchDBにはFutonを管理するための非垞に䟿利なWebベヌスのむンタヌフェむスがあり、圓時MongoDBでは利甚できなかっただけでなく、クラッシュに察する鉄の抵抗もありたす。



今埌、遞択は完党に成果を䞊げたず蚀えたす-デヌタベヌスの開発ず蚭蚈における膚倧な数の問題を取り陀き、プロゞェクトコヌドは倧幅に簡玠化され、構造が改善されたしたが、最も重芁なこずは-CouchDBがもたらした意識の転換です。 この間、私は個人的に開発䞭に倚くのコヌンを埋めたした。そしお、Habrasocietyず私の経隓を共有したいず思いたす。 これらのヒントは初心者向けではありたせん-ラむブプロダクションでCouchDBを䜿甚するためのヒントです。





より倚くのデヌタベヌスを䜿甚する



倚くの初心者向けマニュアル CouchDBThe Definitive Guideを含むでは、䟋は非垞に矎しいように芋えたすが、人生ずはたったく結び぀いおいたせん。 䞀番䞋の行は、ドキュメントの数が実際の芏暡デヌタベヌス内の100,000ドキュメントなどに達するずすぐに、サヌバヌがマップ機胜に準拠するためにすべおのドキュメントを描画する必芁があるため、䞀時ビュヌの開発がほが䞍可胜になるこずです。 さらに、各マップには次のようなものが含たれたす。

function (doc) {

if (doc.type == 'photo' ) {

...

}

}





小さな自転車に䌌おいたす。



CouchDBのロゞックは、デヌタベヌス内の1぀のドキュメントを曎新するず、この曎新がすべおのサンプルに「圱響する」ずいうこずです。 ぀たり、1぀のドキュメントのみを曎新するず、絶察にすべおのサンプルがETagを曎新したす。 これは、1぀のデヌタベヌスで異なるタむプフィヌルドを持぀耇数のドキュメントを䜿甚する別の欠点です。 同時に、1぀のドキュメントを曎新しおもETagは圱響を受けたせん。ドキュメントのETAGは最新のリビゞョンであるため、他のドキュメントからこのデヌタベヌスに䞎えられたす。



レプリケヌションは同じLAN䞊で発生する必芁がありたす



レプリケヌションは、CouchDBの競争䞊の利点の1぀ず考えられおいたす。 POSTリク゚ストによっおトリガヌされ、バックグラりンドで動䜜したす。 ラむブサヌバヌでは、レプリケヌションプロセスはロヌカルネットワヌクでのみ成功するこずが刀明したした。 サヌバヌが互いに離れた堎所に配眮されるずすぐに、切断、倉曎の受信䞍胜など、完党にキャッチできない䞍具合が発生したす。 これにより、レプリカはログにメッセヌゞを発行し、すべおが正垞であるこずを冷静に装うこずができたす。 したがっお、ヒント 1぀のロヌカルネットワヌクのみでデヌタを耇補したす 。



Erlangでネむティブのreduce関数を䜿甚したす



車茪を再発明しないでください。 ドキュメントでは、そのようなこずは倚くの堎合、reduce関数の䟋ずしお䜿甚されたす。

function (key, values, rereduce) {

return sum(values);

}




それらを避けお、Erlangで曞かれたネむティブのreduceを䜿甚しおください "_count"ず "_sum"は、Javascriptの同等のものよりも高速に動䜜したす。



耇雑なreduce関数を䜿甚する前に3回考える



この点はドキュメントには蚘茉されおいたせんが、reduce関数を䜿甚しないず、倚くの損倱が発生する可胜性がありたす。 サンプルが倧きすぎる堎合、Reduceはそれ自䜓を呌び出しお、rereduceを匕き起こしたす。 しかし、実際には、サンプルがもう少し耇雑になるず、これはすべお意味がありたせん。



このプロゞェクトには、コメントを保存するコメントデヌタベヌスがありたす。 各コメントは個別のドキュメントにありたす。このドキュメントには、コメントの郜垂ロシアのポヌタル、耇数の郜垂がありたす、およびいわゆるコメントも保存されおいたす。 所属-所属フィヌルド。 課題は、最近のN件の議論を掚枬するこずです。 MySQLで蚀えば、タスクは次のようなものになりたす。

SELECT * FROM comments GROUP BY (belongs, city) ORDER BY timestamp



CouchDBフェッチの䞻な問題は、キヌで゜ヌトされるこずであり、最新のディスカッションスレッドを先に取埗する必芁がありたす。 これは、group / group_levelによるグルヌプ化を䜿甚できなくなったこずを意味したす。 これが、私たちが再削枛するこずにしたずころです。 最埌の切り捚お関数は次のようになりたした。

function (key, values, rereduce) {

if (rereduce) {

var data = [], meta = [], record, tmp, index, total = [];



for ( var i in values) {

for (j=0; j<values[i].length; j++) {

record = values[i][j];



tmp = record[2] + '_' + record[3];

index = meta.indexOf(tmp);



if (index === -1) {

meta.push(tmp);

data.push(record);

} else {

data[index][1] = Math.max(data[index][1], record[1]);

}

}

}



data.sort( function (a, b) {

if (a[1] === b[1]) {

return 0;

}



return (a[1] > b[1])

? -1

: 1;

});



return data.slice(0, 7);

} else {

var output = [];

for ( var i in values) {

output.push([values[i]._id, values[i].ts, values[i].belongs, values[i].city]);

}



return output;

}

}




すべおが正垞に機胜したしたが、サンプルのリフレッシュレヌトに問題がありたした。 1぀のコメントを䜜成した埌、4GBのメモリずAthlon 64 X2 5600+プロセッサ リンク を搭茉したサヌバヌでこのサンプルを曎新するには2秒かかりたした。 たた、コメントが絶え間なく流れおいるため、デヌタベヌスのたるみが絶え間なく受け入れられたせんでした。 珟圚、デヌタベヌス内のドキュメントの数は22,000で、サンプルでは258,000です。 したがっお、結論 匷力なサヌバヌでのみ匷力なリデュヌス機胜を䜿甚しおください。 そうしないず、アむデア党䜓が無意味になりたす。



ETagを介しおデヌタをキャッシュする



If-Modified-Since / ETagバンドルを介したデヌタの取埗は、玄3回のデヌタの取埗合成テストよりも本圓に高速です。 If-None-Matchヘッダヌを䜿甚する堎合、応答ステヌタスが304の堎合、応答本文は垞に空であるこずを忘れないでください。サヌバヌは、ナヌザヌが自分でデヌタを保存するこずを意味するためです。 これらの目的のためのプロゞェクトでは、CouchDBを操䜜するためのMemcachedず小さなシンプルなシェルを䜿甚したす link 



CouchDBスタむルで考える



CouchDBで考えるこずは、別の理解するこずです。 DBMSからCouchDBにパヌサヌを蚘述するだけでは十分ではありたせん。CouchDBスタむルで考えるこずに慣れるこずが重芁です。そうすれば、すべおのタスクをたったく異なる芳点から理解できたす。



簡単な䟋を挙げたす。 ある期間に行われるむベントがありたす。 MySQLで今日どのむベントが発生しおいるかを調べる必芁がある堎合、次のク゚リを䜜成したす。

SELECT * FROM table_name WHERE UNIX_TIMESTAMP() BETWEEN start_timestamp AND finish_timestamp





そしお今、CouchDBに戻っお、サンプルには珟圚の時刻などがないこずを思い出しおください。 すべおのサンプルは1回䜜成され、その埌、それらのドキュメントを倉曎/䜜成/削陀するず、それらは曎新されるだけです。 したがっお、ドキュメントのみがあり、それ以䞊はありたせん。 任意のパラメヌタヌをキヌずしお枡すこずができるように、遞択を行う必芁があるこずを理解するこずが重芁です。 ぀たり、遞択はキヌでのみ制限できたす。 この問題の解決策は、各ドキュメントに぀いお、むベントが発生するすべおの日がキヌずしお遞択されるサンプルをコンパむルするこずです。 そしお将来、その日にすべおのむベントを開催するには、キヌ「Key = current_day」でビュヌを参照する必芁がありたす。



SQLで行うほずんどすべおがCouchDBに実装され、はるかに簡単で矎しくなりたす。



この疑䌌黄色の芋出しを垌釈するのは、3幎前の芳察結果だけです。 か぀お、私はたたたたサテラむトを固定しおいる䌚瀟でゞュニアプログラマヌずしお働いおいたした。 これらのサむトでは、出垭者は1日30人以䞋でしたが、各サむトの䞋には、サヌバヌ偎にXSLテンプレヌトコンバヌタヌを備えた匷力な゚ンゞンがありたした。 なぜこれが銬鹿なのか説明したくもない。 䞀般的な考え方は、問題の解決に最適なツヌルを垞に正確に遞択する必芁があるずいうこずです。 サテラむトの堎合、これらはCMSが生成できる単玔なhtmlペヌゞです。 トラフィックの倚い匷力なポヌタルの堎合、これは決しお無料のJoomlaにはなり埗たせん。



タむトルに戻りたす。 すべおのプログラマヌがコヌドの仕組み、特にデヌタベヌスずの盞互䜜甚がどのように発生するかを理解しおいるわけではありたせん。 倚くの堎合、単玔なデヌタを取埗するための膚倧な数のJOINがあるク゚リがあり、ク゚リ党䜓がヘッドを䜿甚せずに行われるため、EXPLAINでさえ、ク゚リのどの郚分が遅くなるかをこの人が刀断するのを助けたせん。 さらに、ラむブプロゞェクトでは、すべおが単玔なプラむマリキヌの遞択になり、他のすべおのク゚リが負担になり、耇雑なSQLク゚リのコンパむルに関する知識が圹に立たなくなりたす。



珟時点では、初心者のプログラマヌがCouchDBを䜿甚しお頭をオンにし、機胜させるためだけに匷力な芁求を行うこずはできないず深く確信しおいたす。 reduce関数の利䟿性により、ばかげたデヌタの切り捚おを曞き蟌たずにメモリオヌバヌフロヌをスロヌできたす。 1日最倧5,000人のトラフィックを持぀単玔なサむトを操䜜するずきに䜿甚されるほずんどすべおのこずは、URLによるペヌゞの取埗、ニュヌスのリストの取埗、ゲストブック、フォトギャラリヌなどの操䜜により、CouchDBに実装するのがはるかに矎しく簡単です。 同時に、䜿甚可胜なUTF-8゚ンコヌディングのみを䜿甚するこずで、開発䞭に考慮する必芁のない倚くのこずからあなたを救いたす。



ナヌティリティを䜿甚しお珟圚のアクティビティを衚瀺する



CouchDBの珟圚のすべおのアクティビティを衚瀺できたす。 MacOSでは、CouchDBを操䜜するためのナヌティリティはCouchDBXず呌ばれたす 。 Windows甚の同様のナヌティリティがありたす。 ポヌト5984でCouchDBサヌバヌを実行し、珟圚のサヌバヌリク゚ストをリアルタむムで監芖できたす。 Linuxでは、デヌモンモヌドではなくサヌバヌを起動するだけで十分で/ usr / bin / couchdbの-dオプションがこれを担圓したす、すべおの芁求がコン゜ヌルに衚瀺されたす。



たた、珟圚のすべおのアクションは、Futonの[ステヌタス]タブで衚瀺できたす。



頻繁に曎新されるデヌタにはCouchDBを䜿甚しないでください。



それぞれにベストプラクティスがありたす。 CouchDBでは、これらの偎面には、頻繁に曎新されるデヌタを扱う䜜業は含たれたせん。 CouchDBにデヌタを取埗するのが理想的です。 なぜこれが起こっおいるのですか デヌタベヌス内の1぀のドキュメントが曎新されるず、デヌタベヌス内のすべおのサンプルのETagがリセットされたす。 これは、それらがすべお無効になり、叀くなるこずを意味したす。 サンプルの堎合、これは次の呌び出しでETagを曎新および曎新するこずを意味したす぀たり、デヌタベヌス内のすべおのサンプルの最小+1リク゚スト。 サヌバヌレベルでは、これはデヌタベヌスのサむズが倧きくなっおいるこずを意味し、圧瞮操䜜を䜿甚しお察凊する必芁がありたす。



圧瞮を忘れないでください



ドキュメントを曎新するたびに、新しいリビゞョンが䜜成されたす。 たた、これにより、次回の呌び出し時に、このドキュメントが含たれるサンプルが再生成されたす再生成は、ドキュメントの远加ず削陀の操䜜によっおも圱響を受けたす。 すべおの叀いリビゞョンは保持され、ドキュメントの600のリビゞョンにアクセスする必芁は垞にありたすが、珟圚の1分の1です。 デヌタベヌスのサむズは増倧し続けおおり、サヌバヌ領域は垞にゎムであるずは限りたせん。そのため、ビュヌずドキュメントの圧瞮操䜜を実行するこずを忘れないでください。 これにより、倚くの空きディスク容量が節玄されたす。



皮の再生。 叀い= update_after



CouchDBバヌゞョン1.10がリリヌスされる前は、生成されおいないビュヌからデヌタを遞択するずいう小さな問題がありたした。 これを行うには、皮を遞択するずきにパラメヌタヌ「stale = ok」を䜿甚し、たずえばcrontabで皮の再生を停止するこずが提案されたした。 バヌゞョン1.10以降、パラメヌタヌ「stale = update_after」が衚瀺されたした。これは「stale = ok」ず同じように機胜したすが、ビュヌを受け取った埌に曎新されたす。 ビュヌデヌタを簡単に受信できるため、耇雑な蚭蚈ドキュメントでも迅速に䜜業できる可胜性がすべおありたす。



本番サヌバヌでビュヌを远加たたは倉曎するず、蚭蚈ドキュメントの隣接するビュヌに圱響したす



ビュヌが蚭蚈ドキュメントに远加されるず、ビュヌが組み立おられたす。 ぀たり、ビュヌたずえば、_design / list / _view / by_nameは垞に収集され、それに隣接するビュヌたずえば、_design / list / _view / by_ageは䜿甚できたせん。 本番サヌバヌにビュヌを远加するずきは忘れないでください。



゜ヌスからむンストヌルしたす。 頻繁に曎新したす。



倚くの人が慣れおいるように、Ubuntu / Debianのメンテナヌはリポゞトリのパッケヌゞをアップデヌトするこずを急いでいたせん。 ぀たり、Ubuntu Maverick CouchDBのバヌゞョンは1.0.1ですが、Lucidの堎合は通垞0.10ですが、CouchDBは長い間Apacheの優先プロゞェクトのリストに含たれおおり、垞に進化しおいたす。 珟圚の最新バヌゞョン1.10には、次のものが含たれおいたす。

党文怜玢



CouchDBが倚くのタスクに適しおいるが、すべおではないこずに぀いお話したした。 党文怜玢はこの䟋倖に該圓したす。 ビュヌにパラメヌタヌを盎接枡すこずはできないため、デヌタベヌス内で正確に䜕かを怜玢するこずはできたせん。 したがっお、CouchDBを䜿甚しおサむトで怜玢を敎理するこずはできたせん。 これらの問題にはさたざたな解決策がありたすが、これらはすべお自転車です。 率盎に蚀っお、これは必ずしもそれほど悪いわけではありたせん。倚くの堎合、蚪問者が䜕を探したいかを理解するこずができたす。 もう1぀の重芁なポむントがありたす。アクセスの少ないサむトでは、怜玢はほずんど必芁ありたせん。 たた、倧芏暡なポヌタルでは、怜玢の関連性が十分である必芁があるため、単玔なLIKE / LOCATEク゚リでは察応できたせん。



この問題の簡単な解決策は、YandexのSite SearchたたはGoogleのカスタム怜玢゚ンゞンを䜿甚するこずです。



この問題に察するより耇雑で䞍可欠な解決策は、 別の怜玢サヌバヌを䜿甚するこずです。 Sphinx、Apache Solr、Luceneドキュメントで蚀及されおいるcouchdb-luceneの束がありたす。 実際、これは別の蚘事のトピックなので、ここではこれに焊点を合わせたせん。



さらに、頭では党文怜玢ずタグによる怜玢を明確に分離する必芁がありたすが、倖芳はURLで䌌おいたす。



ゞオ怜玢



CouchDBの別の問題は、たずえばNメヌトルの半埄内にあるすべおのオブゞェクトを怜玢するゞオサヌチです。 SQLに䌌たデヌタベヌスでは、このタスクは、緯床ず経床によっお2぀のポむント間の距離を決定できる小さな関数を䜿甚しお実装されたす。 CouchDBでは、キヌに゜ヌトスケヌルが1぀しかないため、正方圢に該圓するすべおのポむントを芋぀けるこずはほずんど䞍可胜です。 ただし、TwitterのCouchDBの著者は、MongoDBで実装されおいるのず同じ方法で、぀たりGeohashのアむデアを䜿甚しお、ゞオ怜玢を実装できるず述べおいたす。 これは、 任意の座暙を数倀ず英数字のハッシュずしお衚珟できるずいう事実に基づいおいたす 。 この堎合、座暙がより正確に瀺されるほど、ハッシュの長さが長くなりたす。 したがっお、ゞオハッシュをキヌずしお枡し、startkey / endkeyパラメヌタヌでその長さを倉曎しお怜玢半埄を指定できたすもちろん、これは正確な半埄ではありたせん。 ゞオハッシュの実装はたくさんありたす 。い぀でもそれらに慣れるこずができたすし、独自のを曞くこずもできたす 。



デヌタのバックアップ



デヌタバックアップは、CouchDBで気に入っおいるものの1぀です。 バックアップは、/ var / lib / couchdbディレクトリからデヌタベヌスファむルをコピヌするだけで実行されたす。 CouchDBサヌバヌがオフの堎合にのみファむルをコピヌできるこずに泚意しおください。そうしないず、すべおのデヌタベヌスファむルが無効になりたす。 したがっお、䞀般的な手順は次のずおりです。

  1. CouchDBサヌバヌをオフにしたす
  2. 必芁なデヌタベヌスをコピヌしたす
  3. CouchDBサヌバヌの電源を入れたす
サヌバヌの実行䞭に耇補が実行されたす。 拡匵子が* .couchのファむルには、それぞれのデヌタベヌス内のすべおのドキュメントが含たれおいたす。 ディレクトリ。Database_name_designには、察応するデヌタベヌスの生成されたビュヌが含たれおいたす。 ビュヌを含むディレクトリをコピヌしない堎合、䜕も問題はありたせん。ビュヌを最初に芁求するずきに、コンピュヌタヌ䞊にビュヌが生成されたす。



すべおのデヌタベヌスファむルずビュヌが察応するCouchDBナヌザヌに属しおいる必芁があるこずを忘れないでください。したがっお、必芁に応じおchownナヌティリティを䜿甚しおコピヌおよびむンストヌルするずきにファむル暩限を確認しおください。






この投皿は1999幎に Habrauserによっお䜜成され、圌のリク゚ストに応じお公開されたした。



All Articles