この章の構成は、次のとおりです。
memcachedアダプタは、memcachedバイナリ・プロトコルを介したCoherenceキャッシュへのアクセスを提供し、Coherenceをmemcachedサーバーの代替として使用できるようにします。このアダプタは、memcachedバイナリ・プロトコルをサポートしているすべてのmemcachedクライアントAPIをサポートしています。これによって、様々なプログラミング言語で記述されたmemcachedクライアントがCoherenceを使用できるようになります。
memcachedアダプタはCoherenceプロキシ・サーバー上にあり、Coherence*Extendスタイルのアクセプタとして実装されています。memcachedクライアントは、クラスタ上で分散キャッシュ操作を管理するアクセプタに接続します。キャッシュ操作はエントリ・プロセッサ操作として実行されます。Coherenceでキャッシュされたデータをやり取りするために、まずアクセプタをプロキシ・サービス内で有効化する必要があります。memcachedクライアントとの通信の保護やCoherence固有のクライアントとのデータの共有を行う追加機能も提供され、必要に応じて構成できます。
図8-1は、分散キャッシュを使用するためにCoherenceプロキシ・サーバー上にあるmemcachedアクセプタに接続するmemcachedクライアントの概念図を示しています。
memcachedアダプタは、固有のmemcachedアクセプタを使用してプロキシ・サービス内で構成されます。アクセプタの構成によって、memcachedクライアントが使用するソケット・アドレスおよび分散キャッシュ定義されます。
memcachedアダプタは、クライアントからの接続を受けるためのソケット・アドレス(IPまたはDNS名のどちらかおよびポート)を使用します。ソケット・アドレスは、オペレーション・オーバーライド構成ファイルの<address-provider要素で構成されます。その後、アドレスは構成されたid属性によってプロキシ・サービス定義から参照されます。<address-provider要素の詳細は、『Oracle Coherenceでのアプリケーションの開発』を参照してください。
次の例では、IPアドレスに198.168.1.5を、ポートに9099を、IDにmemcachedを使用してソケット・アドレスを構成しています。
...
<cluster-config>
<address-providers>
<address-provider id="memcached">
<socket-address>
<address>198.168.1.5</address>
<port>9099</port>
</socket-address>
</address-provider>
</address-providers>
</cluster-config>
...
プロキシ・サービスによって、リモート・クライアントはクラスタ・メンバーにならずにCoherenceクラスタのキャッシュ・サービスとやり取りできます。memcachedアダプタ用のプロキシ・サービスには、定義されたソケット・アドレスでmemcachedクライアントのリクエストを受け付け、分散キャッシュにそのリクエストを委任する特定のmemcachedアクセプタが含まれています。
注意:
memcachedアダプタは、分散キャッシュのみを使用できます。
memcachedクライアント用のプロキシ・サービスを作成するには、キャッシュ構成ファイルを編集して<proxy-scheme要素を追加し、<acceptor-config要素の中に<memcached-acceptor要素を含めます。<memcached-acceptor要素には、使用するキャッシュの名前およびmemcachedクライアント通信のためにリスニングするソケット・アドレスを定義するアドレス・プロバイダ定義への参照を含める必要があります。<memcached-acceptor要素の詳細なリファレンスについては、『Oracle Coherenceでのアプリケーションの開発』を参照してください。
次の例では、プロキシ・サービスを作成し、memcachedアクセプタを定義しています。この例は、memcachedアダプタ・ソケット・アドレスの定義で定義されたアドレス・プロバイダを参照しています。
...
<caching-schemes>
<proxy-scheme>
<service-name>MemcachedProxyService</service-name>
<acceptor-config>
<memcached-acceptor>
<cache-name>hello-example</cache-name>
<address-provider>memcached</address-provider>
</memcached-acceptor>
</acceptor-config>
<autostart>true</autostart>
</proxy-scheme>
</caching-schemes>
...
キャッシュ名は、hello-exampleキャッシュを参照します。キャッシュ名は、分散キャッシュに解決する必要があります。次の例は、hello-exampleキャッシュの定義およびそれにマッピングされる分散スキームを示しています。
<?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
coherence-cache-config.xsd">
<caching-scheme-mapping>
<cache-mapping>
<cache-name>hello-example</cache-name>
<scheme-name>distributed</scheme-name>
</cache-mapping>
</caching-scheme-mapping>
<caching-schemes>
<distributed-scheme>
<scheme-name>distributed</scheme-name>
<service-name>MemcachedTest</service-name>
<backing-map-scheme>
<local-scheme/>
</backing-map-scheme>
<autostart>true</autostart>
</distributed-scheme>
<proxy-scheme>
<service-name>MemcachedProxyService</service-name>
<acceptor-config>
<memcached-acceptor>
<cache-name>hello-example</cache-name>
<address-provider>memcached</address-provider>
</memcached-acceptor>
</acceptor-config>
<autostart>true</autostart>
</proxy-scheme>
</caching-schemes>
</cache-config>
memcachedクライアントは、memcachedアダプタのプロキシ・サービスのアドレスおよびポート指定する必要があります。プロキシ・サービス・アドレスは、memcachedサーバー・アドレスのかわりに使用されます。memcachedサーバー・アドレスの指定方法の詳細は、ご使用のmemcachedクライアントのドキュメントを参照してください。
次の例は、spymemcachedクライアントAPIを使用してmemcachedアダプタの設定で定義したmemcachedアダプタ用のプロキシ・サービスに接続する単純なHello Worldクライアントを示しています。
import net.spy.memcached.AddrUtil;
import net.spy.memcached.BinaryConnectionFactory;
import net.spy.memcached.MemcachedClient;
public class MemcachedExample {
public static void main(String[] args) throws Exception {
String key = "k1";
String value = "Hello World!";
MemcachedClient c = new MemcachedClient(
new BinaryConnectionFactory(),
AddrUtil.getAddresses("198.168.1.5:9099"));
c.add(key, 0, value);
System.out.println((String)c.get(key));
c.shutdown();
}
}
memcachedアダプタは、認証と認可の両方を使用してクラスタ・リソースへのアクセスを制限できます。認証のサポートは、SASL (Simple Authentication and Security Layer)プレーン認証のために提供されています。認可は、Oracle Coherence*Extendスタイルの認可を使用して実装されます。これは、キャッシュ・サービスの操作に対してきめ細かいアクセス権を提供するインターセプタ・クラスに依存しています。memcachedアダプタの認証機能と認可機能はOracle Coherenceの既存のセキュリティ機能の多くを再利用しているため、可能な場合は、既存のコンテンツへの参照も提示します。
memcachedクライアントは、memcachedアダプタに接続する際にSASLプレーン認証を使用してユーザー名およびパスワードを提供できます。SASLプレーン認証を使用するには、IdentityAsserterの実装をプロキシに作成する必要があります。memcachedアダプタはIdentityAsserterの実装を呼び出し、トークンとしてcom.tangosol.net.security.UsernameAndPasswordオブジェクトを渡します。IdentityAsserterの実装の作成および有効化については、『Oracle Coherenceの保護』を参照してください。SASLプレーン接続の確立の詳細は、ご使用のmemcachedクライアントのドキュメントを参照してください。
SASLプレーン認証を使用するには、IdentityAsserterの実装に加えてmemcachedアダプタで認証を有効化する必要があります。認証を有効化するには、キャッシュ構成ファイルのプロキシ・サービス定義を編集して<memcached-acceptor>要素に<memcached-auth-method>要素を追加し、それをplainに設定します。
...
<caching-schemes>
<proxy-scheme>
<service-name>MemcachedProxyService</service-name>
<acceptor-config>
<memcached-acceptor>
<cache-name>hello-example</cache-name>
<memcached-auth-method>plain</memcached-auth-method>
<address-provider>memcached</address-provider>
</memcached-acceptor>
</acceptor-config>
<autostart>true</autostart>
</proxy-scheme>
</caching-schemes>
...
memcachedアダプタは、エントリをバイナリ形式でキャッシュに格納します。Coherenceクライアントとデータを共有する場合、memcachedクライアントはCoherenceクライアントもサポートしているシリアライズ形式を使用する必要があります。一般に、Coherenceクライアントはこの項で強調されているPortable Object Format (POF)を使用します。POFの詳細は、『Oracle Coherenceでのアプリケーションの開発』を参照してください。
多くのmemcachedクライアント・ライブラリには、カスタム・シリアライザをプラグインする機能が含まれています。カスタム・シリアライザのプラグイン方法の詳細は、ご使用のmemcachedクライアントのドキュメントを参照してください。次の抜粋は、手順3で登録したPofUserオブジェクトを追加し、spymemcachedトランスコーダを使用してPOFシリアライザをプラグインするspymemcachedクライアントを示しています。
MemcachedClient client = m_client;
String key = "pofKey";
PofUser user = new PofUser("memcached", 1);
PofTranscoder<PofUser> tc = new PofTranscoder("memcached-pof-config.xml");
if (!client.set(key, 0, user, tc).get())
{
throw new Exception("failed to set value");
}
POFトランスコーダ・プラグインは次のように定義されています:
import com.tangosol.io.pof.ConfigurablePofContext;
import com.tangosol.util.Binary;
import com.tangosol.util.ExternalizableHelper;
import net.spy.memcached.CachedData;
import net.spy.memcached.compat.SpyObject;
import net.spy.memcached.transcoders.Transcoder;
public class PofTranscoder<T> extends SpyObject implements Transcoder<T>
{
public PofTranscoder(String sLocator)
{
m_ctx = new ConfigurablePofContext(sLocator);
}
@Override
public boolean asyncDecode(CachedData arg0)
{
return Boolean.FALSE;
}
@Override
public T decode(CachedData cachedData)
{
int nFlag = cachedData.getFlags();
Binary bin = new Binary(cachedData.getData());
return (T) ExternalizableHelper.fromBinary(bin, m_ctx);
}
@Override
public CachedData encode(Object obj)
{
byte[] oValue = ExternalizableHelper.toByteArray(obj, m_ctx);
return new CachedData(FLAG, oValue, CachedData.MAX_SIZE);
}
@Override
public int getMaxSize()
{
return CachedData.MAX_SIZE;
}
protected ConfigurablePofContext m_ctx;
protected static final int FLAG = 4;