2

を使用する必要があるプロジェクトに取り組んでいますCassandra Database。にデータを入力するサンプル プログラムがありますCassandra database。そのために使っPelops clientています。

そのため、接続を確立するSingleton classforを作成し、そのインスタンスを使用して Cassandra データベースに挿入し、Cassandra データベースからデータを取得することを考えています。Cassandra databaseCassandra databaseSingelton classCassandraDAO

以下は、これまでに作成したシングルトン クラスで、Cassandra データベースに接続します。

public class CassandraConnection {

    private static CassandraConnection _instance;
    private String keyspace;
    private String[] seeds;
    private int port;
    private String poolName;

    public static synchronized CassandraConnection getInstance() {
        if (_instance == null) {
            _instance = new CassandraConnection();
        }
        return _instance;
    }

    private CassandraConnection() {
        setKeyspace(ICassandraDo.KEYSPACE_NAME);
        setSeeds(ICassandraDo.NODES).split(",");
        setPort(ICassandraDo.CASSANDRA_PORT);
        setPoolName(ICassandraDo.THRIFT_CONNECTION_POOL);

        createPool();
    }

    //This is the right way to `addPool` in pelops?
    private void createPool() {
        Pelops.addPool(getPoolName(), getSeeds(), getPort(),
                false, getKeyspace(), new Policy());

    }

    private String setSeeds(String nodes) {

    // I am not sure what I am supposed to do here? 
    // Any guidance will be of great help

    }

    private void setPoolName(String thriftConnectionPool) {
        this.poolName = thriftConnectionPool;
    }

    private void setPort(int cassandraPort) {
        this.port = cassandraPort;
    }

    private void setKeyspace(String keyspaceName) {
        this.keyspace = keyspaceName;

    }

    public void setSeeds(String[] seeds) {
        this.seeds = seeds;
    }

    public String[] getSeeds() {
        return seeds;
    }

    public int getPort() {
        return port;
    }

    public String getKeyspace() {
        return keyspace;
    }

    public String getPoolName() {
        return poolName;
    }
}

問題文:-

上記のコードにはほとんど疑問がありません。

  1. setSeedsまず、上記のクラスのメソッドで何をすべきですか? ポインタや例は非常に役立ちます。
  2. 次に、Singleton クラスを作成しているので、これが正しい方法かどうかわかりません。ペロプスクライアントとのクラスター接続を管理するための最良のアプローチは何だろうと思っています。
  3. またaddPool、上記のコードでメソッドを使用する最良の方法は何ですか? あそこも何か間違えたのかな?addPoolでさまざまなメソッドを見続けているのでPelops class?したがって、これを本番環境で実行するので、どの方法を使用する必要があるかを覚えておいてください。

上記の Singleton クラスの準備ができたら、DAOコードで上記のクラスを次のように使用する予定です。

Mutator mutator = Pelops.createMutator(CassandraConnection.getInstance().getPoolName()); mutator.writeColumns(other data inside);

そして、データを取得するためにセレクターも実行します。

参考までに、私は と で作業しCassandra 1.2.3ていScale 7 pelops clientます。

どんな助けでも大歓迎です。前もって感謝します。

更新されたコード:-

以下は私の更新されたコードです。

public class CassandraConnection {

    private static CassandraConnection _instance;
    private String keyspace;
    private String[] nodes;
    private int port;
    private String poolName;


    public static synchronized CassandraConnection getInstance() {
        if (_instance == null) {
            _instance = new CassandraConnection();
        }
        return _instance;
    }

    private CassandraConnection() {
        setKeyspace(ICassandraDo.KEYSPACE_NAME);
        setNodes(ICassandraDo.NODES);
        setPort(ICassandraDo.CASSANDRA_PORT);
        setPoolName(ICassandraDo.THRIFT_CONNECTION_POOL);

        createPool();
    }


    private void createPool() {
        Pelops.addPool(getPoolName(), getCluster(), getKeyspace());

    }

    private Cluster getCluster() {

        Config casconf = new Config(ICassandraDo.CASSANDRA_PORT, true, 0); 

        Cluster cluster= new Cluster(nodes, casconf, ICassandraDo.NODE_DISCOVERY);

        return cluster; 
    }


    private void setPoolName(String thriftConnectionPool) {
        this.poolName = thriftConnectionPool;
    }

    private void setPort(int cassandraPort) {
        this.port = cassandraPort;
    }

    private void setKeyspace(String keyspaceName) {
        this.keyspace = keyspaceName;

    }

    private void setNodes(String nodes) {
        this.nodes = nodes.split(",");
    }

    public int getPort() {
        return port;
    }

    public String getKeyspace() {
        return keyspace;
    }

    public String getPoolName() {
        return poolName;
    }
}

参考までに、私の場合、それぞれ 12 ノードの 2 つのクラスターを作成します。

誰でも見て、私がすべて正しく得たことを知らせてもらえますか? 助けてくれてありがとう。

4

1 に答える 1

1

シード ノードは、クラスターの 2 つ (またはそれ以上ですが、Cassandra のドキュメントで推奨されている数は 2 つ) のノードです。各 cassandra-node 構成ファイル (cassandra.yaml) には、クラスターのシード ノードのアドレスがあります。5 つのノードのクラスターがあるとします。

192.168.1.100 192.168.1.101 192.168.1.102 192.168.1.103 192.168.1.104

各構成ファイルには、たとえば

種子 192.168.1.101 192.168.1.103

このクラスタでは、これら 2 つのアドレスがシード ノードです。起動時のクラスターの各ノードは、これら 2 つのノードに接続し、必要な情報を取得します。あなたの例では、構成で見つかったアドレス、またはクラスターのアドレスノードのカップルのみを渡すことができます

String[] nodes = new String[2];
nodes[1] = "192.168.1.101";
nodes[2] = "192.168.1.103";

2) Pelops クラスは静的要素のみで作成されるため、Singleton は絶対に不要です。アプリケーションに Init/Startup がある場合は、そこに Cassandra への接続を宣言するだけで、すべてのコードで使用できるようになります

3) 正解はありません。クラスタに接続する正しい方法は、クラスタによって異なります。カスタム パラメータを設定するか、Pelops のパラメータを残す必要がある場合があります。私の本番環境 (5 ノード、RF=3) では、デフォルトのパラメーターを問題なく使用しています。

チャオ

于 2013-04-09T21:49:44.440 に答える