[Coherence] Getting Started With The Coherence Memcached Adaptor

原文はこちら。
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の読み出しに成功したことを示しています。

0 件のコメント:

コメントを投稿