MightyCraft

FuelPHPでのDB水平分割対応

札幌オフィスのKです。

従来は、サーバシステム(LAMP環境)の制作は自社製フレームワークでの開発が中心でしたが、近日はオープンソースのフレームワークを使うことが増えてきています。

自社製フレームワークも悪くないのですが、オープンソースのフレームワークだと、他社から運用を引き継ぐ場合、あるいは逆に開発していて運用は他社に引き継ぐ場合にやりやすいかとも思います。

そこで、今回はソーシャルゲームなどの開発でも広く使われるようになってきていると聞いている FuelPHP について、必要なのにケアされていないDBのTipsを書いてみたいと思います。

※FuelPHPがどのようなもものかにつきましては、日本語ドキュメントをご参照ください。

(FuelPHP 日本語Document)http://fuelphp.jp/

 

■今回制作した環境

今回は、下記の環境で検証を行いました。

Apache 2.2.22

PHP 5.4.44

mysql 5.5.44,

FuelPHP 1.7.3

空いていた社内試験環境ということもあり、PHPのバージョンが少し古いですが、FuelPHPは対応してくれています。

ちなみに、FuelPHPの最新のリリースバージョンは1.8で、PHP7にも対応しています!

そちらのレポートも、いずれアップしたいと思います。

 

Tips!

■DBテーブルの水平分割対応

データベースのテーブルの水平分割対応は、ソーシャルゲームでの負荷分散として有効な方法です。

ですが、FuelPHP対応の水平分割は意外と情報が無く、手探りで作ることになりました。

FuelPHPは、DB自体をマスタ、スレーブに切り分ける機能はありますが、テーブルを水平分散させた場合の処理は考慮されておらず、良いサンプルも見つけることができませんでした。

 

そこで、既存ORMのmodelを拡張したmodelを作成し、そこで条件によってテーブルの選択を行うこととしました。

各処理や子モデルクラスでは、この拡張modelを継承させて使用します。(これは普通の手順ですね。。)

 

この仕組みでは、下記のようなことをしました。

・connectionクラスをオーバーライドしたconnenctionを作成、

その中で、分割ルールに基づいて、テーブル選択する。

・分割したテーブル用、分割していないようの継承用クラスを用意し、

分割設定をする。

・個別のテーブル用クラスが、上記の継承用クラスを継承して色々する。

 

書くと、少し込み入った感じになりますが、概ね下記のような仕組みとなります。

fig001

たとえばfindすると、実際には中ではQuery::forge内で自クラスをnewする仕組みになっていますので、これで良いということになります。

Scaffold等でクラスを自動生成した場合は、書き換える必要があります。

 

当社では、分散させた行き先を持つテーブルを用意して、そこからユーザーごとに取得したテーブル(_0等で)にアクセスする形式をとっています。このあたりは、設計次第の部分だと思います。

 

■つまづいたこと

FuelPHPの設定ファイルconfigは、coreからコピーしてきて書き換えると、書き換えた後のものが採用される、という説明でしたが、、、

Development以外の環境では、core配下のconfigが生きてしまうということが分かりました。

そのため、今回コピーした設定ファイルではmysqliで設定を行っていたのですが、環境をproductionに変更したとたん、エラーに!!

調べてみると、coreのconfigのデフォルトがpdoになっていたためエラーとなっていました。

 

この辺FuelPHPはcore自体を書き換えることが、たびたびありましたので、気をつける必要がありそうです。

 

■感想

FuelPHPは使いやすく、縛りも緩めなフレームワークだと感じましたが、その分、ある程度読む力も必要になりますので、うまくカスタマイズして使っていくのが良いと思いました。

今後も、FuelPHPだけでなく、様々なものに触れていきたいと思います。