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だけでなく、様々なものに触れていきたいと思います。