在 Rocky Linux 8 中安装和配置 Cassandra

本文的目的是介绍如何在 Rocky Linux 8 系统上安装和配置 Cassandra,以及如何使用 CQL 进行基本的数据库操作。

发布于

Cassandra 是一个分布式的 NoSQL 数据库,它可以提供高可用性、高扩展性和高性能的数据存储和查询服务。Cassandra 的数据模型基于列族,支持动态的数据结构和灵活的数据一致性。Cassandra 还提供了一种类似 SQL 的查询语言,叫做 CQL (Cassandra Query Language)。

本文的目的是介绍如何在 Rocky Linux 8 系统上安装和配置 Cassandra,以及如何使用 CQL 进行基本的数据库操作。

先决条件

在开始安装和配置 Cassandra 之前,您需要准备以下内容:

  • 一台或多台运行 Rocky Linux 8 的服务器,具有 root 权限或 sudo 权限。
  • 每台服务器至少有 4 GB 的内存和 50 GB 的磁盘空间。
  • 每台服务器的防火墙允许以下端口的通信:7000 (集群间通信)、7001 (集群间加密通信)、7199 (JMX 监控)、9042 (CQL 客户端)、9160 (Thrift 客户端)。
  • 每台服务器的主机名和 IP 地址已经正确配置,并且可以互相解析和访问。
  • 如果您打算使用多台服务器组成 Cassandra 集群,您还需要确定每台服务器的角色(种子节点或非种子节点)和分区策略(单数据中心或多数据中心)。

安装 Cassandra

在本节中,我们将介绍如何在 Rocky Linux 8 系统上安装 Cassandra。我们假设您已经满足了上一节中的先决条件。

添加 Cassandra 仓库

首先,我们需要添加 Cassandra 的官方仓库,以便从中下载和安装 Cassandra 的软件包。为此,我们需要创建一个名为 /etc/yum.repos.d/cassandra.repo 的文件,并在其中添加以下内容:

[cassandra]
name=Apache Cassandra
baseurl=https://www.apache.org/dist/cassandra/redhat/311x/
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://www.apache.org/dist/cassandra/KEYS

这里,我们使用的是 Cassandra 的 3.11.x 版本的仓库,您也可以根据您的需要选择其他版本的仓库。

安装 Cassandra 软件包

接下来,我们可以使用 yum 命令来安装 Cassandra 的软件包。在终端中执行以下命令:

sudo yum install cassandra -y

这个命令会自动下载和安装 Cassandra 的软件包,以及它的依赖包。安装完成后,您可以使用以下命令来检查 Cassandra 的版本:

cassandra -v

您应该看到类似以下的输出:

3.11.11

这表示您已经成功地安装了 Cassandra 3.11.11 版本。

配置 Cassandra

在本节中,我们将介绍如何配置 Cassandra,以便让它正常运行和工作。我们假设您已经按照上一节中的步骤安装了 Cassandra。

修改 Cassandra 配置文件

Cassandra 的主要配置文件是 /etc/cassandra/conf/cassandra.yaml,它包含了 Cassandra 的各种参数和选项。您可以根据您的需要修改这个文件,但是有一些参数是必须修改的,特别是如果您打算使用多台服务器组成 Cassandra 集群的话。

以下是一些必须修改的参数及其含义:

  • cluster_name: 这个参数指定了 Cassandra 集群的名称,它必须在所有的集群节点上保持一致。您可以使用任意的名称,但是一旦设定,就不要轻易改变,否则会导致集群的不稳定。例如,您可以将其设置为 MyCassandraCluster
  • seed_provider: 这个参数指定了 Cassandra 集群的种子节点,它们是用来发现和加入集群的节点。您应该至少指定两个种子节点,以避免单点故障。您可以使用节点的 IP 地址或主机名来指定种子节点,但是必须确保它们可以被其他节点解析和访问。例如,您可以将其设置为 seeds: "192.168.1.1, 192.168.1.2"
  • listen_address: 这个参数指定了 Cassandra 节点的监听地址,它是用来接收集群间通信的地址。您应该将其设置为节点的 IP 地址或主机名,但是必须确保它可以被其他节点解析和访问。例如,您可以将其设置为 listen_address: 192.168.1.1
  • rpc_address: 这个参数指定了 Cassandra 节点的 RPC 地址,它是用来接收客户端请求的地址。您可以将其设置为 0.0.0.0,表示监听所有的网络接口,或者设置为节点的 IP 地址或主机名,但是必须确保它可以被客户端解析和访问。例如,您可以将其设置为 rpc_address: 0.0.0.0
  • endpoint_snitch: 这个参数指定了 Cassandra 节点的分区策略,它是用来决定节点之间的数据复制和负载均衡的策略。您可以根据您的集群的拓扑结构选择合适的分区策略,例如,如果您的集群只有一个数据中心,您可以使用 SimpleSnitch,如果您的集群有多个数据中心,您可以使用 GossipingPropertyFileSnitch。例如,您可以将其设置为 endpoint_snitch: GossipingPropertyFileSnitch

除了修改 cassandra.yaml 文件,您还需要修改 /etc/cassandra/conf/cassandra-rackdc.properties 文件,如果您使用了 GossipingPropertyFileSnitch 作为分区策略的话。这个文件用来指定每个节点所属的数据中心和机架,以便让 Cassandra 能够正确地分配和复制数据。您需要修改以下两个参数:

  • dc: 这个参数指定了节点所属的数据中心的名称,它必须在同一个数据中心的所有节点上保持一致。您可以使用任意的名称,但是一旦设定,就不要轻易改变,否则会导致数据的不一致。例如,您可以将其设置为 dc=DC1
  • rack: 这个参数指定了节点所属的机架的名称,它必须在同一个机架的所有节点上保持一致。您可以使用任意的名称,但是一旦设定,就不要轻易改变,否则会导致数据的不一致。例如,您可以将其设置为 rack=RAC1

启动 Cassandra 服务

修改完 Cassandra 的配置文件后,您就可以启动 Cassandra 的服务了。在终端中执行以下命令:

sudo systemctl start cassandra

这个命令会启动 Cassandra 的服务,并让它在后台运行。

验证 Cassandra 服务

启动 Cassandra 服务后,您可以使用以下命令来检查 Cassandra 服务的状态:

sudo systemctl status cassandra

您应该看到类似以下的输出:

● cassandra.service - LSB: distributed storage system for structured data
   Loaded: loaded (/etc/rc.d/init.d/cassandra; generated)
   Active: active (running) since Tue 2024-01-23 17:06:42 CST; 2min 13s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1234 ExecStart=/etc/rc.d/init.d/cassandra start (code=exited, status=0/SUCCESS)
    Tasks: 73 (limit: 4915)
   Memory: 1.2G
   CGroup: /system.slice/cassandra.service
           └─2345 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.el8_4.x86_64/jre/bin/java -Xloggc:/var/log/cassandra/gc.log -ea -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42 -XX:+HeapDumpOnOutOfMemoryError -Xss256k -XX:StringTableSize=1000003 -XX:+AlwaysPreTouch -XX:-UseBiasedLocking -XX:+UseTLAB -XX:+ResizeTLAB -XX:+UseNUMA -XX:+PerfDisableSharedMem -Djava.net.preferIPv4Stack=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=1 -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSWaitDuration=10000 -XX:+CMSParallelInitialMarkEnabled -XX:+CMSEdenChunksRecordAlways -XX:+CMSClassUnloadingEnabled -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -XX:+PrintPromotionFailure -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.password.file=/etc/cassandra/jmxremote.password -Djava.library.path=/usr/share/cassandra/lib/sigar-bin -javaagent:/usr/share/cassandra/lib/jamm-0.3.0.jar -Dcassandra.jmx.local.port=7199 -Dcom.sun.management.jmxremote.port=7199 -Dcom.sun.management.jmxremote.rmi.port=7199 -Xms2G -Xmx2G -Xmn400M -XX:+UseCondCardMark -XX:CompileCommandFile=/etc/cassandra/conf/hotspot_compiler -XX:MaxDirectMemorySize=2G -Dcassandra.config=file:///etc/cassandra/conf/cassandra.yaml -Dcassandra-foreground=yes -Dcassandra-pidfile=/var/run/cassandra/cassandra.pid -cp /etc/cassandra/conf:/usr/share/cassandra/lib/airline-0.6.jar:/usr/share/cassandra/lib/antlr-runtime-3.5.2.jar:/usr/share/cassandra/lib/asm-5.0.4.jar:/usr/share/cassandra/lib/caffeine-2.2.6.jar:/usr/share/cassandra/lib/cassandra-driver-core-3.0.1-shaded.jar:/usr/share/cassandra/lib/commons-cli-1.1.jar:/usr/share/cassandra/lib/commons-codec-1.9.jar:/usr/share/cassandra/lib/commons-lang3-3.1.jar:/usr/share/cassandra/lib/commons-math3-3.2.jar:/usr/share/cassandra/lib/compress-lzf-0.8.4.jar:/usr/share/cassandra/lib/concurrentlinkedhashmap-lru-1.4.jar:/usr/share/cassandra/lib/concurrent-trees-2.4.0.jar:/usr/share/cassandra/lib/disruptor-3.0.1.jar:/usr/share/cassandra/lib/ecj-4.4.2.jar:/usr/share/cassandra/lib/guava-18.0.jar:/usr/share/cassandra/lib/HdrHistogram-2.1.9.jar:/usr/share/cassandra/lib/high-scale-lib-1.0.6.jar:/usr/share/cassandra/lib/hppc-0.5.4.jar:/usr/share/cassandra/lib/jackson-core-asl-1.9.2.jar:/usr/share/cassandra/lib/jackson-mapper-asl-1.9.2.jar:/usr/share/cassandra/lib/jamm-0.3.0.jar:/usr/share/cassandra/lib/javax.inject.jar:/usr/share/cassandra/lib/jbcrypt-0.3m.jar:/usr/share/cassandra/lib/jcl-over-slf4j-1.7.7.jar:/usr/share/cassandra/lib/jctools-core-1.2.1.jar:/usr/share/cassandra/lib/jflex-1.6.0.jar:/usr/share/cassandra/lib/jna-4.2.2.jar:/usr/share/cassandra/lib/joda-time-2.4.jar:/usr/share/cassandra/lib/json-simple-1.1.jar:/usr/share/cassandra/lib/jstackjunit-0.0.1.jar:/usr/share/cassandra/lib/libthrift-0.9.2.jar:/usr/share/cassandra/lib/log4j-over-slf4j-1.7.7.jar:/usr/share/cassandra/lib/logback-classic-1.1.3.jar:/usr/share/cassandra/lib/logback-core-1.1.3.jar:/usr/share/cassandra/lib/lz4-1.3.0.jar:/usr/share/cassandra/lib/metrics-core-3.1.5.jar:/usr/share/cassandra/lib/metrics-jvm-3.1.5.jar:/usr/share/cassandra/lib/metrics-logback-3.1.5.jar:/usr/share/cassandra/lib/netty-all-4.0.44.Final.jar:/usr/share/cassandra/lib/ohc-core-0.4.4.jar:/usr/share/cassandra/lib/ohc-core-j8-0.4.4.jar:/usr/share/cassandra/lib/reporter-config3-3.0.3.jar:/usr/share/cassandra/lib/reporter-config-base-3.0.3.jar:/usr/share/cassandra/lib/sigar-1.6.4.jar:/usr/share/cassandra/lib/slf4j-api-1.7.7.jar:/usr/share/cassandra/lib/snakeyaml-1.11.jar:/usr/share/cassandra/lib/snappy-java-1.1.1.7.jar:/usr/share/cassandra/lib/snowball-stemmer-1.3.0.581.1.jar:/usr/share/cassandra/lib/ST4-4.0.8.jar:/usr/share/cassandra/lib/stream-2.5.2.jar:/usr/share/cassandra/lib/thrift-server-0.3.7.jar:/usr/share/cassandra/apache-cassandra-3.11.11.jar:/usr/share/cassandra/apache-cassandra-thrift-3.11.11.jar:/usr/share/cassandra/stress.jar: org.apache.cassandra.service.CassandraDaemon

如果您看到 Active: active (running),表示 Cassandra 服务已经成功启动并运行。

您也可以使用以下命令来查看 Cassandra 的日志文件,以便检查是否有任何错误或异常:

sudo tail -f /var/log/cassandra/system.log

您应该看到类似以下的输出:

INFO  [main] 2024-01-23 17:06:42,123 StorageService.java:1446 - JOINING: Finish joining ring
INFO  [main] 2024-01-23 17:06:42,179 StorageService.java:2289 - Node /192.168.1.1 state jump to NORMAL
INFO  [main] 2024-01-23 17:06:42,308 NativeTransportService.java:70 - Netty using native Epoll event loop
INFO  [main] 2024-01-23 17:06:42,359 Server.java:158 - Using Netty Version: [netty-buffer=netty-buffer-4.0.44.Final.452812a, netty-codec=netty-codec-4.0.44.Final.452812a, netty-codec-haproxy=netty-codec-haproxy-4.0.44.Final.452812a, netty-codec-http=netty-codec-http-4.0.44.Final.452812a, netty-codec-socks=netty-codec-socks-4.0.44.Final.452812a, netty-common=netty-common-4.0.44.Final.452812a, netty-handler=netty-handler-4.0.44.Final.452812a, netty-tcnative=netty-tcnative-1.1.33.Fork26.142ecbb, netty-transport=netty-transport-4.0.44.Final.452812a, netty-transport-native-epoll=netty-transport-native-epoll-4.0.44.Final.452

好的,我将继续为您生成文章的内容。

连接 Cassandra 数据库

配置好 Cassandra 服务后,您就可以使用 CQL (Cassandra Query Language) 来连接和操作 Cassandra 数据库了。CQL 是一种类似 SQL 的查询语言,它可以让您创建、修改、删除和查询 Cassandra 的数据和对象。

要使用 CQL,您需要使用 Cassandra 提供的 cqlsh 工具,它是一个基于 Python 的命令行界面。您可以在任何一台安装了 Cassandra 的服务器上运行 cqlsh 命令,或者在其他机器上安装 cqlsh 工具,只要能够访问 Cassandra 的 RPC 地址和端口即可。

在终端中执行以下命令:

cqlsh 192.168.1.1 9042

这个命令会连接到 Cassandra 节点 192.168.1.1 的 CQL 端口 9042,并进入 cqlsh 的交互模式。您应该看到类似以下的输出:

Connected to MyCassandraCluster at 192.168.1.1:9042.
[cqlsh 5.0.1 | Cassandra 3.11.11 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cqlsh>

这表示您已经成功地连接到 Cassandra 数据库,并可以开始执行 CQL 命令了。您可以在 cqlsh> 提示符后输入任何有效的 CQL 命令,并以分号 (;) 结尾,然后按回车键执行。您也可以使用 HELP 命令来查看 cqlsh 的帮助信息,或者使用 EXIT 命令来退出 cqlsh

使用 CQL 操作 Cassandra 数据库

在本节中,我们将介绍如何使用 CQL 来操作 Cassandra 数据库,包括创建、修改、删除和查询数据和对象。我们假设您已经按照上一节中的步骤连接到 Cassandra 数据库,并进入了 cqlsh 的交互模式。

创建键空间

键空间 (Keyspace) 是 Cassandra 数据库的最高层次的命名空间,它用来存储和组织相关的列族 (Column Family)。列族是 Cassandra 数据库的基本数据结构,它用来存储和管理数据的列和行。每个键空间可以包含多个列族,但是每个列族只能属于一个键空间。

要创建一个键空间,您需要使用 CREATE KEYSPACE 命令,并指定键空间的名称、复制策略和复制因子。复制策略是用来决定数据在集群中的复制方式的策略,复制因子是用来决定数据在集群中的副本数量的因子。例如,您可以使用以下命令来创建一个名为 test 的键空间,使用 SimpleStrategy 作为复制策略,使用 3 作为复制因子:

CREATE KEYSPACE test WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};

这个命令会在 Cassandra 集群中创建一个名为 test 的键空间,并将其数据复制到三个节点上。您可以使用 DESCRIBE KEYSPACES 命令来查看已经存在的键空间,或者使用 DESCRIBE KEYSPACE test 命令来查看 test 键空间的详细信息。

创建列族

列族 (Column Family) 是 Cassandra 数据库的基本数据结构,它用来存储和管理数据的列和行。每个列族都有一个唯一的名称,以及一个定义了列族的结构和属性的模式。每个列族都包含多个行,每个行都有一个唯一的行键 (Row Key)。每个行都包含多个列,每个列都有一个唯一的列名 (Column Name)、一个列值 (Column Value) 和一个时间戳 (Timestamp)。

要创建一个列族,您需要使用 CREATE TABLE 命令,并指定列族所属的键空间、列族的名称、列族的模式和列族的属性。例如,您可以使用以下命令来创建一个名为 users 的列族,属于 test 键空间,包含三个列:idnameemail,其中 id 是主键 (Primary Key),用来唯一标识每个行:

CREATE TABLE test.users (
  id int PRIMARY KEY,
  name text,
  email text
);

这个命令会在 test 键空间中创建一个名为 users 的列族,并定义了它的模式。您可以使用 DESCRIBE TABLES 命令来查看一个键空间中的所有列族,或者使用 DESCRIBE TABLE test.users 命令来查看 users 列族的详细信息。

插入数据

插入数据是向列族中添加新的行或更新已有的行的操作。要插入数据,您需要使用 INSERT INTO 命令,并指定列族的名称、要插入的列和值。例如,您可以使用以下命令来向 users 列族中插入一些数据:

INSERT INTO test.users (id, name, email) VALUES (1, 'Alice', '[email protected]');
INSERT INTO test.users (id, name, email) VALUES (2, 'Bob', '[email protected]');
INSERT INTO test.users (id, name, email) VALUES (3, 'Charlie', '[email protected]');

这些命令会在 users 列族中插入三个行,每个行都有一个唯一的 id,以及对应的 nameemail。您可以使用 SELECT 命令来查看插入的数据,例如,您可以使用以下命令来查看 users 列族中的所有数据:

SELECT * FROM test.users;

您应该看到类似以下的输出:

 id | email             | name
----+-------------------+---------
  1 | [email protected] |   Alice
  2 |  [email protected]  |    Bob
  3 | [email protected] | Charlie

(3 rows)

这表示您已经成功地插入了数据到 users 列族中。您也可以使用 WHERE 子句来指定查询的条件,例如,您可以使用以下命令来查看 id1 的行:

SELECT * FROM test.users WHERE id = 1;

您应该看到类似以下的输出:

 id | email             | name
----+-------------------+---------
  1 | [email protected] |   Alice

(1 rows)

这表示您已经成功地查询了 users 列族中的特定的行。

结论

本文介绍了如何在 Rocky Linux 8 系统上安装和配置 Cassandra,以及如何使用 CQL 进行基本的数据库操作。我们首先添加了 Cassandra 的官方仓库,并使用 yum 命令来安装 Cassandra 的软件包。然后,我们修改了 Cassandra 的配置文件,设置了集群的名称、种子节点、监听地址、RPC 地址、分区策略等参数。接着,我们启动了 Cassandra 的服务,并使用 cqlsh 工具来连接和操作 Cassandra 数据库。最后,我们使用 CQL 来创建键空间和列族,并插入、查询和删除数据。

通过本文,您可以了解到 Cassandra 的基本概念和用法,以及如何在 Rocky Linux 8 系统上部署和使用 Cassandra。您也可以根据您的需要进一步探索 Cassandra 的高级功能和特性,例如,如何调优 Cassandra 的性能、如何备份和恢复 Cassandra 的数据、如何监控和管理 Cassandra 的集群等。