简易搭建单节点C*
本文介绍如何简单的搭建一个Cassandra的单节点,以后会介绍如何构建多节点的Cassandra集群;为了搭建一个单节点我们需要做下面几件事情:
1.节点部署JAVA 基本环境;
2.获取需要的Cassandra二进制包:可以编译源码获取也可以直接官网下载3.11.5的bin包;
3.tar xf apache-cassandra-3.11.5-bin.tar.gz
4.cd apache-cassandra-3.11.5/bin目录;
5.执行./cassandra 启动单节点C*;
接下来你在bin目录下面通过执行./nodetool status 如果观测到下面的状态,就证明单节点的Cassandra已经正确启动。
注意:
因为我们没有修改Cassandra的配置文件,这里单节点的进程都是使用默认配置,比如使用默认256的vnode,使用/var/lib/cassandra/data做数据存储目录,使用/var/lib/cassandra/commitlog做commitlog存储目录等, 默认绑定localhost,默认没有账户密码认证。
访问C*
通过cqlsh
bin目录下面的cqlsh类似于访问Cassandra的一个client,默认情况指定one级别去访问Cassandra,由于我们此处设置是sever绑定localhost,且cqlsh默认访问localhost,所以直接bin目录下面./cqlsh既可以访问到上面部署的单节点Cassandra,如下图:
我们可以通过cqlsh执行常见的Cassandra DDL、DML操作,比如这里我建一个keyspace ks以及在keyspace里面建一个table tb。分别使用如下cql:
CREATE KEYSPACE ks WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
use ks;
CREATE TABLE tb ( name text PRIMARY KEY ,age int);
我们可以在Cassandra里面通过执行:
DESCRIBE ks;
获取得到该keyspace下面的所有相关的keyspace、table、index、mv的定义;如下图:
我们也可以在这个表 tb里面执行insert操作以及select操作,如下图:
通过java driver
当然我们实际业务开发的时候很难通过cql去执行一些常见的dml操作,我们这里使用datastax 公司开源的java-driver进行常见的cassandra访问,当然也有其他版本以及语言的driver(见这里).
使用java driver的时候,只需要新建maven项目,然后pom.xml里面添加如下配置(我们这里使用3.8.0的java driver做演示):
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>3.8.0</version>
</dependency>
然后我们的演示代码如下:
package com.aliyun.cstar.driver.test;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.Session;
public class Test
{
static String[] CONTACT_POINTS = {"127.0.0.1"};
static int PORT = 9042;
public static void main(String[] args) {
Cluster cluster = null;
try {
System.out.println("CLUSTER CONNECT !");
//cluster operation
cluster = Cluster.builder().addContactPoints(CONTACT_POINTS).withPort(PORT).build();
Session session = cluster.connect();
System.out.println("CREATE KEYSPACE AND TABLE !");
//DDL:keyspace and table operation
session.execute("CREATE KEYSPACE IF NOT EXISTS newks WITH replication "
+ "= {'class':'SimpleStrategy', 'replication_factor':1};");
session.execute("CREATE TABLE IF NOT EXISTS newks.newtb (name text PRIMARY KEY, age int)");
System.out.println("INSERT INTO TABLE AND SELECT TABLE !");
//DML:insert and select
session.execute("INSERT INTO newks.newtb (name, age) VALUES('xla', 22)");
session.execute("INSERT INTO newks.newtb (name, age) VALUES('xlb', 22)");
session.execute("INSERT INTO newks.newtb (name, age) VALUES('xlc', 22)");
ResultSet results = session.execute("SELECT * FROM newks.newtb");
System.out.println(results.all());
results = session.execute("SELECT name from newks.newtb");
System.out.println(results.all());
results = session.execute("SELECT count(*) from newks.newtb");
System.out.println(results.all());
System.out.println("FINISHED OPERATION !");
} finally {
if (cluster != null) cluster.close();
}
}
}
最后的结果如图:
CQL使用
这里简单介绍下常见的CQL的使用,主要分2类:DDL以及DML。
DDL :
CREATE KEYSPACE:
CREATE KEYSPACE ksname WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};
如果是多DC的话可以如下建表,保证使用NetworkTopologyStrategy:
CREATE KEYSPACE ksname
WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1' : 3, 'DC2' : 3};
ALTER KEYSPACE :
ALTER KEYSPACE ksname
WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 4};
修改了副本数从3变成4.
CREATE TABLE :
CREATE TABLE t (
pk text,
v1 int,
v2 text,
v3 text ,
PRIMARY KEY (pk, v1)
);
必须指定primary key,用来唯一确定数据在集群的唯一id。当然TABLE还有很多别的属性,这里使用默认的,其他的以后再详细介绍。
这里主要介绍我们常见的使用方式,还有drop keyspace,truncate table等等可以见这里。
DML:
我们列举我们常见的SELECT 、INSERT、UPDATE 、DELETE、BATCH操作:
INSERT :
INSERT INTO t (pk, v1, v2, v3) VALUES ( 'pk1', 1, 'v2', 'v3');
一定要提供我们的PRIMARY KEY的数据;
SELECT :
SELECT pk, v1, v2, v3 FROM t;
UPDATE:
UPDATE t SET v2 = 'vv2' WHERE pk = 'pk1' AND v1 =1;
DELETE:
DELETE FROM t WHERE pk = 'pk1' AND v1 =1;
BATCH:
BEGIN BATCH
... INSERT INTO t (pk, v1, v2, v3) VALUES ( 'pk1', 1, 'v2', 'vV3');
... APPLY BATCH ;