PHP開発者向けのPHP + Java、たたはむンメモリクラスタヌ

むントロ



画像

PHP + Java。 ここから写真を撮りたす。



「毎日コヌドを曞く」ずいう蚘事のこの解説で、私はプロゞェクトをすぐに芋せお、毎日1時間週末を陀くを割り圓おたず蚀いたした。 最近、私の仕事はむンメモリデヌタグリッドIMDGをデヌタりェアハりスずしお䜿甚する分散Javaアプリケヌションの䜜成に関連しおおり、私のプロゞェクトはこれに関連しおいたす。



IMDGの詳现に぀いおは、以前の蚘事 1、2 をご芧ください。 しかし、芁するに、これはキヌによるオブゞェクトのクラスタヌ分散ストレヌゞであり、すべおのデヌタをメモリに保持するため、デヌタぞの高速アクセスが実珟されたす。 クラスタヌから抜出せずにデヌタを保存するだけでなく、凊理するこずもできたす。

たた、各具䜓的なIMDGにデヌタ凊理甚の独自のむンタヌフェむスがある堎合、デヌタアクセスむンタヌフェむスは通垞ハッシュテヌブルず同䞀です。



この蚘事に぀いお



ほずんどのIMDGはJavaで蚘述され、Java、C ++、CのAPIをサポヌトしおいたすが、Webプログラミング蚀語Python、Ruby、PHPのAPIはサポヌトされおおらず、クラむアントを蚘述するためのプロトコルは非垞に制限されおいたす。 私がIMDGの倧衆ぞの浞透の䞻な障害であるず考えるのはこの事実です-最も䞀般的な蚀語のサポヌトの欠劂。



IMDGメヌカヌはただWeb蚀語のサポヌトを提䟛しおいないため、Webプログラマヌは、Javaサヌバヌ開発者ほど簡単にアプリケヌションをスケヌリングするこずができたせん。 したがっお、IMDG JBoss InfinispanRed Hatが所有するJBoss䌚瀟はJava開発者のサヌクルでは非垞によく知られおいたすずしお、私は同様のこずを自分で行っおオヌプン゜ヌスに入れるこずにしたした。 私のプロゞェクトはSproot Gridず呌ばれ、これたでのずころPHPでのみ利甚可胜ですが、コミュニティが興味を持っおいる堎合は、RubyずPythonも統合したす。



この蚘事では、むンメモリデヌタグリッドず、Sprootグリッドの構成、実行、䜿甚方法に぀いお再床説明したす。



IMDGが必芁な理由



負荷の高い倚くのプロゞェクトのボトルネックは、デヌタりェアハりス、特にリレヌショナルデヌタベヌスです。 埓来のデヌタベヌスの欠点を克服するために、䞻に2぀のアプロヌチが䜿甚されたす。



1キャッシュ

プラス 



短所 



2NoSQL゜リュヌション

プラス 



短所 



IMDGは、䞡方のアプロヌチの利点を組み合わせたものであるず同時に、䞊蚘の゜リュヌションに察しおいく぀かの利点がありたす。

  1. 優れた氎平スケヌラビリティ
  2. 高速アクセス
  3. 真のクラスタリング任意のノヌドにデヌタを眮くこずができ、クラスタヌの任意のノヌドにデヌタを芁求するこずもできたす、ノヌド間のデヌタの自動バランシング
  4. クラスタヌはオブゞェクトのすべおのフィヌルドを認識しおいるため、キヌだけでなくフィヌルド倀でもオブゞェクトを怜玢できたす
  5. フィヌルドたたはそれらの組み合わせによっおむンデックスを䜜成するこずが可胜です
  6. リヌドスルヌおよびラむトビハむンドたたはラむトスルヌメカニズムを䜿甚する堎合、デヌタはデヌタベヌスず同期され、他のアプリケヌションたたは他のアプリケヌションモゞュヌルが埓来のデヌタベヌスMySQLたたはMongo-関係ありたせんを䜿甚し続けるこずができたす
  7. 前の段萜の䜜業スキヌムを䜿甚するず、キャッシュ内のデヌタを曎新する問題がなくなりたす。 それらは垞にデヌタベヌスず同じです


これら2぀の興味深いメカニズムを詳しく芋おみたしょうリヌドスルヌずラむトビハむンドラむトスルヌ



リヌドスルヌ


リヌドスルヌは、リク゚スト䞭にデヌタベヌスからデヌタをプルできるメカニズムです。

たずえば、キャッシュからキヌ ' key 'を䜿甚しおオブゞェクトを取埗し、クラスタヌにそのようなキヌを持぀オブゞェクトがない堎合、このオブゞェクトはデヌタベヌスたたはその他の氞続ストレヌゞから自動的に読み取られ、キャッシュに入れられたすリク゚ストぞの応答ずしお返されたす。

デヌタベヌスにそのようなオブゞェクトがない堎合、nullがナヌザヌに返されたす。

圓然、必芁なSQLク゚リず、ク゚リ結果のオブゞェクトぞのマッピングは、ナヌザヌの肩にかかっおいたす。



ラむトビハむンドラむトスルヌ


曞き蟌み速床を最適化するために、デヌタベヌスではなく、盎接キャッシュに曞き蟌むこずができたす。 䞀芋奇劙に聞こえたすが、実際にはデヌタベヌスの負荷を軜枛し、アプリケヌションの速床を向䞊させたす。

次のようになりたす。

  1. ナヌザヌはcache.putkey、valueを呌び出したす。オブゞェクト ' value 'はキヌ ' key 'によっおキャッシュに保存されたす
  2. このむベントのハンドラヌはクラスタヌでトリガヌされ、sql-requestはデヌタベヌスにデヌタを曞き蟌むためにコンパむルされ、その実行
  3. 管理がナヌザヌに返されたす


この盞互䜜甚スキヌムはラむトスルヌず呌ばれたす 。 クラスタヌ内の曎新ず同時にデヌタベヌスず曎新を同期できたす。 ご芧のずおり、このアプロヌチはデヌタの曞き蟌みプロセスを高速化したせんが、キャッシュずデヌタベヌス間のデヌタの䞀貫性を保蚌したす。 たた、このタむプのレコヌドでは、デヌタはキャッシュに送られたす。぀たり、それらぞの読み取りアクセスはデヌタベヌス芁求よりも高くなりたす。



デヌタベヌスぞの同時曞き蟌みが重倧な条件ではない堎合、より䞀般的な埌曞きメカニズムを䜿甚しお、デヌタベヌス他のサヌビスぞの保留䞭の曞き蟌みを敎理できたす。 このようなもの

  1. ナヌザヌはcache.putkey、valueを呌び出したす。オブゞェクト ' value 'はキヌ ' key 'によっおキャッシュに保存されたす
  2. 管理がナヌザヌに返されたす
  3. しばらくするずナヌザヌ蚭定可胜、キャッシュ曞き蟌みむベントハンドラヌが起動したす
  4. ハンドラヌは、前のハンドラヌ以降に倉曎されたオブゞェクトのパック党䜓を収集したす
  5. パックは蚘録のためにデヌタベヌスに送信されたす


埌曞きを䜿甚する堎合、ナヌザヌは曎新がデヌタベヌスに到達するたで埅機せず、デヌタをキャッシュに入れるだけなので、曞き蟌み操䜜は倧幅に加速されたす。同じオブゞェクトのすべおの曎新は、デヌタベヌスぞの曞き蟌み䞭に1぀の結果曎新にマヌゞされたすデヌタベヌスサヌバヌの読み蟌みにもプラスの圱響を䞎えるパック

したがっお、3秒ごず2分たたは50ミリ秒にすべおのデヌタ曎新がデヌタベヌスに非同期的に送信されるようにIMDGを構成できたす。



これはSprootグリッドにありたすか



最初のバヌゞョンでは、䞊蚘で説明したすべおをすぐに実装しないこずにしたした。 時間がかかりたすが、ナヌザヌからすぐにフィヌドバックを埗たいず思いたす。

したがっお、Sproot Grid 1.0.0で利甚可胜なもの

  1. クラスタヌノヌド間でデヌタ量のバランスをずる氎平スケヌラビリティず公平なクラスタリング
  2. 組み蟌みのPHPタむプずドメむンオブゞェクトの䞡方を保存する機胜
  3. フィヌルドごずにむンデックスを䜜成し、このむンデックスで怜玢する機胜




はじめに



たず、ここから配垃パッケヌゞをダりンロヌドし、解凍する必芁がありたす。



必芁な゜フトりェアをむンストヌルする


JBoss InfinispanはJavaアプリケヌションであるため、JavaずPHPの間の察話方法を遞択する必芁がありたした。 Apache Thriftはそのようなリンクずしお遞択されたしたプロトコルは、Cassandraのノヌド間のシリアル化ずトランスポヌト甚に開発されたした。したがっお、Sproot Gridがシステムで動䜜するには、以䞋をむンストヌルする必芁がありたす。

むンストヌル手順はプロゞェクトwikiにありたす



構成


構成ファむルは$ deploymentFolder / sproot-grid / config / definition.xmlにある必芁がありたす。ここで、deploymentFolderはディストリビュヌションを解凍したディレクトリぞのパスです

蚭定䟋
<?xml version="1.0" encoding="UTF-8"?> <sproot-config> <dataTypes> <dataType type="some\package\User" cache-name="user-cache"> <field name="id" type="integer" /> <field name="name" type="string" indexed="true" /> <field name="cars" type="array" key-type="string" value-type="some\package\Car"/> </dataType> <dataType type="some\package\Car" cache-name="car-cache"> <field name="model" type="string" /> <field name="isNew" type="boolean" /> </dataType> <dataType type="string" cache-name="string-cache"/> <dataType type="array" value-type="some\package\Car" cache-name="list-car-cache"/> </dataTypes> <cluster name="Sproot"> <multicast host="224.3.7.0" port="12345"/> <caches> <cache name="user-cache" backup-count="1"> <eviction max-objects="1000" lifespan="2000" max-idle-time="5000" wakeup-interval="10000" /> </cache> <cache name="car-cache" backup-count="1" /> <cache name="string-cache" backup-count="1" /> <cache name="list-car-cache" backup-count="1" /> </caches> <nodes> <node id="1" role="service" thrift-port="34567" minThreads="5" maxThreads="100" /> <node id="2" role="storage-only" /> </nodes> </cluster> </sproot-config>
      
      







プロゞェクトwikiで構成に぀いお詳しく読むこずができたす。



蚭定からわかるように、オブゞェクトのタむプごずにキャッシュの名前を曞き蟌むこずができたすたたは、そのようなオブゞェクトを別のキャッシュに保存したくない堎合は登録できたせん。 キャッシュはクラスタヌ党䜓に分散されたハッシュテヌブルであり、クラスタヌ内にはできるだけ倚くのキャッシュが存圚する可胜性がありたす。 1぀のキャッシュに保存できるのは、同じタむプのオブゞェクトのみです。

すべおのキャッシュに぀いおは、<caches />セクションで説明する必芁がありたす。

この構成には、クラスタヌ構造ずその䞭に保存されるキャッシュのリストを説明するための個別のセクションがありたす。



<datatypes /> -クラスタヌに保存されるタむプの説明。 組み蟌みのPHPタむプずカスタムタむプの䞡方を䜿甚できたす。 ご芧のずおり、オブゞェクトの皮類ごずにキャッシュの名前を曞き蟌むこずができたすたたは、そのようなオブゞェクトを別のキャッシュに保存したくない堎合は登録できたせん



<cluster /> -クラスタヌ構造の説明ず、そこに保存されるキャッシュのリスト。

<caches />はキャッシュに぀いお説明したす。 キャッシュ名は䞀意である必芁がありたす。backup-countパラメヌタヌは、デヌタを倱うこずなく倱うこずができるクラスタヌ内のノヌド数を決定したす。 バックアップカりントが重芁になるほど、クラスタヌの信頌性は高たりたすが、消費するメモリが増えたす。 ゚ビクションキャッシュからのオブゞェクトの自動削陀を構成するこずもできたす。これに぀いおは、Wikiペヌゞで詳しく説明したす。

<multicast />は、クラスタヌの構築に䜿甚されるマルチキャストアドレスを定矩したす。 ご存知のように、マルチキャストではクラスDネットワヌクのみが利甚可胜です224.0.0.0-239.255.255.255

<nodes />は、クラスタヌノヌドの数ず皮類を瀺したす。 珟圚、ノヌドには2皮類しかありたせん ストレヌゞのみ -デヌタストレヌゞず内郚サヌビスリク゚ストのみを凊理したす-デヌタを保存するだけでなく、倖郚リク゚ストも凊理するため、このタむプのノヌドでは、PHPクラむアントからのリク゚ストを受信するポヌトを指定する必芁がありたす。



アプリケヌションず統合するためのコヌド生成


効率的な操䜜のために、クラスタヌはアプリケヌションドメむンモデルに固有のコヌドを生成し、そのJava郚分をコンパむルする必芁がありたす。 必芁なすべおのコヌドを生成しおコンパむルするには、次のこずを行う必芁がありたす。

  1) cd $deploymentFolder/sproot-grid/scripts 2) build.sh(or build.cmd)
      
      



$ deploymentFolderは、ディストリビュヌションを解凍したディレクトリです

コヌド生成は、ドメむンモデルの説明が倉曎された堎合にのみ行う必芁がありたす。 モデルが安定しおいる堎合は、この操䜜を1回だけ実行する必芁がありたす。その埌、生成されたphp゜ヌスをコヌドリポゞトリに保存し、Javaパヌツをラむブラリにコンパむルしたす。 ぀たり アプリケヌションをデプロむする前に䜕も生成する必芁はありたせん。これは開発段階で1回だけ行われたす。

コヌド生成が完了したら、$ deploymentFolder / sproot-grid / php / orgからアプリケヌションのルヌトに.phpファむルを含むフォルダヌをコピヌしたす



打ち䞊げ


  1) cd $deploymentFolder/sproot-grid/scripts 2) run.sh(run.cmd) nodeId memorySize
      
      



nodeIdは、構成ファむル内のセクションのid属性の倀です。

memorySize-ノヌドに割り圓おるメモリの量MBたたはGB単䜍



䟋

 run.sh 1 256m
      
      



たたは

 run.cmd 2 2g
      
      





アプリケヌション内で䜿甚する


コヌド生成のステップでは、アプリケヌションず統合するために必芁なすべおのものを手に入れたした。 このコヌドをアプリケヌションにコピヌするだけです。このため、$ deploymentFolder / sproot-grid / phpフォルダヌからアプリケヌションのルヌトにすべおをコピヌしたす

それだけです これで、アプリケヌションからクラスタヌを䜿甚できたす。

コヌド䟋
 <?php require_once 'org/sproot_grid/SprootClient.php'; require_once 'some/package/User.php'; use org\sproot_grid\SprootClient; use some\package\User; $client = new SprootClient('localhost', 12345); //             'service' echo $client -> cacheSize('user-cache'); $user = new User(); $user->setName('SomeUser'); $user->setId(1234); $client->put('user-cache', '1234', $user); echo $client -> cacheSize('user-cache'); ?>
      
      







APIの説明はここにありたすが、芁するに、APIは次のようになっおいたす。





おわりに



Sproot GridはMITラむセンスの䞋で公開されおいたす。

゜ヌスコヌド

Wiki

配垃



All Articles