Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

成長するにつれてデータベースのスケーリングを容易にするための簡単なヒント

若いプロジェクトに取り組んでいるときは、後で拡張するのが簡単または困難になるような意思決定を常に行っています。より速く出荷できるように、技術的負債を少し増やすために、短期的な利益を選ぶのが良い場合があります。しかし、別の方法があることを知らなかったために技術的負債を受け取ることもあります。

これは、ここHoneybadgerで、私たちの生活を必要以上に困難にするいくつかのことを行ったためです。いくつかの重要なポイントを理解していれば、スケーリングはそれほど苦痛ではなかったでしょう。

UUIDを使用する

「主キー」と言うとき、私たちのほとんどは自動インクリメント番号を思い浮かべます。これは小規模なシステムではうまく機能しますが、スケーリングすると大きな問題が発生します。

常に、1つのデータベースサーバーのみが主キーを生成できます。つまり、すべて 書き込みは単一のサーバーを経由する必要があります。 1秒間に何千もの書き込みを実行したい場合、これは悪いニュースです。

UUIDを主キーとして使用すると、この問題を回避できます。それらに精通していない場合、UUIDは次のような一意の識別子です:123e4567-e89b-12d3-a456-426655440000

ウィキペディアでの説明は次のとおりです。

標準的な方法に従って生成された場合、UUIDは、中央の登録機関やそれらを生成する当事者間の調整を必要とせずに、実用的な目的で一意になります。 UUIDが複製される確率はゼロではありませんが、ゼロに非常に近いため無視できます。

したがって、誰でもUUIDを作成し、それを使用して、他の何かを識別するためにすでに作成された識別子と重複せず、将来複製されないことをほぼ確実に識別できます。したがって、独立した当事者によってUUIDでラベル付けされた情報は、識別子間の競合を解決する必要なしに、後で単一のデータベースに結合したり、同じチャネルで送信したりできます。

UUIDを主キーとして使用すると、すべての書き込みが単一のデータベースを経由する必要がなくなります。代わりに、それらを多くのサーバーに分散させることができます。

さらに、のレコードのIDを生成するなどの柔軟性を提供します。 データベースに保存されます。これは、レコードをキャッシュサーバーまたは検索サーバーに送信したいが、データベーストランザクションが完了するのを待ちたくない場合に役立つことがあります。

RailsアプリでデフォルトでUUIDを有効にするのは簡単です。設定ファイルを編集するだけです:

# config/application.rb
config.active_record.primary_key = :uuid

Railsの移行では、個々のテーブルにUUIDを使用できます:

create_table :users, id: :uuid do |t|
  t.string :name
end

これは単純な構成オプションであり、開発を開始するときに有効にすると、スケーリングを試みるときに問題の世界を救うことができます。追加のボーナスとして、ボットや悪意のある人物があなたのプライベートURLを推測するのが難しくなります。

カウントとカウンター

探し始めると、カウントとカウンターがいたるところにあります。電子メールクライアントには、未読の電子メールの数が表示されます。ブログには、投稿の総数を使用してページ数を計算するページ付けフッターがあります。

カウンターには2つのスケーリングの問題があります:

  1. select count(*) from usersなどのデータベースクエリ 本質的に遅いです。それらは、レコードセット内の各レコードを文字通りループして、結果を生成します。 100万件のレコードがある場合は、しばらく時間がかかります。
  2. 「カウンターキャッシュ」を使用してカウンターを高速化する試みは機能しますが、書き込みを多くのデータベースサーバーに分散する機能が制限されます。

最も簡単な解決策は、可能な限りカウンターの使用を避けることです。これは、初期設計を行うときにはるかに簡単です。

たとえば、カウントではなく日付範囲でページングすることを選択できます。後で生成するのは地獄のような、やや有用な統計を表示しないことを選択する場合があります。あなたはその考えを理解します。

データの期限切れとウェアハウジング

RAM、CPU、およびディスクIOの量を考えると、1つのpostgresテーブルに保存できるデータの量には上限があります。つまり、古いデータをメインテーブルから移動する必要がある場合があります。

簡単なケースを見てみましょう。数ギガバイトのデータベースで1年以上前のレコードを削除したい。

この問題に一度も対処したことがない場合は、次のようなことをしたくなるかもしれません。

MyRecords.where("created_at < ?", 1.year.ago).destroy

問題は、このクエリの実行に数日または数週間かかることです。データベースが大きすぎます。

手遅れになるまで自分が持っていることに気付かないことが多いので、これは特に苦痛な問題です。会社が若く、データベースに1,000のレコードがある場合、データパージ戦略について考える人はほとんどいません。

事前に計画を立てることができれば、簡単な解決策があります。テーブルを分割するだけです。すべてのデータをmy_recordsに書き込む代わりに 今週のデータをmy_records_1に書き込みます 来週のデータをmy_records_2に送信します 。先週を削除するときは、drop table my_records_1だけです。 。削除とは異なり、このクエリは非常に迅速に完了します。

日付以外のフィールドで分割することも可能です。ユースケースに適したものは何でも。

すべての詳細を処理し、コードの行を変更せずにデータベースをパーティション化できるpg_partmanという名前のpostgres拡張機能もあります。または、Rubyでパーティショニングを管理したい場合は、パーティショニング可能と呼ばれる便利なgemがあります

別れの言葉

次回、プロジェクトを最初から作成することに気付いたときは、少し時間を取ってスケーリングについて考えることをお勧めします。それに執着しないでください。 HAMLとERBのどちらを使用するかを心配するのに何日も費やさないでください。ただし、事前に計画を立てるだけで簡単に獲得できる勝利はないかどうかを自問してください。


  1. Google Reply:チャットをもっと簡単に

    AI は、その誕生以来、私たちの生活を楽にするアプリケーションを毎日提供しています。 AI を搭載した Google Reply アプリがまもなくリリースされます。メッセージを自動化するように設計されています。つまり、このアプリでは、WhatsApp、Facebook Messenger、ハングアウト、Android メッセージ、Twitter DM などのソーシャル メッセージング アプリを介してメッセージを送信できます。 このアプリは、パーソナライズとエクスペリエンスを向上させるために、Gmail アカウントによって相互にリンクされます。もう少し詳しく教えてください。 Google Re

  2. Alexa を賢くする 5 つの簡単な方法

    ほんの 10 年前は、音声コマンドだけでお気に入りの曲を購入したり再生したりできるとは、誰も想像できませんでした。何年にもわたって、テクノロジーは、あなたも私たちも想像もできなかった美​​しく革新的な驚きを提供してきました. これまでのところ、2017 年は技術革新と新しいガジェットの点で注目に値する年でした。そのような特別なデバイスの 1 つが Amazon Alexa スマートスピーカーです。しかし、それをさらに「賢く」するためにできることがいくつかあることをご存知ですか? そうでない場合は、始めましょう! ボイス プロファイルの設定 Alexa はあなたの音声コマンドを聞