プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Coherenceの統合
12c (12.2.1.3.0)
E90216-02
目次へ移動
目次

前
次

5 memcachedクライアントとOracle Coherenceの併用

Coherenceをmemcachedクライアント用の分散キャッシュとして使用できるようにmemcachedアダプタを構成できます。spymemcached APIで記述された単純なHello Worldクライアントがデモ用に提供されていますが、既存のmemcachedクライアントを使用してCoherenceに接続できます。

この章の内容は次のとおりです。

5.1 Oracle Coherence memcachedアダプタの概要

memcachedアダプタは、memcachedバイナリ・プロトコルを介したCoherenceキャッシュへのアクセスを提供し、Coherenceをmemcachedサーバーの代替として使用できるようにします。このアダプタは、memcachedバイナリ・プロトコルをサポートしているすべてのmemcachedクライアントAPIをサポートしています。これによって、様々なプログラミング言語で記述されたmemcachedクライアントがCoherenceを使用できるようになります。

memcachedアダプタはCoherenceプロキシ・サーバー上にあり、Coherence*Extendスタイルのアクセプタとして実装されています。memcachedクライアントは、クラスタ上で分散キャッシュ操作を管理するアクセプタに接続します。キャッシュ操作はエントリ・プロセッサ操作として実行されます。Coherenceでキャッシュされたデータをやり取りするために、まずアクセプタをプロキシ・サービス内で有効化する必要があります。memcachedクライアントとの通信の保護やCoherence固有のクライアントとのデータの共有を行う追加機能も提供され、必要に応じて構成できます。

図5-1は、分散キャッシュを使用するためにCoherenceプロキシ・サーバー上にあるmemcachedアクセプタに接続するmemcachedクライアントの概念図を示しています。

図5-1 memcachedクライアント接続の概念図

図5-1の説明が続きます
「図5-1 memcachedクライアント接続の概念図」の説明

5.2 memcachedアダプタの設定

memcachedアダプタは、固有のmemcachedアクセプタを使用してプロキシ・サービス内で構成されます。アクセプタの構成によって、memcachedクライアントが使用するソケット・アドレスおよび分散キャッシュ定義されます。

この項には次のトピックが含まれます:

5.2.1 memcachedアダプタ・ソケット・アドレスの定義

memcachedアダプタは、クライアントからの接続を受けるためのソケット・アドレス(IPまたはDNS名のどちらかおよびポート)を使用します。ソケット・アドレスは、オペレーション・オーバーライド構成ファイルの<address-provider要素で構成されます。その後、アドレスは構成されたid属性によってプロキシ・サービス定義から参照されます。Oracle Coherenceでのアプリケーションの開発のaddress-providerを参照してください。

次の例では、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>
...

5.2.2 memcachedアダプタ・プロキシ・サービスの定義

プロキシ・サービスによって、リモート・クライアントはクラスタ・メンバーにならずにCoherenceクラスタのキャッシュ・サービスとやり取りできます。memcachedアダプタ用のプロキシ・サービスには、定義されたソケット・アドレスでmemcachedクライアントのリクエストを受け付け、分散キャッシュにそのリクエストを委任する特定のmemcachedアクセプタが含まれています。

注意:

memcachedアダプタは、分散キャッシュのみを使用できます。

memcachedクライアント用のプロキシ・サービスを作成するには、キャッシュ構成ファイルを編集して<proxy-scheme要素を追加し、<acceptor-config要素の中に<memcached-acceptor要素を含めます。<memcached-acceptor要素には、使用するキャッシュの名前およびmemcachedクライアント通信のためにリスニングするソケット・アドレスを定義するアドレス・プロバイダ定義への参照を含める必要があります。『Oracle Coherenceでのアプリケーションの開発』のmemcached-acceptorに関する項を参照してください。

次の例では、プロキシ・サービスを作成し、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>

5.3 memcachedアダプタへの接続

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();
   }
}

5.4 memcachedクライアント通信の保護

memcachedアダプタは、認証と認可の両方を使用してクラスタ・リソースへのアクセスを制限できます。認証のサポートは、SASL (Simple Authentication and Security Layer)プレーン認証のために提供されています。認可は、Oracle Coherence*Extendスタイルの認可を使用して実装されます。これは、キャッシュ・サービスの操作に対してきめ細かいアクセス権を提供するインターセプタ・クラスに依存しています。memcachedアダプタの認証機能と認可機能はOracle Coherenceの既存のセキュリティ機能の多くを再利用しているため、可能な場合は、既存のコンテンツへの参照も提示します。

この項には次のトピックが含まれます:

5.4.1 memcachedクライアント認証の実行

memcachedクライアントは、memcachedアダプタに接続する際にSASLプレーン認証を使用してユーザー名およびパスワードを提供できます。SASLプレーン認証を使用するには、IdentityAsserterの実装をプロキシに作成する必要があります。memcachedアダプタはIdentityAsserterの実装を呼び出し、トークンとしてcom.tangosol.net.security.UsernameAndPasswordオブジェクトを渡します。『Oracle Coherenceの保護』のIDトークンを使用したクライアント接続の制限に関する項を参照してください。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>
...

5.4.2 memcachedクライアント認可の実行

memcachedアダプタは、Oracle Coherence*Extend認可フレームワークを使用して、memcachedクライアントがクラスタで実行できる操作を制限します。『Oracle Coherenceの保護』のExtendクライアントの認可の実装に関する項を参照してください。

5.5 memcachedクライアントとCoherenceクライアント間のデータ共有

memcachedアダプタは、エントリをバイナリ形式でキャッシュに格納します。Coherenceクライアントとデータを共有する場合、memcachedクライアントはCoherenceクライアントもサポートしているシリアライズ形式を使用する必要があります。一般に、Coherenceクライアントはこの項で強調されているPortable Object Format (POF)を使用します。『Oracle Coherenceでのアプリケーションの開発』の「Portable Object Formatの使用」を参照してください。

この項には次のトピックが含まれます:

5.5.1 memcachedクライアントのPOFの構成

memcachedクライアントのPOFを構成する手順は、次のとおりです。

  1. 認証を有効化するには、キャッシュ構成ファイルのプロキシ・サービス定義を編集して<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>
    ...
    
  2. 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>
    
  3. 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>
    

5.5.2 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;