2012年11月9日金曜日

astyanaxその1

astyanaxを使ってみる


astyanaxは主にNetflixが開発を行っている Cassandra Java Client でcassandraへの読み書きはもちろん、主に自動的にリングやノードの状態を見て負荷を平均になるようにコントロールできる新しいクライアントです



astyanaxのインストール


事前に準備しておくもの
  • maven2
  • git
  • JDK6
まずgitからastyanaxを取得してビルドします
git clone https://github.com/Netflix/astyanax.git

mvnを使用してローカルリポジトリにおきたい場合は取得したastyanaxのディレクトリ上で
mvn clean install

jarファイルだけほしい場合は
mvn package

astyanaxの依存関係のライブラリを取得したい場合は以下のコマンドでtarget/dependency に出力される
mvn dependency:copy-dependencies

またgradlewを使用してビルドしたい場合は
gradlew build

astyanaxで適当にCassandraを使用してみる


Cassandra側でKeyspaceとColumn Familyを作成しておく
create keyspace ks
    with placement_strategy = 'SimpleStrategy'
    and strategy_options = {replication_factor:2}

create column family cf
    with column_type = 'Standard'
    and comparator = 'UTF8Type'
    and default_validation_class = 'UTF8Type'
    and key_validation_class = 'UTF8Type'

以下のような単体で動かせるようなソースコードを作成(ソース名ConnectionTest.java)
import org.apache.log4j.PropertyConfigurator;

import com.netflix.astyanax.*;
import com.netflix.astyanax.AstyanaxContext.Builder;
import com.netflix.astyanax.impl.AstyanaxConfigurationImpl;
import com.netflix.astyanax.thrift.ThriftFamilyFactory;
import com.netflix.astyanax.model.ColumnFamily;
import com.netflix.astyanax.model.ColumnList;
import com.netflix.astyanax.model.Column;
import com.netflix.astyanax.model.Row;
import com.netflix.astyanax.model.Rows;
import com.netflix.astyanax.serializers.StringSerializer;
import com.netflix.astyanax.connectionpool.OperationResult;
import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
import com.netflix.astyanax.connectionpool.NodeDiscoveryType;
import com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor;
import com.netflix.astyanax.connectionpool.impl.FixedRetryBackoffStrategy;
import com.netflix.astyanax.connectionpool.impl.SmaLatencyScoreStrategyImpl;
import com.netflix.astyanax.connectionpool.impl.BadHostDetectorImpl;
import com.netflix.astyanax.connectionpool.impl.ConnectionPoolType;
import com.netflix.astyanax.connectionpool.impl.ConnectionPoolConfigurationImpl;

public class ConnectionTest
{
    
    public static void main(String[] argv) throws ConnectionException{
        
        //適当にlog4jの設定を引数で渡してやる
        String filePath = argv[0];
        PropertyConfigurator.configure(filePath);
        
        //コネクション設定と開始
        AstyanaxContext<Keyspace> context = new AstyanaxContext.Builder()
            .forCluster("{クラスタ名}")
            .forKeyspace("ks")
            .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
                //.setDiscoveryType(NodeDiscoveryType.NONE) ノードの情報を意識しない場合の設定
                .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE) // リング内のノードを意識したアクセスの仕方に設定
                .setConnectionPoolType(ConnectionPoolType.TOKEN_AWARE) // ノードのトークンを意識したアクセスの仕方に設定
            )
            .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
                .setPort(9160) // 使用ポート
                .setMaxConnsPerHost(1) // 限界のコネクション数
                .setSeeds("{ホスト}:9160") //Seedsのアドレス
            )
            .withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
            .buildKeyspace(ThriftFamilyFactory.getInstance());
        
        context.start();
        Keyspace keyspace = context.getEntity();
        
        //使用するカラムファミリの定義
        ColumnFamily<String, String> CF_TEST =
          new ColumnFamily<String, String>(
            "cf",              // カラムファミリ名
            StringSerializer.get(),  //キーのシリアライザ
            StringSerializer.get());   //カラムのシリアライザ
        
        //データの書込み
        MutationBatch m = keyspace.prepareMutationBatch();

        m.withRow(CF_TEST, "0001")
          .putColumn("value1", "hoge", null)
          .putColumn("value2", "hogehoge", null);
          
        m.withRow(CF_TEST, "0002")
          .putColumn("value1", "huga", null)
          .putColumn("value2", "hugahuga", null);
        
        try {
          OperationResult<Void> result = m.execute();
        } catch (ConnectionException e) {
        }
        
        //データの取得
        OperationResult<Rows<String, String>> result =
          keyspace.prepareQuery(CF_TEST)
                  .getKeySlice("0001", "0002")
                  .execute();
        
        //取得したデータの表示
        for (Row<String, String> row : result.getResult()) {
            System.out.println(row.getKey());
            for (Column<String> column : row.getColumns()) {
                System.out.println(column.getName() + " " + column.getStringValue());
            }
        }
    
    }
}

ビルドして実行(lib内に各jar、第一引数に適当なlog4jの設定ファイルで実行)
$ javac -cp ./lib/*:./ ConnectionTest.java
$ java -cp ./lib/*:./ ConnectionTest ./log4j.properties
0002
value1 huga
value2 hugahuga
0001
value1 hoge
value2 hogehoge

0 件のコメント:

コメントを投稿

JWT(Jason Webトークン)を理解するJWT(Jason Webトークン)を理解する

JWT ( Jason Web トークン)を理解する   JSON Web Token はオープンスタンダードです。これは、任意の 2 つの機関 ( ユーザー、サーバー)間で情報を転送するために使用されます。 JWT では、ユーザーデー...