天天看點

Cassandra 最佳實踐系列(1) - CQL QuickStart

簡易搭建單節點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 最佳實踐系列(1) - CQL QuickStart

注意:

因為我們沒有修改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,如下圖:

Cassandra 最佳實踐系列(1) - CQL QuickStart

我們可以通過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的定義;如下圖:

Cassandra 最佳實踐系列(1) - CQL QuickStart

我們也可以在這個表 tb裡面執行insert操作以及select操作,如下圖:

Cassandra 最佳實踐系列(1) - CQL QuickStart

通過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();
      }
    }
}           

最後的結果如圖:

Cassandra 最佳實踐系列(1) - CQL QuickStart

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 ;