1173873727 レンタルブログのようなサービスを構築中です。


ユーザーのログ(書き込み内容)をMYSQLにするかSQLiteにするか悩んでいます。
MYSQLはレプリケーションなどの技術で負荷分散は出来るかと思うのですが、書き込み専用のマスターに関しては負荷分散が一筋縄ではいかないとの情報もあり、今後負荷が大きくなった場合、心配です。

そこで、SQLiteで「1ユーザー」につき「1DB」という考え方で、DBの負荷分散の煩わしさを回避出来ないかと考えてます。SQLiteを使った場合の私の考え方等は「添付画像」をご覧下さい。

MYSQLはMixiのようなサービスで、各ユーザーが互いに関係を持つ場合に有効な手段と解釈してますが、この考え方は間違っていますでしょうか?逆に今回私が構築しようとしているサービスは、各ユーザーが直接なんの関係も持たないので、
このような場合はSQLiteのような単体のDBでも全く問題ないと思うのですが如何でしょうか。むしろDBサーバーへの接続コスト?もかからないし、先述しましたDBサーバーの負荷分散も行わなくても良いと思うのですが、この考え方は的外れでしょうか。

よろしく御願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2007/03/15 23:10:27
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kurukuru-neko No.4

回答回数1844ベストアンサー獲得回数155

ポイント30pt

1.基本的に全体をコーディネートする為の

  データベース相当のようなものが必要に

  なります。

  この仕組みはレプリケーション、

  クラスター等の仕組みか

  共有ディスクを利用する。

2.多量のデータベースを利用する場合

  スケールアップするとどうなるか考えて

  みるか考えてみる。

  ユーザーに比例してデータベースが増えます。

  一般的に大部分のユーザーはアクティブ

  ではありません。 

  それぞれが相互リンクするような場合

  個別のデータベースにアクセスすることに

  なり。 リンク参照数に比例して同時に

  複数のWEB経由のデータベース接続が

  多数必要となります。これを方式で

  稼動させる場合、特定の人気あるコンテンツ

  、ユーザーが存在する場合局所的に負荷が

  発生すると対処できない。

  SQLiteはファイルベースの

RDBMSなのでサーバーは不要。

  しかし実際Web経由で利用した

  場合個々のプログラムが直接ファイル

  をアクセスし検索を行う時、個別の

  プログラムが個別に利用するメモリー

  、CPUはサーバータイプよりは多くなる。

  実現案の考え方は、共有レンタルサーバ

  を沢山容易したのと同じです。

  この設計でスケールアップ可能な前提条件

  は個別の負荷が均等である事、個別のDB

  間で相互リンクが殆どない事ですが

  普通そうはならない。

3.その他問題

  サービスを行う場合、サーバー1台が

  止まるるだけで原理的にそのサーバーの

  サービスは利用できなくなってします。

  対応方法はある。(共有ディスク等)

  しかし、結構コストが高い。

id:uniuniko

ご回答ありがとう御座います。

とても参考にになりました。


特定の人気あるコンテンツ、ユーザーが存在する場合局所的に負荷が発生すると対処できない。

なるほど、ご指摘ありがとう御座います、この点は気付きませんでした。


SQLiteはファイルベースのRDBMSなのでサーバーは不要。しかし実際Web経由で利用した場合個々のプログラムが直接ファイルをアクセスし検索を行う時、個別のプログラムが個別に利用するメモリー、CPUはサーバータイプよりは多くなる。実現案の考え方は、共有レンタルサーバを沢山容易したのと同じです。この設計でスケールアップ可能な前提条件は個別の負荷が均等である事、個別のDB間で相互リンクが殆どない事ですが普通そうはならない。

現段階では、ユーザー同士は一切干渉しない仕組みを考えており、全体の検索なども行わない予定です。しかし、「普通そうはならない。」とのことで、やはり計算通りに行かない場合がありそうですね、、


サービスを行う場合、サーバー1台が止まるるだけで原理的にそのサーバーのサービスは利用できなくなってします。対応方法はある。(共有ディスク等)しかし、結構コストが高い。

そのようなリスクもあるのですね、全く考えていませんでした。参考になります。


MySQLで構築したほうが良さそうな気がしてきましたが、引き続きお気付きの点御座いましたら、よろしく御願いします。

2007/03/15 19:42:08

その他の回答4件)

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント20pt

そもそも複数の SQLite DB に同じユーザーのログが格納されるようですが、これはどうやって同期を取るのですか?

また、MySQL で1ユーザーに付き1DBや1テーブルを割り当てた場合と何が違うのでしょうか?

的外れかどうか以前に、比較が適切ではないと思います。


DBサーバーへの接続コストは SQLite であってもかかります。小規模とは言えれっきとした RDBMS ですから。

むしろ多数のDBが同時に動く事によってメモリやディスクの管理が効率的に行えるのかどうかが疑問です。

id:uniuniko

ご回答ありがとう御座います。

DBに関して初心者であるため、ちょっとおかしな質問だったようですね、、

一応、解る範囲で回答させて頂きますので、もしよろしければ引き続き御願いします。


>これはどうやって同期を取るのですか?

上記ですが、同期とはどのようなことでしょうか。添付画像の「SQLiteを使った場合」のサーバースケールアウトの図を見て頂けれる構造は解ると思いますが、ユーザー間の同期などは特に必要としませんので、問題はないと思うのですが、それとはまた別の問題でしょうか。「ユーザー1のSQLite DB(ログ)」という部分で「ユーザー1」に関して全て完結している状態です。このDBの中には「ユーザー1」の様々なテーブルが入る予定です。(例)ブログ記事テーブル、コメント記事テーブル、ブログ設定テーブル....等。このようなSQLiteのDBがユーザー毎に存在するという考え方です。


>MySQL で1ユーザーに付き1DBや1テーブルを割り当てた場合と何が違うのでしょうか?

私の考えでは、MYSQLはサーバー型のDBなので、100ユーザーいたら100個の異なるDBが起動してそれぞれ別々MYSQLプロセスが立ち上がってしまうのでは、、と考えていました。もちろん100個も200個もユーザーごとに、MYSQLのDBを置くのはさすがにNGだと思いますので、MYSQLの場合、1DB内で色々とテーブルを分けて管理した方がいいのは解ります。ところがSQLiteでは100個の異なるプロセスは別々に立ち上がらないのでは?と思った次第です。SQLiteは別プロセスを必要としないデータベースエンジンと聞きました。普通の掲示板などスプリクトでテキスト形式のログで管理するものがよく御座いますが、それに近いものと判断していましたが、やはりこのような使い方はあまり良くないのでしょうかね、、


>DBサーバーへの接続コストは SQLite であってもかかります。

>むしろ多数のDBが同時に動く事によってメモリやディスクの管理が効率的に行えるのかどうかが疑問です。

接続コストは発生するのですね。また、SQLiteであってもDBが同時に動く事でやはりネックになるのですね。了解しました。SQLiteは別プロセスを必要としないデータベースエンジンと聞いたので、MYSQLのようなサーバー型DBと比べ負荷がかなり低いのでは考えてました。

2007/03/15 01:11:55
id:b-wind No.2

回答回数3344ベストアンサー獲得回数440

ポイント20pt

ユーザー間の同期などは特に必要としません

サーバー1のユーザー1用 SQLite DB とサーバー2のユーザー1用 SQLite DB の関連が分かりません。

同期が必要ないのであれば、MySQL でも同期を取らなければ済むだけの話です。


MYSQLはサーバー型のDBなので(中略)それぞれ別々MYSQLプロセスが立ち上がってしまうのでは

テーブルで分ければ1つのDBで済みます。


SQLiteでは100個の異なるプロセスは別々に立ち上がらないのでは?

100人からアクセスされれば100個のDBをオープンする必要があります。

たしかに「プロセス」という形にはなりませんが、それは他の問題に比べれば些細な違いです。


SQLiteは別プロセスを必要としない(中略)負荷がかなり低いのでは考えてました。

場合によります。

最小構成では低い場合もありますが、多数のDBをオープンしなければならないのではむしろリソースの無駄が多いでしょう。

一般に Web アプリケーションは多数のユーザーからの同時アクセスを考慮しなければなりません。


結論から言うと MySQL でも SQLite でもいいですが、1つのテーブルに全ユーザー分のデータを入れたほうが管理性も性能も上でしょう。

検索の必要が無く、同期の必要も無いのであれば単なるファイルに追加するほうが早いですし。

id:uniuniko

ご回答ありがとう御座います。


サーバー1のユーザー1用 SQLite DB とサーバー2のユーザー1用 SQLite DB の関連が分かりません。

同期が必要ないのであれば、MySQL でも同期を取らなければ済むだけの話です。

すいません、図が解りにくかったようですね、、サーバー1のユーザー1とサーバー2のユーザー1は全く別のものです。

サーバー2のユーザー1は「サーバー2のユーザー3」などと説明するべきでした。


テーブルで分ければ1つのDBで済みます。

ありがとう御座います。こちらは理解出来ております。


100人からアクセスされれば100個のDBをオープンする必要があります。

たしかに「プロセス」という形にはなりませんが、それは他の問題に比べれば些細な違いです。

そうですね、様々なボトルネックがありますので、一概には言えないですね。参考になりました。


場合によります。

最小構成では低い場合もありますが、多数のDBをオープンしなければならないのではむしろリソースの無駄が多いでしょう。

一般に Web アプリケーションは多数のユーザーからの同時アクセスを考慮しなければなりません。

結論から言うと MySQL でも SQLite でもいいですが、1つのテーブルに全ユーザー分のデータを入れたほうが管理性も性能も上でしょう。

検索の必要が無く、同期の必要も無いのであれば単なるファイルに追加するほうが早いですし。

明確なご回答ありがとう御座います。参考になりました。「Mixi」もこの「はてな」もそのような形式ですしね。

引き続きご意見が御座いましたら御願いします。

2007/03/15 01:55:52
id:b-wind No.3

回答回数3344ベストアンサー獲得回数440

ポイント20pt

テーブルで分ければ1つのDBで済みます。

訂正。テーブルだけでなくデータベースが複数でも同じです。

MySQL は一つのプロセスで複数のデータベースを扱えます。


「Mixi」もこの「はてな」もそのような形式ですしね。

自分の知る限り、「Mixi」も「はてな」も単一DBではなく会員番号等でパーティショニングしているはずです。

参照系の情報はその上でレプリケーションなどを行い複数の方法で負荷分散しています。


想定するユーザー数とデータ量によって最適な解は変わってきます。

参考にするには規模が大きすぎて方法論が違うように思いますが。

id:uniuniko

ご回答ありがとう御座います。


訂正。テーブルだけでなくデータベースが複数でも同じです。

MySQL は一つのプロセスで複数のデータベースを扱えます。

大変貴重な情報ありがとうございます。MySQLはそのようなことも出来るんですね。


自分の知る限り、「Mixi」も「はてな」も単一DBではなく会員番号等でパーティショニングしているはずです。

参照系の情報はその上でレプリケーションなどを行い複数の方法で負荷分散しています。

想定するユーザー数とデータ量によって最適な解は変わってきます。

参考にするには規模が大きすぎて方法論が違うように思いますが。

Mixiに関してはBatara氏の文献を何度も読みましたが、独自に色んな工夫を行って、徐々にスケールアップしたようですね。この辺はなんとなくは理解出来ています。

http://itpro.nikkeibp.co.jp/article/NEWS/20060330/233820/

ただ、最初から大規模でも対応出来るようなシステムは構築できないかと、調べている状態です。後々構成を変更しなくても良いシステムが理想です。

2007/03/15 19:41:57
id:kurukuru-neko No.4

回答回数1844ベストアンサー獲得回数155ここでベストアンサー

ポイント30pt

1.基本的に全体をコーディネートする為の

  データベース相当のようなものが必要に

  なります。

  この仕組みはレプリケーション、

  クラスター等の仕組みか

  共有ディスクを利用する。

2.多量のデータベースを利用する場合

  スケールアップするとどうなるか考えて

  みるか考えてみる。

  ユーザーに比例してデータベースが増えます。

  一般的に大部分のユーザーはアクティブ

  ではありません。 

  それぞれが相互リンクするような場合

  個別のデータベースにアクセスすることに

  なり。 リンク参照数に比例して同時に

  複数のWEB経由のデータベース接続が

  多数必要となります。これを方式で

  稼動させる場合、特定の人気あるコンテンツ

  、ユーザーが存在する場合局所的に負荷が

  発生すると対処できない。

  SQLiteはファイルベースの

RDBMSなのでサーバーは不要。

  しかし実際Web経由で利用した

  場合個々のプログラムが直接ファイル

  をアクセスし検索を行う時、個別の

  プログラムが個別に利用するメモリー

  、CPUはサーバータイプよりは多くなる。

  実現案の考え方は、共有レンタルサーバ

  を沢山容易したのと同じです。

  この設計でスケールアップ可能な前提条件

  は個別の負荷が均等である事、個別のDB

  間で相互リンクが殆どない事ですが

  普通そうはならない。

3.その他問題

  サービスを行う場合、サーバー1台が

  止まるるだけで原理的にそのサーバーの

  サービスは利用できなくなってします。

  対応方法はある。(共有ディスク等)

  しかし、結構コストが高い。

id:uniuniko

ご回答ありがとう御座います。

とても参考にになりました。


特定の人気あるコンテンツ、ユーザーが存在する場合局所的に負荷が発生すると対処できない。

なるほど、ご指摘ありがとう御座います、この点は気付きませんでした。


SQLiteはファイルベースのRDBMSなのでサーバーは不要。しかし実際Web経由で利用した場合個々のプログラムが直接ファイルをアクセスし検索を行う時、個別のプログラムが個別に利用するメモリー、CPUはサーバータイプよりは多くなる。実現案の考え方は、共有レンタルサーバを沢山容易したのと同じです。この設計でスケールアップ可能な前提条件は個別の負荷が均等である事、個別のDB間で相互リンクが殆どない事ですが普通そうはならない。

現段階では、ユーザー同士は一切干渉しない仕組みを考えており、全体の検索なども行わない予定です。しかし、「普通そうはならない。」とのことで、やはり計算通りに行かない場合がありそうですね、、


サービスを行う場合、サーバー1台が止まるるだけで原理的にそのサーバーのサービスは利用できなくなってします。対応方法はある。(共有ディスク等)しかし、結構コストが高い。

そのようなリスクもあるのですね、全く考えていませんでした。参考になります。


MySQLで構築したほうが良さそうな気がしてきましたが、引き続きお気付きの点御座いましたら、よろしく御願いします。

2007/03/15 19:42:08
id:kurukuru-neko No.5

回答回数1844ベストアンサー獲得回数155

ポイント20pt

SqLiteでシステムを構築するなら

システム負荷分散、ダウンタイムをなくす

実システムを考えるとコストを無視すると

EMC PowerPathの説明図で

N台のサーバーが1台のディスクを

共有した構成になると思います。

http://software.emc.com/products/software_az/powerpath.htm

ディスクのI/O最適化はディスク装置側に任せる。

全サーバーが同じ立場になるので結果的に

DBは同期レプリケーション相当になり

何れのサーバーにアクセスしても処理が出来る。

スケールアップはサーバー台数を増やす

問題点は、ディスク側のスケールアップは

その製品に依存

プログラム上の問題

1.全てのプログラムが完全に並列に

  処理される事になるので、プログラムが

  行う排他制御のミスは全体に影響する。

2.データベースの構造など変更する場合

  全てをデータベースの更新が完了する迄

  サービスが停止になる。

3.各プログラムが任意のデータベース

  を容易にアクセスできる事があだになり

  部分的にサービスを止めるような処理

  を実現したい場合、個別のプログラムで

  アクセス制御を実現する必要になる。

4.単にファイルを開いているだけなので

  データベースの利用状態がわからない

5.データベースがなんらかの理由で

  破損した回復する一時的にデータベース

  の利用を停止するような処理が必要

  となる 3.の保管

6.バックアップ

  更新タイミングが不明なのでディスク

  側のサポートが必要

========================================

MySQL Performance Presentations

http://www.mysqlperformanceblog.com/mysql-performance-presentati...

id:uniuniko

ご回答ありがとう御座います。

運営後の問題など、先を見越してのご意見とても参考になりました。まだまだ知識が乏しいので仰っていることが理解できない部分もありますが、徐々に勉強していこうと思います。

一度、SQLiteは忘れて、比較的スタンダード?な構成の以下で考え直してみようかと思います。

webサーバ

DBサーバー(MYSQL)

FILEサーバー(画像や動画などのストレージ)

近いうちにまた質問させて頂くと思いますが、またそちらでお会い出来たら幸いです。

皆様この度はありがとう御座いました。

2007/03/15 23:06:10
  • id:b-wind
    >SqLiteでシステムを構築するなら
    >(中略)
    >N台のサーバーが1台のディスクを
    >共有した構成になると思います。
    未確認ですが、確か SQLite 自身が共有メモリにバッファを持って多っぽいのと、OS 自体のファイルキャッシュがある以上は共有ディスクの使用は危険ではないですか?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません