作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。
介绍
Apache Cassandra是一个开源,无主导,分布式NoSQL数据库系统. Cassandra适合任务关键的应用程序和多节点设置,因为它是可扩展,弹性和容错的。
在本教程中,您将安装Cassandra并在Ubuntu 22.04上运行一个多节点集群。
前提条件
要完成本教程,您将需要以下内容:
- 至少有 2 台 Ubuntu 22.04 服务器配置使用 Ubuntu 22.04 初始服务器安装指南具有 sudo 非根用户、防火墙和在同一数据中心区域内至少有 2 GB 的 RAM. Cassandra 不会在仅有 1 GB 的 RAM 的服务器上运行。 请参阅 Cassandra 的官方硬件要求指南以获取更多信息。 建议但不要求,您的集群中的所有节点都具有相同或类似的规格。
- Java 运行时间安装在您的机器上。 您可以使用 How to Install with Apt Java on Ubuntu 22.04的 How to Install with Apt Java on Ubuntu 22.04]运行 OpenJDK 8, OpenJDK 11, O
<$>[注] 注: 请确保在完成前提步骤后重新启动服务器,并在开始本文的第 1 步之前。
步骤 1 — 配置防火墙以允许卡桑德拉流量
要使多节点集群运作,所有会员节点必须能够进行通信,这意味着防火墙必须配置以允许卡桑德拉流量。
对于每个节点,您需要允许从集群中的其他节点通过以下网络端口的流量:
7000
是命令和数据的 TCP 端口。9042
是本地传输服务器的 TCP 端口。
最佳安全实践规定,对于数据中心区域内的所有节点,所有通信都应该通过内部网络接口,而不是面向互联网的网络接口。
您可以从您的 DigitalOcean 仪表板中获取这些信息(从每个 Droplet 的 ** 网络** 选项卡)。
1hostname -I | cut -d' ' -f3
命令hostname
的I
选项导致它以单行输出与服务器相关的所有IPv4地址,每个地址被单个空间分开(除了循环返回地址127.0.0.1
)。
d
选项告诉cut
命令如何分离或划界收到的输出,在这种情况下,它们被单个空间分开。
f3
选项告诉cut
命令输出第三个字段,这是您想要的私人网络接口的IP地址。
运行在每个节点上,你现在应该有所有节点的私人网络接口的IP地址,下一步是使用这些IP地址修改每个节点的防火墙规则。
在本教程中,第一个节点将被称为node1
,第二个节点将被称为node2
。
在node1
中,执行以下命令:
1sudo ufw allow from node2-internal-ip-address to node1-internal-ip-address proto tcp port 7000,9042
在node2
上,扭转 IP 地址如下:
1sudo ufw allow from node1-internal-ip-address to node2-internal-ip-address proto tcp port 7000,9042
重复对群集中的尽可能多的节点的命令,只改变 IP 地址的序列. 如果你在群集中有 N 节点,你需要在每个节点上运行 ** N - 1** 的命令。
规则立即生效,因此您无需重新加载防火墙,您可以使用以下命令查看每个节点上的防火墙规则:
1sudo ufw status numbered
输出将显示您刚刚添加的规则(s):
1[secondary_label Output]
2Status: active
3
4 To Action From
5 -- ------ ----
6[ 1] OpenSSH ALLOW IN Anywhere
7[ 2] 10.124.0.3 7000,9042/tcp ALLOW IN 10.124.0.2
8[ 3] OpenSSH (v6) ALLOW IN Anywhere (v6)
有了防火墙规则,你应该能够将一个节点从另一个节点 ping. 使用此命令在终端中的一个节点发送三包到另一个节点:
1ping -c 3 internal-ip-address-of-other-node
如果包通过防火墙传输,输出应该是这样的:
1[secondary_label Output]
2PING internal-ip-address-of-other-node (internal-ip-address-of-other-node) 56(84) bytes of data.
364 bytes from internal-ip-address-of-other-node: icmp_seq=1 ttl=64 time=0.043 ms
464 bytes from internal-ip-address-of-other-node: icmp_seq=2 ttl=64 time=0.061 ms
564 bytes from internal-ip-address-of-other-node: icmp_seq=3 ttl=64 time=0.066 ms
6
7--- internal-ip-address-of-other-node ping statistics ---
83 packets transmitted, 3 received, 0% packet loss, time 2036ms
9rtt min/avg/max/mdev = 0.043/0.056/0.066/0.009 ms
如果 ping 失败了,请查看您的防火墙规则以重新设置它们. 如果您无法从另一个节点 ping,您将无法设置您的多节点 Cassandra 集群。
随着防火墙的配置,您现在可以直接开始设置Cassandra。
步骤 2 — 删除 Cassandra 的预安装数据
您现在在每个服务器上都有一个单节点集群,它将成为您的多节点集群的一部分. 在此步骤中,您将设置节点作为一个,并作为一个多节点的Cassandra集群。
本步骤中的命令必须在参与集群的每个节点上重复,因此打开集群中有节点的尽可能多的壳终端。
您在每个节点上运行的第一个命令将阻止卡桑德拉大象:
1sudo systemctl stop cassandra
然后删除(rm
)每个安装Cassandra的默认数据集:
1sudo rm -rf /var/lib/cassandra/*
r
选项反复删除目标目录下的所有文件和文件夹. f
选项表示永远不要要求用户输入。
当所有将成为群集的一部分节点完成时,它们现在已经准备好将其配置为群集成员。
步骤 3 — 配置卡桑德拉集群
在这个步骤中,你将对卡桑德拉的配置文件在所有将是集群的一部分的节点进行必要的更改. 对于错误容忍和更大的生产,你可能有多个种子节点,但本教程只会使用一个种子节点。
配置文件 /etc/cassandra/cassandra.yaml
包含许多指令,并被评论得非常好. 从指定的种子节点(node1
在本教程中),打开配置文件使用:
1sudo nano /etc/cassandra/cassandra.yaml
您只會在檔案中修改下列指令,以建立多節點 Cassandra 集群:
1[label /etc/cassandra/cassandra.yaml]
2...
3cluster_name: 'CassandraDOCluster'
4...
5seed_provider:
6 - class_name: org.apache.cassandra.locator.SimpleSeedProvider
7 parameters:
8 - seeds: "node1-internal-ip-address"
9...
10listen_address: "targetnode-internal-ip-address"
11...
12rpc_address: "targetnode-internal-ip-address"
13...
14endpoint_snitch: GossipingPropertyFileSnitch
15...
16auto_bootstrap: false
更新「cluster_name」以您的集群名称。本示例使用「CassandraDOCluster」。
在种子提供者
部分下,有一个命名为-种子
的内部 IP 地址列表,用于您的集群的种子节点(s).在每个节点的配置文件中,-种子
部分将有种子节点的 IP 地址。
listen_address
和rpc_address
的默认设置为localhost
,但两者都需要更改为目标节点的内部IP地址。对于node1
上的文件,您将在三个位置放置相同的node1-internal-ip-address
。对于node2
上的文件,您将把node1-internal-ip-address
放置在种子
下,并使用node2-internal-ip-address
作为listen_address
和rpc_address
。
endpoint_snitch
是用于在你的Cassandra集群中找到节点和路由请求的snitch类的名称。 默认情况下,它被设置为 SimpleSnitch
,这只适用于单个数据中心内的Cassandra集群。 对于生产部署,建议使用 GossipingPropertyFileSnitch
。
auto_bootstrap
指令不在配置文件中,因此需要添加并设置为false
。如果您正在向现有集群添加节点,但需要在初始化新集群时(没有数据的集群)是可选的。
当您完成修改文件时,保存并关闭它. 重复此步骤为您想要在集群中包含的所有服务器,确保种子节点(s)列表相同,并且listen_address
和rpc_address
匹配目标节点的内部 IP 地址。
<$>[注] 注: Cassandra 产品文档指出,在修改文件后,每个节点必须重新启动,但对于本教程中使用的节点来说,这不是必要的。
所有节点已经正确配置后,您将下一步在所有节点上重新启动Cassandra Daemon。
步骤 4 —重新启动卡桑德拉
随着所有节点的配置,您可以在每个节点上重新启动Cassandra daemon,从种子节点开始。
首先,在终端中运行种子节点的下列命令:
1sudo systemctl start cassandra
請確定 DAEMON 是否活躍:
1sudo systemctl status cassandra
你会看到这样的输出:
1[secondary_label Output]
2● cassandra.service - LSB: distributed storage system for structured data
3 Loaded: loaded (/etc/init.d/cassandra; generated)
4 Active: active (running) since Sat 2022-07-09 22:43:19 UTC; 22h ago
5 Docs: man:systemd-sysv-generator(8)
6 Tasks: 70 (limit: 2327)
7 Memory: 1.2G
8 CPU: 44min 311ms
9 CGroup: /system.slice/cassandra.service
10 └─18800 /usr/bin/java -ea -da:net.openhft... -XX:+UseThreadPriorities -XX:+HeapDumpOnOutOfMemoryError -Xss256k -XX:+A>
11
12Jul 09 22:43:19 cassa-1 systemd[1]: Starting LSB: distributed storage system for structured data...
13Jul 09 22:43:19 cassa-1 systemd[1]: Started LSB: distributed storage system for structured data.
使用相同的命令,在其他节点(s)上重新启动 DAEMON,并验证 DAEMON在每个节点上运行。
在此步骤中,您重新启动了 Cassandra 节点. 在下一步和最后一步,您将检查集群的状态并连接到它。
步骤 5 — 连接到您的多节点卡桑德拉集群
您已完成所有必要步骤,使节点成为多节点集群. 在此步骤中,您将连接到集群。
首先,检查节点是否在通信:
1sudo nodetool status
产量应该是:
1[secondary_label Output]
2Datacenter: dc1
3===============
4Status=Up/Down
5|/ State=Normal/Leaving/Joining/Moving
6-- Address Load Tokens Owns (effective) Host ID Rack
7UN 10.124.0.3 991.64 KiB 256 100.0% 9ab882d9-b408-4e75-bd00-79f278e81277 rack1
8UN 10.124.0.2 413.57 KiB 256 100.0% 92fc1d95-cf4e-4a68-b1cf-d7e2507fc003 rack1
如果您可以看到您配置的所有节点,您将成功设置多节点卡桑德拉集群。
接下来,使用cqlsh
连接到群集,当您使用cqlsh
时,您可以指定群集中的任何节点的IP地址:
1cqlsh server-internal-ip-address 9042
「9042」是「cqlsh」将用于连接到集群的TCP端口。
你会看到它连接:
1[secondary_label Output]
2Connected to CassandraDOCluster at 10.124.0.2:9042
3[cqlsh 6.0.0 | Cassandra 4.0.4 | CQL spec 3.4.5 | Native protocol v5]
4Use HELP for help.
5cqlsh>
您还可以查询集群以查看集群信息:
1describe cluster
结果将是这样的:
1[secondary_label Output]
2Cluster: CassandraDOCluster
3Partitioner: Murmur3Partitioner
4Snitch: DynamicEndpointSnitch
退出
类型:
1exit
您现在可以连接到您的多节点集群。
结论
你现在有一个多节点卡桑德拉集群运行在Ubuntu 22.04. 有关卡桑德拉的更多信息可在 项目的网站找到。 有关种子节点的更多信息,请参阅 FAQ 中的什么是种子?
(https://cassandra.apache.org/doc/trunk/cassandra/faq/# what-are-seeds)。 如果你需要解决这个集群,请检查 /var/log/cassandra
目录中的日志文件。