Эффективный способ подключения к базе данных Cassandra с помощью клиента Pelops

Я работаю над проектом, в котором мне нужно использовать Cassandra Database, У меня есть пример программы, которая будет заполнять данные в Cassandra database, я использую Pelops client для этого.

Так что теперь я думаю сделать Singleton class за Cassandra database это сделает связь с Cassandra database а потом я использую этот экземпляр из Singelton class в мой CassandraDAO вставить в базу данных Cassandra и получить данные из базы данных Cassandra.

Ниже мой класс Singleton, который я построил до сих пор, который будет подключаться к базе данных 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? Мне интересно, каков наилучший подход для управления соединением кластера с клиентом pelops.
  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 узлами в каждом.

Может кто-нибудь взглянуть и дать мне знать, что я все правильно понял? Спасибо за помощь.

1 ответ

Решение

Узлы семян - это два (или более, но 2 - это рекомендуемое число из документации Cassandra) вашего кластера. В каждом файле конфигурации узла cassandra (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 состоит только из статических элементов. Если у вас есть Init/Startup в вашем приложении, просто объявите там соединение с Cassandra, и оно будет доступно во всем вашем коде

3) Правильного ответа нет, правильный способ подключения к кластеру зависит от кластера. Возможно, вам придется установить свои пользовательские параметры или оставить один от Pelops. В моей рабочей среде (5 узлов, RF=3) я использую параметры по умолчанию без проблем.

Чао

Другие вопросы по тегам