如何对嵌入的Cassandra实例进行集群



我已经编写了一个小型应用程序来启动Cassandra 1.2的嵌入式实例。

我正试图通过运行该应用程序的3个实例,在本地创建一个由3个嵌入式实例组成的集群。每一个都会查看文件系统上不同的cassandra.yaml。每个文件都有:

  • 相同的群集名称
  • 空白initial_token
  • 唯一的侦听地址(在我的主机文件中都映射到127.0.0.1)
  • 唯一的rpc、存储和ssl-storage端口
  • 相同的种子(第一个服务器的侦听地址(无端口))
  • 在应用程序启动中传递的唯一-Dcom.sun.management.jmxremote.port值

当我启动应用程序时,所有应用程序都运行良好,并且在文件系统上有单独的存储。然而,当我使用nodetool检查每个节点时,每个节点似乎都在一个集群中:

C:Program FilesDataStax Communityapache-cassandrabin>nodetool -h 127.0.0.1 -p 7197 ring
Starting NodeTool
Datacenter: datacenter1
==========
Replicas: 1
Address    Rack        Status State   Load            Owns                Token
127.0.0.1  rack1       Up     Normal  198,15 KB       100,00%             8219116491729144532

C:Program FilesDataStax Communityapache-cassandrabin>nodetool -h 127.0.0.2 -p 7198 ring
Starting NodeTool
Datacenter: datacenter1
==========
Replicas: 1
Address    Rack        Status State   Load            Owns                Token
127.0.0.2  rack1       Up     Normal  152,13 KB       100,00%             -3632227916915216562

博客和在线文档表明,这就足够了。是否可以对嵌入的实例进行集群?如果是,有人知道我的配置或理解是不正确/不充分的吗?

下面是启动嵌入实例的代码。希望你能帮忙,谢谢。

public class EmbeddedCassandraDemo {
    private static final String CONF_PATH_FORMAT = "D:\embedded_cassandra\Node%d\";
    private ExecutorService executor = Executors.newSingleThreadExecutor();
    private CassandraDaemon cassandraDaemon;
    private int nodeNumber;
    public EmbeddedCassandraDemo(int nodeNumber) {
        this.nodeNumber = nodeNumber;
    }
    public static void main(String [ ] args) throws InterruptedException, ConnectionException {
        new EmbeddedCassandraDemo(Integer.parseInt(args[0])).run();
    }
    private void run() throws InterruptedException, ConnectionException {
        setProperties();
        activateDeamon();
    }
    private void activateDeamon() {
        executor.execute( new Runnable(){
            @Override
            public void run() {
                cassandraDaemon = new CassandraDaemon();
                cassandraDaemon.activate();
            }});
    }
    private void setProperties() {
        System.setProperty("cassandra.config", String.format("file:%scassandra.yaml", String.format(CONF_PATH_FORMAT, nodeNumber)));
        System.setProperty("log4j.configuration", String.format("file:%slog4j-server.properties", String.format(CONF_PATH_FORMAT, nodeNumber)));
        System.setProperty("cassandra-foreground", "true");
    }
}

"blank initial_token"

您正在使用虚拟节点吗?如果没有,我想知道这是否是你的问题。您应该为每台机器定义一个不同的初始令牌。对于一个3节点集群,这些初始令牌应该是56713727820156410577229101238628035242的增量,彼此分开。

使用DataStax的Python脚本计算初始令牌,这些值应该适合您的需求:

node 0: 0
node 1: 56713727820156410577229101238628035242
node 2: 113427455640312821154458202477256070485

此外,您正在使用哪种endpoint_snitch?如果使用"PropertyFileSnitch",请确保cassandra-topology.properties文件包含每个节点的定义(以及DC和机架)。

试试看是否有帮助。

现在已排序。浏览了上的代码和介绍https://github.com/pcmanus/ccm(链接到from从同一台机器运行多个cassandra节点(一个集群)?),并且除了用于JMX连接的端口值之外,保持所有端口值相同。

做出这些更改后,再加上@BryceAtNetwork23为每个服务器设置了初始令牌,并将所有3台服务器的IP指定为种子,它们现在形成了一个集群。

最新更新