PostgreSQLで分散DB
2007-08-04 - 01:18最近ぼんやりと考えていたことを書き殴ってみる。
1つのシステムで複数データベースを扱うのは大変なので(保守運用含めて)、今までできるだけ、
- プログラムやSQLを軽くする
- メモリ等のデータベースチューニング
- ハードウェアの増強
などをして凌いで来たのだけど、そろそろ限界。
そんなわけでDB自体の分散を色々考えてみていて、とりあえずこれで行こうかなー、というのが見えて来たのでメモ。
仕事でやってることです。別に秘密にする必要はないんだけど、会員制のWebサービスの提供をしています。認証があって、ユーザ毎にサービス提供する感じのやつ。
そのサービスのユーザがだいぶ増えて来ているので限界に来る前に対応を考え中。イギリスに渡って早数年、お客さんが増えてうれしいです。
今後も増えて行くと思うので(もちろん!)、増えたら増えただけDBサーバを後付けすればいいようにしておきたい。
方針:
- マスタ情報のテーブルは全部Slony1で同期。レプリケーションは色々試してみたけど、設定のしやすさ、頑丈さ、動きのわかりやすさ、などから非同期シングルマスタなら Slony一択だと思う。
- ユーザ毎のトランザクション情報はユーザ毎にDBに振り分ける。(ここがメイン)
- ユーザのデータを串刺しで検索や集計も必要なので、それ用に集計用のサーバーもたてて、そこにデータを集約する。
どうやろうか:
- Slonyで設定するだけ。
-
振り分けと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')
-
これは元々集計用のバッチ(というか常駐してpolling)処理があったので、それの書き込む先を集計用のDBにすればOK。2.でIDをUniqueにしているので、何も考えずにそのまま動くはず。
なんとなく、壊れた車輪の再発明をしている気がしないではない上に、ちょwwwww今どきそんなことしないよwwwwwwな気もするので、突っ込まれたいです。
Trackback link:トラックバック用URLを生成するには、JavaScriptを有効にしてください。