Perl Hackers Hub

第9回 高速なWeb APIの実装とテスト―Mobage APIを支えるノウハウ(2)

この記事を読むのに必要な時間:およそ 6 分

大量にあるサーバへのアクセスを効率的に扱う

Mobage APIでは,接続するDBサーバやmemcachedサーバなどが大量にあります。サーバが増えても,アプリケーションの変更は最低限にしたいものです。ここでは,複数のサーバへのアクセスを簡単に記述する方法を紹介します。

DBへのアクセスを隠蔽する

DBは一般的な,マスタ/スレーブ構成を採用しています。INSERT/UPDATE/DELETEのような更新系のクエリはマスタへ,SELECTなどの参照系のクエリはスレーブへいくようにしています。また,Sharding注11をしているDBの系統もあります。

このように大量にあるDBへのアクセスを簡単に行うために,Mobage APIではDeNAの有澤高介さんが開発したDBIx::DBHResolver(現在のメンテナは同じくDeNAの山口徹さん)を利用してDBへのアクセス情報を隠蔽(いんぺい)しています。DBIx::DBHResolverを使うと,DBへのアクセス情報を設定ファイルから読み込み,データベースハンドルを自分で決めた名前で取得できますリスト2~3)⁠

リスト2 DBIx::DBHResolverの使用例(dbh_resolver.pl)

use DBIx::DBHResolver;
my $resolver = DBIx::DBHResolver->new;
$resolver->load('db_config.yaml'); …①
my $dbh1 = $resolver->connect('MASTER002'); …②
my $dbh2 = $resolver->connect('MASTER', 1234);…③
my $dbh3 = $resolver->connect('SLAVE', 2345); …④
...

リスト3 リスト2で読み込んでいる設定ファイル(db_cong.yaml)

---
clusters:
  MASTER:
    - MASTER001
    - MASTER002
  SLAVE:
    - SLAVE001
    - SLAVE002
connect_info:
  MASTER001:
    attrs:
      AutoCommit: 0
      RaiseError: 1
    dsn: dbi:mysql:dbname=test;host=master001;
    password: ~
    user: root
  SLAVE001:
    attrs:
      AutoCommit: 1
      RaiseError: 1
    dsn: dbi:mysql:dbname=test;host=slave001;
    password: ~
    user: root
...

リスト2 $resolver->load()はConfig::Anyを使っているのでYAMLYAML Ain't Markup Language以外でも読み込むことができます。リスト2 はMASTER002のデータベースハンドルを取得します。

リスト2 はShardingの例です。リスト3のclustersの部分がShardingの設定になります。MASTERがこのクラスタの名前で,MASTER001とMASTER002の2台が属しているという設定です。デフォルトでは,$resolver->connect()の第2引数の値で剰余演算をし,どのデータベースハンドルを使用するかを決めます注12)⁠リスト2 では,第2引数の1234をMASTERに属しているDBの台数である2で割ると余りが0なため,MASTER001が選択されます。リスト2 では,第2引数の2345をSLAVEに属しているDBの台数である2で割ると余りが1となるため,SLAVE002が選択されます。

DBIx::DBHResolverを使うと,このように複数あるDBサーバへのアクセスを直感的に行えるようになります。

注11)
idの剰余など特定のルールで,複数の物理的に異なるDBへの更新や参照を行うアーキテクチャのことです。
注12)
どのようにハンドルを選択するかのルールは自分で決めることもできます。

memcachedへのアクセスを隠蔽する

memcachedも用途によって複数のサーバ/クラスタに分かれています。こちらもDBと同じように,プログラムからはクラスタに名前を付けてアクセスできるしくみにしています。運用上,少し特殊な要件があるため,汎用的なモジュールにはしていませんが,基本的にはDBIx::DBHResolverと同じような感覚で設定を書けるようにしています。

著者プロフィール

嶋田裕二(しまだゆうじ)

1986年8月生まれ。Gaiaxなど数社を経て,現在はDeNAのプラットフォームシステムグループに所属。Mobagae APIやGadget Serverを担当し,日々増え続けるデータやアクセスに苦悩する日々。

CPANモジュールに「Windows対応用のパッチを送る迷惑な人」として一部で有名。

「Yokohama.pm」や「PerlCasual」,「YAPC::Asia」でスピーカをするなど,Perl関連のコミュニティへ積極的に参加している。

ブログ:http://blog.livedoor.jp/xaicron/

ハンドルネーム:xaicron

コメント

コメントの記入