« PostgreSQLメモ | Home | ATOK 2007 for Mac »

PostgreSQLで分散DB

2007-08-04 - 01:18

最近ぼんやりと考えていたことを書き殴ってみる。

1つのシステムで複数データベースを扱うのは大変なので(保守運用含めて)、今までできるだけ、

  • プログラムやSQLを軽くする
  • メモリ等のデータベースチューニング
  • ハードウェアの増強

などをして凌いで来たのだけど、そろそろ限界。

そんなわけでDB自体の分散を色々考えてみていて、とりあえずこれで行こうかなー、というのが見えて来たのでメモ。

仕事でやってることです。別に秘密にする必要はないんだけど、会員制のWebサービスの提供をしています。認証があって、ユーザ毎にサービス提供する感じのやつ。

そのサービスのユーザがだいぶ増えて来ているので限界に来る前に対応を考え中。イギリスに渡って早数年、お客さんが増えてうれしいです。

今後も増えて行くと思うので(もちろん!)、増えたら増えただけDBサーバを後付けすればいいようにしておきたい。

方針:

  1. マスタ情報のテーブルは全部Slony1で同期。レプリケーションは色々試してみたけど、設定のしやすさ、頑丈さ、動きのわかりやすさ、などから非同期シングルマスタなら Slony一択だと思う。
  2. ユーザ毎のトランザクション情報はユーザ毎にDBに振り分ける。(ここがメイン)
  3. ユーザのデータを串刺しで検索や集計も必要なので、それ用に集計用のサーバーもたてて、そこにデータを集約する。

どうやろうか:

  1. Slonyで設定するだけ。
  2. 振り分けとUnique key

    • 振り分けをどこで行うかをちょっと悩んでいる。振り分け情報自体もテーブルにいれて1.でレプリケーションしておくのが楽そうかなあ、と思ってる。が、振り分けのために一回DBにアクセスする必要があるのは何かナンセンスな気もしてる。まあ元情報はDBに入れといて、memcacheとかに読み込ませておくのも手かな。
    • 集計の段階や、障害対策で楽をしたいので、テーブルのPrimary keyは全DB間でUniqueにしたい。こうしておけば、DBサーバ間でのユーザの移動とかも楽になるような気がする。
      実際には、unique key取得用のsequence用のDBを用意して、それを見に行くのはどうかと思ってる。PostgreSQLのcontribのdblinkを使うことで、PostgreSQL内だけで完結できることは確認済(つまりアプリケーションからは意識しなくて大丈夫)。dblinkはトランザクションきかないのだけど、sequenceは元々トランザクション関係ないので問題ない。また、性能もほぼ落ちないのを確認済(そのそもInsertのコストがでかい)
      こんな感じ:

      		シーケンス用のDB上で(当面はSlonyでのマスタなDB上に置くと思うが)
      		$ create sequence public hogehoge_sequence;
      		以下は各DB上で:<br  />
      		次シーケンス取得用functionを作成
      		$ create or replace function public.remote_sequence(dblink_name text, name text) returns int as
      		'
      		declare
      		rec record;
      		begin
      		for rec in select * from public.dblink(dblink_name, \'select nextval(\\\'\' || name || \'\\\'::regclass) as next\') t1(next integer) loop
      		return rec.next;
      		end loop;
      		end;
      		' language 'plpgsql';
      		上記functionを使ってtableの作成
      		$ create table hoge (
      		id integer default public.remote_sequence('master_sequence_db', 'public.hogehoge_sequence'),
      		hogecol text
      		);
      		dblink作成 (これはPostgreSQLのconnection毎にする必要あり)
      		$ select public.dblink_connect('master_sequence_db', 'host=hogehoge port=5432 user=hogeuser')
      		
  3. これは元々集計用のバッチ(というか常駐してpolling)処理があったので、それの書き込む先を集計用のDBにすればOK。2.でIDをUniqueにしているので、何も考えずにそのまま動くはず。

なんとなく、壊れた車輪の再発明をしている気がしないではない上に、ちょwwwww今どきそんなことしないよwwwwwwな気もするので、突っ込まれたいです。

使用タグ: ,
6 comments

すでに DB がボトルネックになってる、もしくは、もうすぐなりそう、なの?
ひろしま (ウェブサイト) - 2007-08-04 - 02:51

ひろしまさん、
ちょっと前に結構チューニングした結果、もうちょっと(数ヶ月)は持つような気はしてますが、
ダメになる前に対応しておかないとなー、という感じです。
なかの - 2007-08-04 - 03:09

なるほど、けっこうな数のアクセスがあるんですな。素晴らしい。
でも、それはそもそも不可避なのか、それとも DB を無用に酷使する設計が悪いのか、というのも気にならないことはないね。知らないので、つい全体の設計で改善を図りたくなる :-)
まあ、書き込みが多い系の仕様だろうし、難しいところなのかも知れない。
ひろしま () (ウェブサイト) - 2007-08-04 - 04:03

設計とかを見直したりはまだいくらでもできそうな気もしてるんですが、
そればっかりはやってれないし、マシンの追加で済む話ならそれの方が安いかも、等々な感じですね。
世の中のアクセスが多そうで書き込みもあるようなサイト、たとえばmixiとかって1台で同時に何人くらいのユーザさばいてるのかなあ。
なかの - 2007-08-04 - 04:26

特性を知らないのでなんとも言えないけど、ユーザーのDBとマスターDBを分離させたい感じもしますね。ユーザー数に応じて、マスターDBのレプリケーション数が増えるってのはどうなんだろう?同期って運用では色々と厄介なトラブルを生むことが多々あるので、取らなくて済むなら取りたくないし、取るとしても数を減らしたい。個人的には。
ちなみにMySQLには、
http://dev.mysql.com/doc/refman/5.1/ja/f..
って機能があったりするけど(僕はこの機能を使ったことない)、PostgreSQLだとどうなんだろう?クエリのパフォーマンスの問題とかも出てくるとは思うけど。
ono - 2007-08-13 - 01:12

どもども。ロンドン生活どうですか?

うーん、DB分離させちゃうと単純にJOINとかできなくてめんどくさそう。まあ、そこはプログラムレベルでJOINとすればいいのかもしれないけど、今更変えられないです><
とりあえず現在上のでテストしてますがいい感じではあります。もちろん本番上では罠があるかもしれないので怖いんですが。
なかの - 2007-08-19 - 22:42


Trackback link:

トラックバック用URLを生成するには、JavaScriptを有効にしてください。

  
情報を記憶する

Emoticons / Textile
  (ユーザー登録 / ログイン)

通知:
アドレス非公開:

注意: 使用できるタグは <b> と <i> のみです。URLやメールアドレスはそのまま記述すればリンクになります。

 

設定

  • イギリス在住プログラマー
  • 趣味は城巡り
  • オープンソース好きという表向き
  • twitter
  • Blog
  • masatomon at gmail.com

最近のエントリ

blog始めました
会社でブログ始めました
ブリュッセルとルクセンブルク旅行
IRIS
ロンドンでの引っ越し

twitter

photos from mobile


きもちー



状況がわかんない…



近所のお気に入りパブ…



チェス



photo.jpg


最近のコメント

とり (Slony-I まとめ…): Operaでも崩れています。…
同じく通りすがり… (Slony-I まとめ…): Internet Explorer 8 でも…
通りすがりです… (Slony-I まとめ…): Slony の情報、大変参考に…
なかの (泥棒に入られた - …): ひろしまさん、 とりあえず…
mamoruk(usata) (泥棒に入られた - …): あれあれ、大変でしたね。 …

最近の参照元

03:15 [Go] uuid svn
23:39 [Go] poderosa
22:14 [Go] ロンドン 住所…
20:21 [Y] イギリス 入国 ir…
13:41 [Go] PostgreSQL
11:49 [Go] postgresql
08:55 blog.madoro.org/mn/13…
08:21 [Go] PostgreSQL work…
08:14 [Y] easyjet
08:05 [Go] Flex
08:03 [Y] trattoria al tre…
07:51 [Go] poderosa Tortoi…
07:14 blog.mizzy.org/articl…
07:03 [Go] slony i
06:41 [Go] slony
04:33 [Go] slony

タグ

アーカイブ

2010-01
2009-11
2009-09
2009-02
2009-01
2008-12
2008-08
2008-07
2008-06
2008-05
2008-04
2008-03
2008-02
2008-01
2007-12
2007-08
2007-07
2007-06
2007-05
2007-04
2007-03
2007-02

Powered by Pivot - 1.40.6: 'Dreadwind'