原文はこちら。
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"?>
<cache-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.oracle.com/coherence/coherence-cache-config"
xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-cache-config
http://xmlns.oracle.com/coherence/coherence-cache-config/1.2/coherence-cache-config.xsd">
<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
xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-operational-config
http://xmlns.oracle.com/coherence/coherence-operational-config/1.2/coherence-operational-config.xsd">
<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())) {
// List of Coherence proxy service nodes
$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を使って安全に接続、データの格納および読み出しができることを確認しましょう。
php test.php
出力結果は以下のようになるはずです。
Array
(
[127.0.0.1:11211] => 12.1.3
)
Cache value: test_string
PHPクライアントがCoherenceにインサートした値であるtest_stringの読み出しに成功したことを示しています。