在当今的数字化时代,数据量正以惊人的速度增长。像亚马逊、推特、脸书、谷歌等公司都在收集大量的用户数据,这些数据需要被高效地处理。传统的关系型数据库管理系统(RDBMS)在处理大数据时存在扩展性限制,因此并不是处理大数据的最佳选择。
非关系型数据库(NoSQL,意为“不仅仅是SQL”)能够处理非结构化数据,并且通过分布式架构实现成本效益的扩展,提供了一个优秀的替代方案。与RDBMS相比,NoSQL数据库不需要固定的模式,并且能够通过更好的扩展性来处理大量数据。市场上有多种NoSQL选项,本文将介绍其中之一——Cassandra,并展示如何使用Docker创建Cassandra集群以及创建简单的数据库和表。
RDBMS在处理大数据时速度较慢,而NoSQL数据库可以扩展以应对日益增长的负载。所谓的“垂直扩展”指的是升级硬件以处理更多的数据负载,但这通常成本较高。另一种方法是“水平扩展”,即随着数据库负载的增加,将数据分布在多个节点上。
选择NoSQL数据库而非RDBMS的指导因素包括:数据量巨大、数据是非结构化且不断变化的、数据持续增长需要扩展数据库、数据之间的关系不是那么重要。以下是NoSQL数据库特点的快照。市场上有多种NoSQL数据库,例如MongoDB、Apache Cassandra、Apache HBase等。此外,大多数云服务也提供NoSQL数据库服务。本文将简要介绍Cassandra,并进行一些实践操作来学习NoSQL数据库。
将通过创建一个简单的两节点Cassandra集群来探索Cassandra。这将帮助在本地运行Cassandra。需要在系统中安装Docker,并且机器至少应该有8GB的RAM来运行多节点集群。这种Docker环境可以在转移到云或本地生产集群设置之前测试概念验证。
首先,需要在机器上安装Docker。安装过程可能因机器类型(Linux/Windows/Mac)而略有不同。对于Mac/Windows机器,建议安装Docker-Desktop,因为发现它非常有帮助。将使用Mac进行演示部分。
对于不熟悉Docker的读者,Docker是一个工具,用于使用容器创建、部署和运行应用程序。可以将应用程序及其所有必要的部分(如库和其他依赖项)打包,并作为一个整体发货。这是与同事/客户共享/传输项目的优秀解决方案,无需担心他们的系统配置即可运行项目。项目可以在任何装有Docker的计算机上通用运行。
如果已经安装了Docker,请转到终端并检查Docker的安装情况:
docker --version
正在创建一个由两个Cassandra节点组成的集群。将这些节点称为Cassandra-1和Cassandra-2。将使用命令行工具nodetool与集群交互。集群将作为一个独特的NoSQL数据库来存储和操作数据。
docker run --name cassandra-1 -d cassandra:latest
上述命令使用Docker Hub上的Cassandra镜像启动第一个节点。使用带有名称和d标志的docker run命令(在容器中以分离模式运行,以便终端可用于进一步探索)。以下命令将显示正在运行的Docker容器:
docker ps -a
将通过配置容器名称或其IP地址来创建集群。由于所有的操作都在本地机器上进行,可以使用容器名称。可以使用nodetool实用工具检查节点的状态:
docker exec -it cassandra-1 nodetool status
预期的输出如下所示,显示节点在IP地址172.17.0.2上运行,状态为Up/Normal。可以运行第二个容器Cassandra-2,并将其链接到Cassandra-1。
docker run --name cassandra-2 -d --link cassandra-1:cassandra cassandra:latest
使用了–link标志将Cassandra-1链接到Cassandra-2以创建集群。由于已经提前拉取了Cassandra的镜像,第二个docker run命令应该运行得更快。可以使用nodetool实用工具检查节点的状态。
可以看到两个节点都在运行。第二个节点在IP地址172.17.0.3上运行。这通常需要一些时间让容器同步,如果没有得到类似的输出,等待一会儿然后重新运行命令。
现在Cassandra集群正在运行,可以使用命令行界面与集群交互以创建数据库和表。运行以下命令:
docker exec -it cassandra-1 bash -c 'cqlsh'
cqlsh是与Cassandra使用Cassandra查询语言(CQL)交互的命令行界面。CQL与SQL类似,因此更容易使用。运行上述命令后,cqlsh提示符打开,并显示它连接到本地主机上的9042端口的测试集群。
本文不会深入探讨CQL,但以下三个关键术语对于学习如何与Cassandra交互很重要:keyspace(类似于RDBMS数据库,是应用程序数据的容器)、Column Families/Tables(一个keyspace由多个column families/Tables组成,类似于SQL表)、Primary Key/Tables(主键由Partition键和Cluster键组成。行/Partition键决定数据存储的节点,Cluster键决定特定行中数据的顺序)。
可以使用以下命令创建一个名为test_cassandra的keyspace:
CREATE KEYSPACE test_cassandra WITH replication = {'class':'SimpleStrategy' , 'replication_factor' : 1};
使用简单的策略,当使用单个数据中心时使用。这种方法将副本放在以下节点上,按顺时针顺序排列,并且replication_factor为1。可以使用这个keyspace:
USE test_cassandra;
现在应该在test_cassandra keyspace内部,可以创建一个表:
CREATE TABLE test_cassandra.employee ( emp_id int PRIMARY KEY , name text , city text );
employee表只包含3列:id、name和city,将id指定为主键。可以向表中插入一些值:
INSERT INTO test_cassandra.employee (emp_id , name , city ) VALUES (1, 'John' , 'New York' );
INSERT INTO test_cassandra.employee (emp_id , name , city ) VALUES (2, 'Mary' , 'Seattle' );
INSERT INTO test_cassandra.employee (emp_id , name , city ) VALUES (3, 'Adam' , 'Miami' );
一个简单的查询来检索所有数据将如下所示:
SELECT * FROM test_cassandra.employee;