最近,我收到一个紧急请求,需要为一个开发工作搭建一个复制因子为 2 的三节点 Apache Cassandra 集群。我对这意味着什么知之甚少,但需要快速弄清楚——这是系统管理员工作中典型的一天。
以下是如何从头开始设置一个基本的三节点 Cassandra 集群,并带有一些用于复制和未来节点扩展的额外配置。
所需的基本节点
首先,您需要一些基本的 Linux 机器。对于生产环境安装,您可能会将物理机器放置在机架、数据中心和不同的位置。对于开发,您只需要一些尺寸适合您的开发规模的东西。我使用了 VMware 上的三台 CentOS 7 虚拟机,它们具有 20GB 精简配置磁盘、两个处理器和 4GB 内存。这三台机器分别称为:CS1 (192.168.0.110)、CS2 (192.168.0.120) 和 CS3 (192.168.0.130)。
首先,在每台机器上进行 CentOS 7 的最小化操作系统安装。要在 CentOS 生产环境中使用它,请考虑调整您的 firewalld 和 SELinux。由于此集群仅用于初始开发,我关闭了它们。
唯一其他的要求是 OpenJDK 1.8 安装,它可以从 CentOS 仓库获得。
安装
在每台机器上创建一个 cass 用户帐户。为了确保节点之间没有差异,强制在每个安装上使用相同的 UID
$ useradd --create-home \
--uid 1099 cass
$ passwd cass
下载当前版本的 Apache Cassandra(在我撰写本文时为 3.11.4)。将 Cassandra 归档文件解压到 cass 主目录中,如下所示
$ tar zfvx apache-cassandra-3.11.4-bin.tar.gz
完整的软件包含在 ~cass/apache-cassandra-3.11.4 中。对于快速开发试用,这很好。数据文件在那里,conf/ 目录包含将这些节点调整为真实集群所需的重要部分。
配置
开箱即用,Cassandra 作为本地主机单节点集群运行。这对于快速浏览很方便,但这里的目标是一个真正的集群,外部客户端可以访问它,并且可以选择在开发和测试需要扩展时添加额外的节点。需要查看的两个配置文件是 conf/cassandra.yaml 和 conf/cassandra-rackdc.properties。
首先,编辑 conf/cassandra.yaml 以设置集群名称、网络和远程过程调用 (RPC) 接口;定义对等节点;并更改路由请求和复制的策略。
在每个集群节点上编辑 conf/cassandra.yaml。
更改集群名称,使其在每个节点上都相同:
cluster_name: 'DevClust'
更改以下两个条目以匹配您正在处理的节点的primary IP 地址
listen_address: 192.168.0.110
rpc_address: 192.168.0.110
找到 seed_provider 条目并查找 - seeds: 配置行。编辑每个节点以包含所有节点
- seeds: "192.168.0.110, 192.168.0.120, 192.168.0.130"
这使本地 Cassandra 实例能够看到其所有对等节点(包括自身)。
查找 endpoint_snitch 设置并将其更改为
endpoint_snitch: GossipingPropertyFileSnitch
endpoint_snitch 设置使以后需要加入新节点时具有灵活性。Cassandra 文档指出 GossipingPropertyFileSnitch 是生产环境使用的首选设置;它也是设置将在下面介绍的复制策略所必需的。
保存并关闭 cassandra.yaml 文件。
打开 conf/cassandra-rackdc.properties 文件并更改 dc= 和 rack= 的默认值。它们可以是任何唯一的并且不与其他本地安装冲突的值。对于生产环境,您将更多地考虑如何组织您的机架和数据中心。对于此示例,我使用了通用名称,例如
dc=NJDC
rack=rack001
启动集群
在每个节点上,登录到安装了 Cassandra 的帐户(在此示例中为 cass),输入 cd apache-cassandra-3.11.4/bin,然后运行 ./cassandra。终端将打印一长串消息,Java 进程将在后台运行。
确认集群
在登录到 Cassandra 用户帐户后,转到 bin 目录并运行 $ ./nodetool status。如果一切顺利,您将看到类似以下内容
$ ./nodetool status
INFO [main] 2019-08-04 15:14:18,361 Gossiper.java:1715 - No gossip backlog; proceeding
Datacenter: NJDC
================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 192.168.0.110 195.26 KiB 256 69.2% 0abc7ad5-6409-4fe3-a4e5-c0a31bd73349 rack001
UN 192.168.0.120 195.18 KiB 256 63.0% b7ae87e5-1eab-4eb9-bcf7-4d07e4d5bd71 rack001
UN 192.168.0.130 117.96 KiB 256 67.8% b36bb943-8ba1-4f2e-a5f9-de1a54f8d703 rack001
这意味着集群可以看到所有节点并打印一些有趣的信息。
请注意,如果 cassandra.yaml 使用默认的 endpoint_snitch: SimpleSnitch,则上面的 nodetool 命令会将默认位置指示为 Datacenter: datacenter1,并将机架指示为 rack1。在上面的示例输出中,cassandra-racdc.properties 值是显而易见的。
运行一些 CQL
这是复制因子设置发挥作用的地方。
创建一个复制因子为 2 的键空间。从任何一个集群节点,转到 bin 目录并运行 ./cqlsh 192.168.0.130(替换为适当的集群节点 IP 地址)。您可以使用以下命令查看默认的管理键空间
cqlsh> SELECT * FROM system_schema.keyspaces;
keyspace_name | durable_writes | replication
--------------------+----------------+-------------------------------------------------------------------------------------
system_auth | True | {'class': 'org.apache.cassandra.locator.SimpleStrategy', 'replication_factor': '1'}
system_schema | True | {'class': 'org.apache.cassandra.locator.LocalStrategy'}
system_distributed | True | {'class': 'org.apache.cassandra.locator.SimpleStrategy', 'replication_factor': '3'}
system | True | {'class': 'org.apache.cassandra.locator.LocalStrategy'}
system_traces | True | {'class': 'org.apache.cassandra.locator.SimpleStrategy', 'replication_factor': '2'}
创建一个新的复制因子为 2 的键空间,插入一些行,然后回忆一些数据
cqlsh> CREATE KEYSPACE TestSpace WITH replication = {'class': 'NetworkTopologyStrategy', 'NJDC' : 2};
cqlsh> select * from system_schema.keyspaces where keyspace_name='testspace';
keyspace_name | durable_writes | replication
---------------+----------------+--------------------------------------------------------------------------------
testspace | True | {'NJDC': '2', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
cqlsh> use testspace;
cqlsh:testspace> create table users ( userid int PRIMARY KEY, email text, name text );
cqlsh:testspace> insert into users (userid, email, name) VALUES (1, 'jd@somedomain.com', 'John Doe');
cqlsh:testspace> select * from users;
userid | email | name
--------+-------------------+----------
1 | jd@somedomain.com | John Doe
现在您已经有一个基本的三节点 Cassandra 集群正在运行,并已准备好进行一些开发和测试工作。CQL 语法类似于标准 SQL,正如您从熟悉的命令中看到的,可以创建表、插入和查询数据。
结论
Apache Cassandra 看起来像是一个有趣的 NoSQL 集群数据库,我期待着更深入地研究它的用途。这个简单的设置仅触及了可用选项的表面。我希望这个三节点入门指南也能帮助您开始使用它。
评论已关闭。