edit ./conf/cassandra-env.sh (at the bottom of the file) : uncomment and fill in : JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=10.0.4.12" (this makes it possible to run nodetool against remote hosts)
==> now first clone the VM : lxc-clone -o ubuntu1 -n ubuntu2 , ubuntu2 has address 10.0.4.12
continue with the first node and there start the thing with : ./bin/cassandra -f
add keyspace:
cssndra@ubuntu1:/opt/cassandra$ ./bin/cassandra-cli
Connected to: "Test Cluster" on 127.0.0.1/9160
Welcome to Cassandra CLI version 1.2.4
Type 'help;' or '?' for help.
Type 'quit;' or 'exit;' to quit.
[default@unknown] create keyspace DEMO with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' and strategy_options = {replication_factor:1};
f243abc2-57dc-32b4-9390-beac4e988c5b
[default@unknown] use DEMO;
Authenticated to keyspace: DEMO
[default@DEMO] create column family Users with key_validation_class = 'UTF8Type' and comparator = 'UTF8Type' and default_validation_class = 'UTF8Type';
bb07d315-a824-3bbb-9b48-d759288e57b4
[default@DEMO] set Users[1234][name] = scott;
Value inserted.
Elapsed time: 63 msec(s).
[default@DEMO] set Users[1234][password] = tiger;
Value inserted.
Elapsed time: 3.96 msec(s).
[default@DEMO] get Users[1234];
=> (column=name, value=scott, timestamp=1368679313136000)
=> (column=password, value=tiger, timestamp=1368679322745000)
Returned 2 results.
Elapsed time: 58 msec(s).
[default@DEMO]
Now on the second node (ubuntu2) start the node with /opt/cassandra/bin/cassandra , and start creating the cluster.
First create the proper tokens for a 4 node cluster, by using the following py :
# Number of nodes in the cluster
num_node = 4
for n in range(num_node):
print int(2**127 / num_node * n)
Create a columnfamily with the cassandra-cli utility:
cssndra@ubuntu1:~$ cassandra-cli
Connected to: "Test Cluster" on 127.0.0.1/9160
Welcome to Cassandra CLI version 1.2.4
Type 'help;' or '?' for help.
Type 'quit;' or 'exit;' to quit.
[default@unknown] use demo_keyspace;
Authenticated to keyspace: demo_keyspace
[default@demo_keyspace] create column family users with key_validation_class = 'UTF8Type' and comparator = 'UTF8Type' and default_validation_class = 'UTF8Type';
0b6b0010-fc89-35a1-ad05-77d53e5a4443
Can I share a cassandra cluster between multiple applications while still having some form of (security) separation ? (like having multiple databases in MySQL, and arranging access to them with grants).
Security in general, how is the gossip protected, how to prevent "illegal nodes" from entering the cluster ?
Security, how is access control arranged, and on what level ?
How to change replica settings ?
You set the number of replicas when you create a keyspace using the replica placement strategy.
run through cqlsh: ALTER KEYSPACE "Excalibur" WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 3 };
On each affected node, run nodetool repair. Wait until repair completes on a node before moving to the next node.
Cassandra#
Just some free format stuff for a small studying / experiment with NoSQL stuff.
Table of Contents
Resources#
Install/config#
lxc#
auto eth0 #iface eth0 inet dhcp iface eth0 inet static address 10.0.4.10 netmask 255.255.255.0 network 10.0.4.0 broadcast 10.0.4.255 gateway 10.0.4.1 post-up route add default gw 10.0.4.1 dev eth0 # dns-* options are implemented by the resolvconf package, if installed dns-nameservers 213.197.28.3 213.197.30.28 dns-search computerhok.nlcassandra#
- sudo mkdir -p /var/lib/cassandra/data /var/lib/cassandra/commitlog && sudo chown -R cssndra /var/lib/cassandra
- sudo mkdir /var/log/cassandra/ && sudo chown -R cssndra /var/log/cassandra
- limit the heap size usage by editing conf/cassandra-env.sh : MAX_HEAP_SIZE="512M" HEAP_NEWSIZE="100M"
- edit ./conf/cassandra.yaml:
- change the listen_address to 10.0.4.11 , necessary for multinode cluster communication (as OS hostname/ip is not properly configured)
- change the rpc_address to 10.0.4.11 , necessary to make it reachable from non-localhost (as OS hostname/ip is not properly configured)
- change the seeds parameter from 127.0.0.1 to 10.0.4.11 (this first node becomes the seed node for all nodes)
- configure endpoint_snitch: GossipingPropertyFileSnitch
- edit ./conf/log4j-server.properties : remove logging to stdout
- edit ./conf/cassandra-rackdc.properties : see Cassandra#Cluster config
- edit ./conf/cassandra-env.sh (at the bottom of the file) : uncomment and fill in : JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=10.0.4.12" (this makes it possible to run nodetool against remote hosts)
- ==> now first clone the VM : lxc-clone -o ubuntu1 -n ubuntu2 , ubuntu2 has address 10.0.4.12
- continue with the first node and there start the thing with : ./bin/cassandra -f
- add keyspace:
cssndra@ubuntu1:/opt/cassandra$ ./bin/cassandra-cli Connected to: "Test Cluster" on 127.0.0.1/9160 Welcome to Cassandra CLI version 1.2.4 Type 'help;' or '?' for help. Type 'quit;' or 'exit;' to quit. [default@unknown] create keyspace DEMO with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' and strategy_options = {replication_factor:1}; f243abc2-57dc-32b4-9390-beac4e988c5b [default@unknown] use DEMO; Authenticated to keyspace: DEMO [default@DEMO] create column family Users with key_validation_class = 'UTF8Type' and comparator = 'UTF8Type' and default_validation_class = 'UTF8Type'; bb07d315-a824-3bbb-9b48-d759288e57b4 [default@DEMO] set Users[1234][name] = scott; Value inserted. Elapsed time: 63 msec(s). [default@DEMO] set Users[1234][password] = tiger; Value inserted. Elapsed time: 3.96 msec(s). [default@DEMO] get Users[1234]; => (column=name, value=scott, timestamp=1368679313136000) => (column=password, value=tiger, timestamp=1368679322745000) Returned 2 results. Elapsed time: 58 msec(s). [default@DEMO]Now on the second node (ubuntu2) start the node with /opt/cassandra/bin/cassandra , and start creating the cluster. First create the proper tokens for a 4 node cluster, by using the following py :
# Number of nodes in the cluster num_node = 4 for n in range(num_node): print int(2**127 / num_node * n)First startup cassandra on all 4 nodes by executing from the host: ssh ubuntu@10.0.4.11 'sudo su - cssndra /opt/cassandra/bin/cassandra'
Cluster config#
Creating keyspace, tables, inserting, updating , querying#
Create keyspace#
First create a keyspace. You can do that both with cassandra-cli and cqlsh, but they have different syntaxes :-) .
Here's a cqlsh example:
[default@unknown] cssndra@ubuntu1:~$ cqlsh Connected to Test Cluster at localhost:9160. [cqlsh 2.3.0 | Cassandra 1.2.4 | CQL spec 3.0.0 | Thrift protocol 19.35.0] Use HELP for help. cqlsh> CREATE KEYSPACE demo_keyspace WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'DC1' : 2, 'DC2' : 2}; cqlsh> select * from system.schema_keyspaces; keyspace_name | durable_writes | strategy_class | strategy_options ---------------+----------------+------------------------------------------------------+---------------------------- system_auth | True | org.apache.cassandra.locator.SimpleStrategy | {"replication_factor":"1"} demo_keyspace | True | org.apache.cassandra.locator.NetworkTopologyStrategy | {"DC2":"2","DC1":"2"} system | True | org.apache.cassandra.locator.LocalStrategy | {} system_traces | True | org.apache.cassandra.locator.SimpleStrategy | {"replication_factor":"1"} cqlsh>Create a column family#
Create a columnfamily with the cassandra-cli utility:
Insert data#
Again with the cassandra-cli utility insert some data in the users columnfamily:
And insert with the cqlsh -2 utility :
And a stupid shell script to insert bulk data :
#!/bin/bash # num=$1 let n=0 TMPFILE=/tmp/$RANDOM.cql echo "use demo_keyspace;" > $TMPFILE while [ $n -lt $num ] do # echo $n CQL="INSERT INTO users ( key, name, password, whatevercolumn) VALUES ( '99${n}' , 'harry${n}' , 'wachtwoordje${n}' , 'blablabla fjkdsjf ${n} ${n} ${n}2k43u');" echo $CQL >> $TMPFILE let n=n+1 done echo "echoing inserts to cqlsh..." cqlsh -2 -f $TMPFILE echo "listing users..." cat <<EOF | cassandra-cli use demo_keyspace; list users; EOF rm $TMPFILECassandra notes/questions#
Questions#
Notes#