1

匿名の投票システムを実装する必要があります(ユーザー登録は不要です)。私は、単一のアイテムへの投票をIPごとに10に制限するのが最善のオプションであると判断しました(学校などを考慮に入れるため)。

これを回避するための最良の方法は何ですか。PHP+MySQLを使用しています。ピーク時には、1秒あたり最大20票になる可能性があります。専用のMySQLサーバーで負荷分散されたフロントエンドを使用しています。

私の心配は、投票ごとにデータベースに行を挿入し、そのデータをクエリして、制限に達しているかどうかをサーバーが処理するには多すぎる可能性があるかどうかを確認することです。

MongoDBか何かを見たほうがいいでしょうか?

他のアイデアはありますか?

4

6 に答える 6

4

「投票済み」ステータスをCookieに保存することをお勧めします。これにより、学校やオフィス全体が投票できるようになります。IPごとに10を実行すると、アドレスの1人のユーザーが10回投票できるようになります。

クッキーをクリアするなど、明らかにそれを回避する方法がありますが、それは良いオプションだと思います。

于 2011-07-16T16:02:00.283 に答える
3

ここでは、キー/値データベースの方が優れていると思います。
また、投票ごとに行を作成する必要はありません。IP ごとに 1 行だけ必要で、LIKE クエリを使用します。

INSERT INTO .. ON DUPLICATE KEY UPDATE
于 2011-07-16T16:06:13.340 に答える
2

匿名投票システムを実装したい(ユーザー登録はダメ)

IP はこの問題を解決する方法ではありません。多くの企業や学校では、数千人の人々がほんの数個の IP アドレスにマッピングされているためです。匿名投票のためにユーザーにログインさせたくない場合は、CAPTCHA (recaptcha) を使用して大量投票を保護することをお勧めします。他のすべての手法は、熟練したプログラマーによってバイパスされる可能性があるためです。IP アドレスを偽装することさえ可能です。多くの Linux ディストリビューションでは、簡単に IP を偽装できると思います。

alfred@alfred-laptop:~/bash$ apt-cache search ^fake$
fake - IP address takeover tool

http://en.wikipedia.org/wiki/IP_address_spoofing#Defense_against_spoofing :

認証のために IP ソース アドレスに依存しないように、ネットワーク プロトコルとサービスを設計することもお勧めします。

しかし、熟練したプログラマーは、recaptcha のような十分にテストされた CAPTCHA をバイパスすることはできません。投票するのは少し難しいですが、私の意見では、これが偽の投票に対抗する唯一の方法です. また、captcha は、投票システムを不正な投票に対して無防備にすることはできません。このようなシステムを構築する唯一の方法は、認証を使用することです。投票が許可されているユーザー (ID) のリストを保持します。

これを回避する最善の方法は何ですか。PHP + MySQL を使用しています。ピーク時には、1 秒あたり最大 20 票の投票が行われる可能性があります。

それは非常に高速であるため、Redisでさえ汗をかきません。

Redis は、オープン ソースの高度なキー値ストアです。キーには文字列、ハッシュ、リスト、セット、およびソートされたセットを含めることができるため、データ構造サーバーと呼ばれることがよくあります。

まず私のシステム情報。気に入っていますが、もうかなり古いです。

-Computer-
Processor       : 2x Intel(R) Core(TM)2 Duo CPU     T7100  @ 1.80GHz
Memory      : 2051MB (1403MB used)
Operating System        : Ubuntu 10.10
User Name       : alfred (alfred)
Date/Time       : Sat 16 Jul 2011 07:53:20 PM CEST
-Display-
Resolution      : 1280x800 pixels
OpenGL Renderer     : Unknown
X11 Vendor      : The X.Org Foundation
-Multimedia-
Audio Adapter       : HDA-Intel - HDA Intel
-Input Devices-
 Power Button
 Lid Switch
 Sleep Button
 Power Button
 AT Translated Set 2 keyboard
 Dell Dell USB Keyboard
 Logitech Trackball
 PS/2 Logitech Wheel Mouse
 Video Bus
-Printers (CUPS)-
Canon-MP150     : <i>Default</i>
HP-Photosmart-b110
-SCSI Disks-
HL-DT-ST DVDRAM GSA-T20N
ATA WDC WD1600BEVS-2

次に、redis サーバーのベンチマークを実行します。

alfred@alfred-laptop:~/database/redis-2.2.0-rc4/src$ ./redis-server --version
Redis server version 2.1.12 (00000000:0)

alfred@alfred-laptop:~/database/redis-2.2.0-rc4/src$ ./redis-benchmark 
====== PING (inline) ======
  10000 requests completed in 0.23 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

94.11% <= 1 milliseconds
97.77% <= 2 milliseconds
98.97% <= 3 milliseconds
99.02% <= 4 milliseconds
99.51% <= 6 milliseconds
99.88% <= 7 milliseconds
100.00% <= 7 milliseconds
44052.86 requests per second

====== PING ======
  10000 requests completed in 0.23 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

87.97% <= 1 milliseconds
97.44% <= 2 milliseconds
98.83% <= 3 milliseconds
99.41% <= 4 milliseconds
99.51% <= 5 milliseconds
99.70% <= 6 milliseconds
100.00% <= 6 milliseconds
43478.26 requests per second

====== MSET (10 keys) ======
  10000 requests completed in 0.37 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

11.02% <= 1 milliseconds
82.00% <= 2 milliseconds
93.94% <= 3 milliseconds
97.18% <= 4 milliseconds
98.17% <= 5 milliseconds
98.89% <= 6 milliseconds
99.44% <= 7 milliseconds
99.51% <= 9 milliseconds
99.52% <= 10 milliseconds
100.00% <= 10 milliseconds
26881.72 requests per second

====== SET ======
  10000 requests completed in 0.24 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

86.50% <= 1 milliseconds
96.08% <= 2 milliseconds
97.45% <= 3 milliseconds
97.87% <= 4 milliseconds
99.02% <= 5 milliseconds
99.51% <= 6 milliseconds
99.52% <= 7 milliseconds
100.00% <= 7 milliseconds
40983.61 requests per second

====== GET ======
  10000 requests completed in 0.23 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

86.06% <= 1 milliseconds
97.51% <= 2 milliseconds
98.89% <= 3 milliseconds
99.65% <= 4 milliseconds
100.00% <= 4 milliseconds
42553.19 requests per second

====== INCR ======
  10000 requests completed in 0.23 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

90.72% <= 1 milliseconds
96.92% <= 2 milliseconds
98.12% <= 3 milliseconds
98.33% <= 4 milliseconds
99.27% <= 5 milliseconds
99.51% <= 7 milliseconds
100.00% <= 7 milliseconds
43103.45 requests per second

====== LPUSH ======
  10000 requests completed in 0.23 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

87.92% <= 1 milliseconds
96.35% <= 2 milliseconds
98.26% <= 3 milliseconds
99.51% <= 7 milliseconds
100.00% <= 7 milliseconds
42735.04 requests per second

====== LPOP ======
  10000 requests completed in 0.24 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

87.75% <= 1 milliseconds
96.67% <= 2 milliseconds
97.77% <= 3 milliseconds
98.64% <= 4 milliseconds
98.65% <= 5 milliseconds
99.80% <= 6 milliseconds
100.00% <= 6 milliseconds
41841.00 requests per second

====== SADD ======
  10000 requests completed in 0.23 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

89.55% <= 1 milliseconds
96.56% <= 2 milliseconds
97.80% <= 3 milliseconds
98.76% <= 4 milliseconds
99.50% <= 5 milliseconds
99.63% <= 6 milliseconds
100.00% <= 6 milliseconds
42553.19 requests per second

====== SPOP ======
  10000 requests completed in 0.25 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

88.12% <= 1 milliseconds
96.21% <= 2 milliseconds
97.45% <= 3 milliseconds
97.99% <= 4 milliseconds
98.53% <= 5 milliseconds
99.51% <= 6 milliseconds
100.00% <= 6 milliseconds
40322.58 requests per second

====== LPUSH (again, in order to bench LRANGE) ======
  10000 requests completed in 0.24 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

89.41% <= 1 milliseconds
96.05% <= 2 milliseconds
97.76% <= 3 milliseconds
98.76% <= 4 milliseconds
99.01% <= 5 milliseconds
99.51% <= 7 milliseconds
99.96% <= 8 milliseconds
100.00% <= 8 milliseconds
42016.81 requests per second

====== LRANGE (first 100 elements) ======
  10000 requests completed in 0.40 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

11.56% <= 1 milliseconds
76.23% <= 2 milliseconds
91.93% <= 3 milliseconds
94.47% <= 4 milliseconds
97.80% <= 5 milliseconds
99.23% <= 6 milliseconds
99.87% <= 9 milliseconds
100.00% <= 9 milliseconds
24937.66 requests per second

====== LRANGE (first 300 elements) ======
  10000 requests completed in 0.86 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

2.28% <= 1 milliseconds
10.90% <= 2 milliseconds
35.68% <= 3 milliseconds
63.74% <= 4 milliseconds
86.00% <= 5 milliseconds
92.65% <= 6 milliseconds
94.96% <= 7 milliseconds
97.50% <= 8 milliseconds
98.04% <= 9 milliseconds
98.75% <= 10 milliseconds
99.56% <= 11 milliseconds
99.96% <= 12 milliseconds
100.00% <= 12 milliseconds
11682.24 requests per second

====== LRANGE (first 450 elements) ======
  10000 requests completed in 1.15 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

1.13% <= 1 milliseconds
6.20% <= 2 milliseconds
10.38% <= 3 milliseconds
27.37% <= 4 milliseconds
53.45% <= 5 milliseconds
74.60% <= 6 milliseconds
89.41% <= 7 milliseconds
95.40% <= 8 milliseconds
98.04% <= 9 milliseconds
98.98% <= 10 milliseconds
99.46% <= 11 milliseconds
99.58% <= 12 milliseconds
99.73% <= 13 milliseconds
99.87% <= 14 milliseconds
100.00% <= 14 milliseconds
8695.65 requests per second

====== LRANGE (first 600 elements) ======
  10000 requests completed in 1.45 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

0.52% <= 1 milliseconds
6.23% <= 2 milliseconds
10.67% <= 3 milliseconds
16.37% <= 4 milliseconds
27.51% <= 5 milliseconds
46.06% <= 6 milliseconds
60.82% <= 7 milliseconds
79.70% <= 8 milliseconds
90.96% <= 9 milliseconds
96.01% <= 10 milliseconds
97.99% <= 11 milliseconds
99.43% <= 12 milliseconds
99.90% <= 13 milliseconds
100.00% <= 13 milliseconds
6896.55 requests per second

incr操作は必要なものであり、私のシステムが処理できることがわかります43103.45 requests per second

MongoDBか何かを見た方がいいでしょうか?

上記で証明されているように、 redisをお勧めします。

于 2011-07-16T18:13:49.860 に答える
1

IP フィールドのインデックスを作成し、文字列以外 (整数など) で表現することを検討してください。詳細については、こちらをご覧ください: http://daipratt.co.uk/mysql-store-ip-address/

さらに、adlawson によるクッキーのアイデアは優れています。両方を使用して、おそらく IP アドレスでアラートをトリガーするだけで、管理画面に移動して、それらの IP がシステムをだまそうとしているのか、学校であるのかを判断できます。

ipv6 に関する更新:現在の Web ホスティングに関して、ipv6 について十分に理解しているわけではないため、ipv6 だけを使用しているユーザーがいるかどうかはわかりません。もしそうなら、それらを保存する方法について、これらの投稿に示されているいくつかのアイデアを検討することができます:

于 2011-07-16T16:05:41.173 に答える
1

あなたが説明したように負荷分散はうまくいくはずです。専用の MySQL サーバーでは、そのクエリ率で問題が発生することはありません。MongoDB がこのような問題に役立つとは思いません。memcached のようなものはパフォーマンスがはるかに優れていますが、ある時点でより永続的な MySQL DB にデータを送信する必要があります。

代わりに Cookie を使用することについて adlawston に同意します。単一の IP から投じることができる投票の上限をまだ持つことができます

于 2011-07-16T16:08:18.147 に答える