Debugging Multi-Node Cassandra Cluster on Windows
First : Run a single node cluster, and set breakpoints.
- Download latest version of cassandra from https://github.com/apache/cassandra. Click "Clone in Desktop" button on the right side of the page for quickest download experience.
- You can also setup "Egit" so that you can get source control in Eclipse (Just like Team window in VS). Follow: Eclipse GIT Integration
- If you want to edit sources, it's better to clone the repo (From command prompt, type "git clone -b <branch name> https://git-wip-us.apache.org/repos/asf/cassandra.git <branch name>". This will create a <branch name> folder in current folder, and download sources in there.)
- Download latest version of Eclipse - https://eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/mars/R/eclipse-java-mars-R-win32-x86_64.zip
- Download Java 1.8 - https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
- Download latest version of Ant (1.9.6)- https://ant.apache.org/bindownload.cgi
- Download latest version of Maven (3.3.3) - https://maven.apache.org/
- Download Python version 2.7 (this is important: Don't download the latest) - https://www.python.org/download/releases/2.7/
- For items downloaded above from 2 through 6, be sure to set their executables in your PATH environment variable. It's also a good idea to create JAVA_HOME environment variable and point it to your JDK installation.
- Follow instructions from here - https://wiki.apache.org/cassandra/RunningCassandraInEclipse to build Cassandra. If you run into issues, make sure your JDK installation is good (such as "javac -version" should show you 1.8)
- Once Eclipse is fired up, you may see errors in building the stress tool. Remove that from project build settings.
To do so, right click Project -> Select Properties, java Build Path. Ignore what the link in (8) says for Main class, instead choose "org.apache.cassandra.service.CassandraDaemon" as the Main class.
-
- In Debug -> Debug Configurations menu, you need to double click on "Java Application" to select a new configuration.
- Provide following VM arguments
For Cassandra 2.1.9 (current version in DSE 4.7.3 cluster)
-Dcassandra.config=file:E:\DI\cassandra\conf\cassandra.yaml -Dcassandra-foreground -ea -Xmx1G -Dlog4j.configuration=file:E:\DI\cassandra\conf\log4j-server.properties -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.port=10020 -com.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcassandra.storagedir=F:\data
For Cassandra 3.x
-Dcassandra.config=file:E:\DI\cassandra\conf\cassandra.yaml -Dcassandra-foreground -ea -Xmx1G -Dlog4j.configuration=file:E:\DI\cassandra\conf\log4j-server.properties -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.ssl=false -Dcassandra.jmx.local.port=7199 -Dcassandra.storagedir=F:\data
Replace E:\DI\Cassandra with your location. F:\data can be any directory. For JMX pick a port that's not busy
[You can use wintellect Process Explorer for this]
- If you have Cassandra running as Datastax services, stop them from services.msc
- Click "Debug". At this point, the view will change and you should see bunch of output in Console window at the bottom.
- Note the logs are written to build\test\logs directory by default.
Run cqlsh.bat from E:\DI\Cassandra\bin. It should successfully connect and you should be able to run commands. You can also connect from Dev Center if you like.
Running a command like below
cqlsh> CREATE KEYSPACE Test1 WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 3 };
Should print below in eclipse output.
INFO 20:05:45 Create new Keyspace: KeyspaceMetadata{name=test1, params=KeyspaceParams{durable_writes=true, replication=ReplicationParams{class=org.apache.cassandra.locator.SimpleStrategy, replication_factor=3}}, tables=[], functions=[], types=[]}
INFO 20:05:45 Enqueuing flush of keyspaces: 1492 (0%) on-heap, 0 (0%) off-heap
To stop cassandra, click on "Stop sign" icon on Console window on the right.
You're all set to put breakpoints and be a C* wizard now.
Now you are ready to debug a multi-node cluster
1. Create two copies of Cassandra (say E:\cassandra-bkup and E:\cassandra). These will be our two nodes in a cluster.
2. We will use the fact that 127.0.0.1 through 127.0.0.8 map to localhost. The first node will run as 127.0.0.1 and second as 127.0.0.2
In E:\cassandra-bkup
Edit cassandra.yaml from E:\cassandra-bkup\conf
Replace "localhost" with "127.0.0.1"
Replace seeds: "127.0.0.1" with seeds: "127.0.0.2"
Use the following VM args to Eclipse.
-Dcassandra.config=file:E:\DI\cassandra-bkup\conf\cassandra.yaml -Dcassandra-foreground -ea -Xmx1G -Dlog4j.configuration=file:E:\DI\cassandra-bkup\conf\log4j-server.properties -Djava.rmi.server.hostname=127.0.0.1 -Dcassandra.jmx.local.port=7199 -Dcassandra.storagedir=E:\DI\cassandra-bkup\data
Start Cassandra in Eclipse and make sure its running fine.
In E:\cassandra
Edit cassandra.yaml from E:\cassandra\conf
Replace "localhost" with "127.0.0.2"
Use the following VM args to Eclipse.
-Dcassandra.config=file:E:\DI\cassandra\conf\cassandra.yaml -Dcassandra-foreground -ea -Xmx1G -Dlog4j.configuration=file:E:\DI\cassandra\conf\log4j-server.properties -Djava.rmi.server.hostname=127.0.0.2 -Dcassandra.jmx.local.port=7200 -Dcassandra.storagedir=E:\DI\cassandra\data
Run "nodetool status" from both E:\cassandra-bkup\bin and E:\cassandra\bin and you will see this =>
Datacenter: datacenter1
========================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID Rack
UN 127.0.0.1 139.12 KB 256 ? d24dfee8-05b8-4ba0-b200-2e432d648b6d rack1
UN 127.0.0.2 123.92 KB 256 ? 9e7fe5dc-a3e8-4695-88e4-b2edbac4a113 rack1
Now you can put breakpoints and bring nodes up / down and see how it all works.
FAQ:
What if I get an error that another process is listening on port 10020 (or some other port that Cassandra complains about) ?
Follow this and delete that process: https://stackoverflow.com/questions/48198/how-can-you-find-out-which-process-is-listening-on-a-port-on-windows