尝试体验Apache Cassandra

由于有机会使用Cassandra,我将在自己的环境中进行一番探索。

环境

    • Mac OSX El Capitan 10.11.6

 

    Homebrew

简要说明

阿帕奇卡桑德拉

在中国,这将是一种可能的翻译:
该分布式数据库和数据库管理系统属于开源的NoSQL类别。
《Apache Cassandra的功能和架构概述 | DataStax Academy:免费的Cassandra教程和培训》

卡桑德拉集群管理器(CCM)

一般而言,分散式数据库的目的是通过多台机器来分担负载。因此,在实际构建时需要多台机器(虚拟机也可)。
在这种情况下,随着CCM的出现,我们可以在一台localhost上构建多个节点,用于运行测试代码。

CCM的安装

因为要在Mac上进行环境设置,所以使用Homebrew安装ccm。

brew install ccm

目前为止,虽然也有Python的软件包可用,但是在2017年,它仅支持Python2版本。

pip install ccm

Cassandra Cluster 的部署实现

这次只是为了试试,所以使用了三个节点来构建集群。

创建集群

定义一个Cassandra集群。

# ccm create <Cluster name> -v <Cassandra Version>
ccm create qiita -v 3.9

每个节点的IP地址设置

对于每个节点都需要一个IP地址,但由于CCM只需要在本地主机上运行,所以只需将127.0.0.X的IP地址分配给localloopback(lo0)即可。考虑到本次有3个节点,因此需要创建127.0.0.1到127.0.0.3的IP地址。

sudo ifconfig lo0 alias 127.0.0.1
sudo ifconfig lo0 alias 127.0.0.2
sudo ifconfig lo0 alias 127.0.0.3

生成一个节点

ccm populate -n 3

确认每个节点的状态

使用ccm status命令确认每个节点的状态。

$ ccm status
Cluster: 'qiita'
----------------
node1: DOWN (Not initialized)
node3: DOWN (Not initialized)
node2: DOWN (Not initialized)

由于刚刚创建了节点,因此尚未进行DOWN状态的初始化。

启动和停止节点

用 ccm start 命令启动节点。

# nodeを指定して起動
$ ccm node2 start
$ ccm status
Cluster: 'qiita'
----------------
node1: DOWN
node3: DOWN
node2: UP

# nodeをすべて起動 
$ ccm start
$ ccm status
Cluster: 'qiita'
----------------
node1: UP
node3: UP
node2: UP

# nodeをすべて停止
$ ccm stop
$ ccm status
Cluster: 'qiita'
----------------
node1: DOWN
node3: DOWN
node2: DOWN

执行CQL

使用CQL(Cassandra查询语言)执行以构建数据库。

# CQL shell の起動
$ ccm node1 cqlsh

创建Keyspace

创建 Keyspace,设置 Keyspace 的配置和复制因子。在这里,假设只有一个数据中心,选择 SimpleStrategy 来构建副本。另外,为了将数据表复制到所有节点上,将复制因子设置为 3。

# Keyspaceの作成 (keyspace_nameは,Keyspaceの名前)
cqlsh> CREATE KEYSPACE keyspace_name WITH replication = {'class': 'SimpleStrategy','replication_factor':3};
# 使うKeyspaceの選択
cqlsh> USE keyspace_name;
cqlsh:keyspace_name>

创建Table

创建这样一张表:
* 表名:table_name
* userid: 整型,主键
* first_name: 文本型
* last_name: 文本型

cqlsh:keyspace_name> CREATE TABLE keyspace_name.table_name ( 
                 ... userid int PRIMARY KEY,
                 ... first_name text,
                 ... last_name text);

插入数据

将数据插入到已创建的keyspace_name表中,这与普通的SQL无异吗?

cqlsh:keyspace_name> INSERT INTO table_name (userid ,first_name, last_name) VALUES (1, 'taro', 'tanaka');

确认其他节点

刚才我在node1中插入了数据。现在需要在其他节点上确认数据是否已经共享。

# node3に接続
$ ccm node3 cqlsh
Connected to qiita at 127.0.0.3:9042.
[cqlsh 5.0.1 | Cassandra 3.9 | CQL spec 3.4.2 | Native protocol v4]
Use HELP for help.
cqlsh> use keyspace_name ;
cqlsh:keyspace_name> SELECT * FROM table_name ;
cqlsh:keyspace_name> 
 userid | first_name | last_name
--------+------------+-----------
      1 |       taro |    tanaka

(1 rows)

由于数据已经共享,所以没问题!

更改一致性级别

cqlsh> CONSISTENCY
cqlsh> Current consistency level is ONE.

现在,一致性级别设置为One。
尝试将其更改为All。

cqlsh> CONSISTENCY ALL;
cqlsh> Consistency level set to ALL.

由于将ALL更改为全节点,当从所有节点中获取到匹配的数据时,将执行CQL语句。

# すべてのノードが稼働している場合
$ ccm status
Cluster: 'qiita'
----------------
node1: UP
node3: UP
node2: UP

cqlsh> use keyspace_name ;
cqlsh:keyspace_name> SELECT * FROM table_name ;
cqlsh:keyspace_name> 
 userid | first_name | last_name
--------+------------+-----------
      1 |       taro |    tanaka

(1 rows)

# 1つのノードが死んでいる場合
$ ccm status
Cluster: 'qiita'
----------------
node1: UP
node3: UP
node2: DOWN

cqlsh> USE keyspace_name ;
cqlsh:keyspace_name> SELECT * FROM table_name ;
cqlsh:keyspace_name> CONSISTENCY ALL ;
cqlsh:keyspace_name> Consistency level set to ALL.
cqlsh:keyspace_name> SELECT * FROM table_name ;
cqlsh:keyspace_name> NoHostAvailable: 

由于一致性级别设置为All,即使只有一个节点故障,数据获取也将无法完成,所以通常QUORUM成为更通用的参数。

总结

这次,我使用 CCM 试用了 Apache Cassandra,并进行了一个简单的运维演示。关于技术细节,如果有时间和余力的话,我会进行整理。(如果有时间和余力的话…)

文献引用

Apache Cassandra的功能和架构概述 | DataStax学院: 免费Cassandra教程和培训
CQL指令 | 适用于Cassandra 2.x的CQL指令

广告
将在 10 秒后关闭
bannerAds