我已经编写了一个小型应用程序来启动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指定为种子,它们现在形成了一个集群。