2017-02-25 1 views
1

現在、非常に多くのトランザクションを処理するMySQLデータベースがあります。簡単にするため、リアルタイムで表示されるアクション(クリックやその他のイベント)のデータストリームです。その構造は、ユーザーがサブアフィリエイトに属し、サブアフィリエイトがアフィリエイトに属するようなものです。リアルタイムのバランス更新を伴う大量のトランザクションのベストプラクティス

クリックのバランスを保つ必要があります。簡単にするため、ユーザー、サブアフィリエイト、アフィリエイトのクリックバランスを1ずつ増やす必要があるとします(実際にはイベントに応じて処理が増えます)。現在、私は非常に簡単にそれを行う - 私はイベントを受信した後、私はPHPでシーケンシャルなクエリを行う - 私はユーザーのバランスを読んで、1つずつインクリメントし、新しい値を格納し、私はサブアフィリエイト、など

私の最も重要な指標はユーザーの残高なので、できるだけリアルタイムで管理したいと考えています。サブアフィリエイトとアフィリエイトレベルの他の指標はそれほど重要ではありませんが、リアルタイムに近づくほど良くなりますが、5分遅れても大丈夫かもしれません。

プロジェクトが成長するにつれて、すでにボトルネックになっています。私は現在、天びんの計算をどのように再設計するかという選択肢を検討しています。私は新しいデザインが1日に5千万のイベントを処理できるようにしたいと思っています。また、私は単一のイベントを失うこともなく、SQLトランザクションでのクリック残高の各サイクルを実際にラップしています。

私は検討していますいくつかの点:

1 - さんは、5分ごとを言わせて、サブアフィリエイトとアフィリエイトレベルではない、リアルタイムで残高を更新するcronジョブを作成します。

2 - ストアドプロシージャを使用して、クランチングとバランスの更新をデータベース自体に移動します。別のデータベースを追加することを検討しています。多分、Postgressは仕事に適していますか?私は重大なパフォーマンスの改善があるかどうかを確認しようとしましたが、インターネットはその話題に分かれているようです。

3 - この特定のデータストリームを、寄木張りのhadoop(またはApache Kudu?)に移動し、必要に応じてサーバーを追加します。

4 - 既存のデータベースをシャーディングする、基本的に各アフィリエイトに別のdbサーバーを追加する。

このタイプのタスクにはいくつかのベストプラクティス/テクノロジがありますか?どんな助けも本当にありがとう!

答えて

0

私は高速摂取に関するアドバイスはhereです。あなたのケースでは、私が説明している卓球台に未処理の情報を収集し、カウンタの大部分をUPDATEsにするためにテーブルを要約する別のタスクを作成します。トラフィックのバーストがあるとき、それはより効率的になり、それによって倒れることはありません。

クリック残高(および「類似回数」)は、関連するすべてのデータとは別の表にする必要があります。これにより、システム内の他のアクティビティへの干渉を避けることができます。また、buffer_poolにキャッシュできるデータよりも多くのデータがある場合は、天びんのキャッシュ能力を向上させる可能性があります。

私のデザインには、(キープアライブ以外の)cronジョブは含まれていないことに注意してください。それはテーブルを処理し、テーブルを反転させ、できるだけ速く処理にループバックします。

0

私があなただったら、Redisのメモリ内ストレージを実装し、メトリクスを増やします。それは非常に高速で信頼性があります。このDBからも読むことができます。これらのデータをMySQL DBに保存するcronジョブも作成します。

0

あなたのWeb層は数字の処理をしていますか?&はHTTPリクエストを処理していますか?もしそうなら、最初にやりたいことは、これを作業キューに移動し、これらのイベントを非同期に処理することです。私はあなたがあなたのアイテム3でこれを知っていると信じています。

そこに多くのソリューションがあり、いずれかを選択の範囲は、この答えの範囲外ですが、いくつかのパッケージは検討する:

  • Gearman/PHP
  • Sidekiq /ルビー
  • アマゾンSQS
  • RabbitMQの
  • NSQ

...等...

ストレージの面では、達成しようとしているもの、高速読み込み、一括読み取り、シャーディング/ディストリビューション、高可用性...それぞれ異なる方向への回答になります。

-1

これは、Clustrixの優れた候補のようですが、これはMySQLの代替品です。シャーディングのような処理を行いますが、データを別々のデータベースに入れるのではなく、分割して同じDBクラスタ内のノード間でレプリケートします。彼らはそれをスライシングと呼び、DBはそれを自動的に行います。そして、それは開発者にとって透過的です。どのように処理されているのかを示すgood performance paperがありますが、実際にはリアルタイムデータの膨大な分析処理を吸収することができるスケールアウトOTLP DBです。

関連する問題