我正在尝试通过docker设置Apache CassandraDB集群。
我已经设法使用docker run --network cassandra -e CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch -e CASSANDRA_SEEDS=node0 --name "node0" -d cassandra
创建了多达3个节点。
每当我使用相同的命令添加第4个节点(只是更改容器名称)时,集群中的另一个随机节点崩溃,并且创建的节点也在UJ
和DJ
阶段后不久退出。
这是我试过的。
docker network create cassandra
docker run --network cassandra -e CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch -e CASSANDRA_SEEDS=node0 --name "node0" -d cassandra
然后等待,直到节点启动,nodetool显示如下:
Datacenter: dc1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 172.19.0.2 88.49 KiB 16 100.0% 15573541-fc19-4569-9a43-cb04e49e134f rack1
之后,我向集群中添加了两个额外的节点。
docker run --network cassandra -e CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch -e CASSANDRA_SEEDS=node0 --name "node1" -d cassandra
docker run --network cassandra -e CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch -e CASSANDRA_SEEDS=node0 --name "node2" -d cassandra
我一直等到这两个加入集群,然后nodeool显示了这个:
Datacenter: dc1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 172.19.0.2 74.11 KiB 16 64.7% 15573541-fc19-4569-9a43-cb04e49e134f rack1
UN 172.19.0.4 98.4 KiB 16 76.0% 30afdc85-e863-452c-9031-59803e4b1f11 rack1
UN 172.19.0.3 74.04 KiB 16 59.3% 6d92cf62-65b4-4365-ab28-2d53872605e3 rack1
看起来不错!之后,我想添加另一个节点来测试复制因子是否正常工作。因此,我使用相同的命令向集群添加了另一个节点:
docker run --network cassandra -e CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch -e CASSANDRA_SEEDS=node0 --name "node3" -d cassandra
当我添加这个节点时,node1
立即崩溃。node3
(这是一个新的)在UJ
(上行连接)阶段,然后切换到DJ
(下行连接),然后从节点列表中删除。
以下是nodetool status
的结果,按顺序:
Datacenter: dc1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 172.19.0.2 74.11 KiB 16 64.7% 15573541-fc19-4569-9a43-cb04e49e134f rack1
UN 172.19.0.4 74.03 KiB 16 76.0% 30afdc85-e863-452c-9031-59803e4b1f11 rack1
DN 172.19.0.3 74.04 KiB 16 59.3% 6d92cf62-65b4-4365-ab28-2d53872605e3 rack1
Datacenter: dc1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UJ 172.19.0.5 20.75 KiB 16 ? 2e4a25e4-3c81-4383-9c9f-6326e4043910 rack1
UN 172.19.0.2 74.11 KiB 16 64.7% 15573541-fc19-4569-9a43-cb04e49e134f rack1
UN 172.19.0.4 74.03 KiB 16 76.0% 30afdc85-e863-452c-9031-59803e4b1f11 rack1
DN 172.19.0.3 74.04 KiB 16 59.3% 6d92cf62-65b4-4365-ab28-2d53872605e3 rack1
Datacenter: dc1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
DJ 172.19.0.5 20.75 KiB 16 ? 2e4a25e4-3c81-4383-9c9f-6326e4043910 rack1
UN 172.19.0.2 74.11 KiB 16 64.7% 15573541-fc19-4569-9a43-cb04e49e134f rack1
UN 172.19.0.4 74.03 KiB 16 76.0% 30afdc85-e863-452c-9031-59803e4b1f11 rack1
DN 172.19.0.3 74.04 KiB 16 59.3% 6d92cf62-65b4-4365-ab28-2d53872605e3 rack1
Datacenter: dc1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 172.19.0.2 74.11 KiB 16 64.7% 15573541-fc19-4569-9a43-cb04e49e134f rack1
UN 172.19.0.4 74.03 KiB 16 76.0% 30afdc85-e863-452c-9031-59803e4b1f11 rack1
DN 172.19.0.3 74.04 KiB 16 59.3% 6d92cf62-65b4-4365-ab28-2d53872605e3 rack1
以下是node1
的日志:如您所见,日志中的第一项是确认node2
已连接到集群。
https://gist.github.com/janic0/7e464e5c819c37e6ed38819fb3c19eff
以下是node3
(同样,这是新节点)的日志
https://gist.github.com/janic0/0968b7136c3beb3ef76a2379f3cd9be5
我调查了一下,发现Docker杀死这些容器的退出码是137 -或者"内存不足"。
是的,我就知道会发生这样的事。
每个节点使用了大约4GB的RAM,第四个节点刚好足以迫使Docker杀死一些容器。如果出于某种原因需要在一台机器上托管那么多节点,可以增加内存限制:
我以前做过类似的事情。如果您只是要进行一些本地测试,并且需要一个多节点集群,那么我以前使用过Minikube。事实上,我整理了一个repo,里面有一些资源:https://github.com/aploetz/cassandra_minikube
但另一种方法可能是"快速修复"。对您来说,就是显式地调整Java堆大小,使每个节点的堆大小都小得多。在上面的Minikube示例中,我设置:
-Xms512M
-Xmx512M
-Xmn256M
这将创建1/2gb的堆,这对于本地开发或一些简单的测试来说已经足够了。你可以在你的cassandra-env.sh
或jvm-server.options
文件中设置这些值(取决于你的Cassandra版本)。