原文はこちら。
https://blogs.oracle.com/OracleCoherence/entry/getting_started_with_the_coherence
[訳注]正しくはAdapterですが、原文のタイトルのままAdaptorを使っています。
Overview
Coherence 12c (12.1.3) でMemcachedクライアントのサポートが追加され、直接CoherenceクラスタにBinary Memcachedプロトコルでデータを格納できるようになりました。このエントリではCoherence Memcached Adapterの設定方法を紹介するとともに、MemcachedクライアントがどのようにCoherenceクラスタへ接続することができるのかを紹介するため、シンプルなPHPのサンプルを用意しました。
Memcached Adapterはプロキシサービスとして構成し、そのプロキシサービスをCoherenceクラスタで実行します。以下はサンプルのCache構成です。
<? xml version = "1.0" ?>
< defaults >
< serializer >pof</ serializer >
</ defaults >
< caching-scheme-mapping >
< cache-mapping >
< cache-name >memcache</ cache-name >
< scheme-name >DistributedCacheScheme</ scheme-name >
</ cache-mapping >
</ caching-scheme-mapping >
< caching-schemes >
< distributed-scheme >
< scheme-name >DistributedCacheScheme</ scheme-name >
< service-name >DistributedCacheService</ service-name >
< backing-map-scheme >
< local-scheme />
</ backing-map-scheme >
< autostart >true</ autostart >
</ distributed-scheme >
< proxy-scheme >
< service-name >MemecachdTcpCacheService</ service-name >
< acceptor-config >
< memcached-acceptor >
< cache-name >memcache</ cache-name >
< memcached-auth-method >plain</ memcached-auth-method >
< address-provider >memcached-addr-provider</ address-provider >
</ memcached-acceptor >
</ acceptor-config >
< autostart >true</ autostart >
</ proxy-scheme >
</ caching-schemes >
</ cache-config >
|
いくつか注意点を。
<memcached-acceptor>以下の<cache-name>要素は、Memcached acceptorのための分散キャッシュを定義しています。このacceptorに接続するすべてのMemcachedクライアントはこのキャッシュにアクセスします。
必要であれば、<memcached-auth-method>を設定し、クライアント認証を有効にすることができます。現時点ではSASL (Simple Authentication and Security Layer)プレーン認証のみをサポートしています。
<address-provider>要素ではMemcached Adapterが接続を待ち受けるソケットアドレスを定義します。Coherenceのオペレーション構成ファイルで定義します。
以下はaddress-providerの設定を紹介するオペレーション構成ファイルの例です。
<? xml version = '1.0' ?>
< coherence
< cluster-config >
< address-providers >
< address-provider id = "memcached-addr-provider" >
< socket-address >
< address >127.0.0.1</ address >
< port >11211</ port >
</ socket-address >
</ address-provider >
</ address-providers >
</ cluster-config >
< logging-config >
< destination system-property = "tangosol.coherence.log" >stdout</ destination >
< severity-level system-property = "tangosol.coherence.log.level" >9</ severity-level >
</ logging-config >
< security-config >
< identity-asserter >
< class-name >memcached.PasswordIdentityAsserter</ class-name >
</ identity-asserter >
</ security-config >
</ coherence >
|
memcached-addr-providerというidを持つアドレスプロバイダはsocket-addressの参照を定義しています。
Authentication
認証のため、カスタムIdentityAsserterを実装でき、そのIdentityAsserterをオペレーション構成ファイルで宣言できます。上記オペレーション構成ファイルのサンプルから、関連する部分だけ抜き出してみます。
…
< security-config >
< identity-asserter >
< class-name >memcached.PasswordIdentityAsserter</ class-name >
</ identity-asserter >
</ security-config >
…
|
Memcached AdapterはIdentityAsserterの実装を呼び出し、トークンとしてcom.tangosol.net.security.UsernameAndPasswordオブジェクトを渡します。
以下はIdentityAsserterのサンプルです。
package memcached;
import com.tangosol.net.Service;
import com.tangosol.net.security.IdentityAsserter;
import com.tangosol.net.security.UsernameAndPassword;
import javax.security.auth.Subject;
public class PasswordIdentityAsserter implements IdentityAsserter {
public Subject assertIdentity(Object oToken, Service service)
throws SecurityException {
if (oToken instanceof UsernameAndPassword) {
UsernameAndPassword secToken = (UsernameAndPassword) oToken;
String sPwd = new String(secToken.getPassword());
if (secToken.getUsername().equals( "username" )
&& sPwd.equals( "password" )) {
return new Subject();
}
}
throw new SecurityException( "Access denied" );
}
}
|
PHP Memcached client
PHPのmemcachedクライアントであるMemcacheとMemcachedは非常に人気があります。Memcachedはより新しいもので、Binary MemcachedプロトコルとSASL認証を両方ともサポートしています。MemcachedとSASLを有効にするためには、以下の設定をphp.iniファイルに設定する必要があります。
extension=memcached.so
memcached.use_sasl = 1
|
次のPHPコードはPHP Memcachedクライアントライブラリを使ってCoherenceクラスタに接続し、エントリを追加し、エントリを再度読み出しています。
<?php
$m = new Memcached();
$m ->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
$m ->setSaslAuthData( "username" , "password" );
if (! count ( $m ->getServerList())) {
$m ->addServer( '127.0.0.1' , 11211);
}
print_r( $m ->getVersion());
$m ->set( 'test' , 'test_string' );
print_r( 'Cache value: ' . $m ->get( 'test' ));
?>
|
Putting it all together
これは簡単に試すことができます。まずはCoherence、PHP、PHP Memcachedクライアントライブラリをダウンロードしてインストールしましょう。続いて、テスト用ディレクトリに、先ほど説明したtangosol-coherence-override.xmlという名前のオペレーション構成ファイルを作成します。同様に、Memcachedクライアントのためのキャッシュ構成を指定するcoherence-cache-config.xmlという名前のキャッシュ構成ファイルを作成します。最後に、テスト用ディレクトリにmemcachedというディレクトリを作成し、先ほどのコードを含むPasswordIdentityAsserter.javaというファイルを作成します。
PHPで、先ほどのPHPのサンプルコードをtest.phpとして保存しましょう。これでテストの準備は完了しました。
Coherenceを立ち上げるために、Coherenceライブラリを参照する必要があります。簡単のために、Coherenceのインストールディレクトリを環境変数COH_HOMEと定義しましょう。以下ではLinuxやOS X環境を想定していますが、Windowsでも同様です。
テストディレクトリ内で以下のコマンドを実行し、PasswordIdentityAsserterをビルドします。
javac – cp $COH_HOME /lib/coherence .jar memcached /PasswordIdentityAsserter .java
|
それでは、Coherenceキャッシュサーバを起動し、Memcachedクライアントのデータを保存します。
java - cp .:$COH_HOME /lib/coherence .jar com.tangosol.net.DefaultCacheServer
|
最後に、PHPクライアントがCoherence Memcached Adapterを使って安全に接続、データの格納および読み出しができることを確認しましょう。
出力結果は以下のようになるはずです。
Array
(
[127.0.0.1:11211] => 12.1.3
)
Cache value: test_string
|
PHPクライアントがCoherenceにインサートした値であるtest_stringの読み出しに成功したことを示しています。