この章では、Oracle Coherence memcachedアダプタを構成する手順について説明します。memcachedアダプタを使用すると、Coherenceをmemcachedベースのクライアント向けの分散キャッシュとして使用できます。この章の手順は、既存のmemcachedクライアントを使用してCoherenceに接続することを前提としています。spymemcached APIで記述された単純なHello Worldクライアントが、デモ用に提供されています。
この章では、次の内容を説明します。
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アクセプタを定義しています。この例は、第8.2.1項で定義したアドレス・プロバイダを参照しています。
... <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を使用して第8.2項で定義した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クライアントとCoherenceクライアント間のデータを共有するには:
認証を有効化するには、キャッシュ構成ファイルのプロキシ・サービス定義を編集して<memcached-acceptor>
要素に<interop-enabled>
要素を追加し、それをtrue
に設定します。
... <proxy-scheme> <service-name>MemcachedProxyService</service-name> <acceptor-config> <memcached-acceptor> <cache-name>hello-example</cache-name> <interop-enabled>true</interop-enabled> <address-provider>memcached</address-provider> </memcached-acceptor> </acceptor-config> <autostart>true</autostart> </proxy-scheme> ...
memcachedアクセプタが使用する分散キャッシュでPOFを有効化します。
... <distributed-scheme> <scheme-name>distributed</scheme-name> <service-name>MemcachedTest</service-name> <serializer> <instance> <class-name>com.tangosol.io.pof.ConfigurablePofContext</class-name> <init-params> <init-param> <param-type>String</param-type> <param-value>memcached-pof-config.xml</param-value> </init-param> </init-params> </instance> </serializer> <backing-map-scheme> <local-scheme/> </backing-map-scheme> <autostart>true</autostart> </distributed-scheme>
POFタイプを定義済のPOF構成ファイルに登録します。前述の例では、POF構成ファイルはmemcached-pof-config.xml
という名前でした。このファイルがクラスパスでcoherence.jar
ファイルの前に置かれている必要があります。次の例では、PofUser
オブジェクト用のPOFユーザー・タイプを定義しています:
<?xml version='1.0'?> <pof-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-pof-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-pof-config coherence-pof-config.xsd"> <user-type-list> <include>coherence-pof-config.xml</include> <!-- User types must be above 1000 --> <user-type> <type-id>1001</type-id> <class-name>memcached.PofUser</class-name> </user-type> </user-type-list> </pof-config>
POFを使用するmemcachedクライアントの作成
多くの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;