我在XUbuntu上,所有最新的更新都已应用。
我已经设置了Docker repo,并安装了最新的Docker工具套件。
我已经使用apt-get
并安装了docker-compose
。
我创建了以下docker-compose.yaml
文件:
version: "3.3"
networks:
cassandra-net:
driver: bridge
services:
cassandra-1:
image: "cassandra:latest"
container_name: "cassandra-1"
ports:
- "7000:7000"
- "9042:9042"
networks:
- "cassandra-net"
volumes:
- ./volumes/cassandra-1:/var/lib/cassandra:rw
cassandra-2:
image: "cassandra:latest"
container_name: "cassandra-2"
environment:
- "CASSANDRA_SEEDS=cassandra-1"
networks:
- "cassandra-net"
depends_on:
- "cassandra-1"
volumes:
- ./volumes/cassandra-2:/var/lib/cassandra:rw
cassandra-3:
image: "cassandra:latest"
container_name: "cassandra-3"
networks:
- "cassandra-net"
environment:
- "CASSANDRA_SEEDS=cassandra-1"
depends_on:
- "cassandra-1"
volumes:
- ./volumes/cassandra-3:/var/lib/cassandra:rw
当我使用这个bash脚本检查三个节点(cassandra-1,cassandra-2,cassandra-3)的状态时:
docker exec -it cassandra-1 nodetool status
docker exec -it cassandra-2 nodetool status
docker exec -it cassandra-3 nodetool status
我得到以下输出:
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 172.18.0.3 252.53 KiB 16 100.0% 640dbf8a-13bb-46e5-8b1e-4542ee3352c4 rack1
UN 172.18.0.2 189.34 KiB 16 100.0% 7807001a-1885-41d1-b661-bd6c7e0db239 rack1
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 172.18.0.4 178.24 KiB 16 100.0% fe8fb5fe-7342-4eeb-92bb-01a755ecd8ad rack1
UN 172.18.0.2 263.65 KiB 16 100.0% 7807001a-1885-41d1-b661-bd6c7e0db239 rack1
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 172.18.0.3 178.2 KiB 16 100.0% 640dbf8a-13bb-46e5-8b1e-4542ee3352c4 rack1
UN 172.18.0.2 263.65 KiB 16 100.0% 7807001a-1885-41d1-b661-bd6c7e0db239 rack1
我希望看到每个节点看到所有三个地址(172.18.0.2,3,4),但每个节点只“看到”另一个节点,而不是其他两个。
1条答案
按热度按时间v6ylcynt1#
我在使用Docker Compose在本地环境中启动节点时遇到了类似的问题。
我是通过以下几种方法解决的:
cassandra-1
运行正常,然后启动cassandra-2
,还要确保cassandra-2
节点运行正常,然后启动cassandra-3
,依此类推。基本上,防止所有节点同时启动,特别是种子节点之后的节点。当节点与Compose * 同时 * 启动时,可能会导致错误,例如与令牌范围冲突,导致某些节点无法加入集群。CASSANDRA_CLUSTER_NAME
和CASSANDRA_DC
环境变量,这将相应地在cassandra.yaml
配置中设置cluster_name
,并在cassandra-rackdc.properties
文件中设置dc
选项。这允许您显式地告诉节点加入同一个数据中心和集群。这些选项仅适用于GossipingPropertyFileSnitch
。有了这些,这里是一个修改后的Compose文件版本:
这里的主要内容是
healthcheck
块.以及每个节点上更新的
depends_on
修改后的Compose将
cassandra-3
设置为 only 在cassandra-2
健康时启动,并 only 在cassandra-1
健康时启动cassandra-2
。在该Compose文件中:nodetool status
(给予时间让节点启动/引导)如果你轮询
docker container ls
,你会看到这样的东西:.而节点从1开始。在上面的例子中,
cassandra-3
正在等待cassandra-2
在启动之前变为“(healthy)”,这就是为什么您还没有看到它。使用
nodetool status
不是最好的健康检查,但它至少可以等待节点完成引导。您可以通过解析输出并确保节点在列表中为UN
来改进它。2m
的间隔/周期也是任意的,根据您的test
设置适合您的系统的任何内容。里面还有一些额外的env变量
.这可能是不需要的,因为这些已经是
cassandra
Docker镜像的默认值(请参阅Dockerhub页面上的Configuring Cassandra部分。基本上,它们显式地将容器的IP地址设置为侦听和广播地址。我只是在这里记下它,以防默认值更改。最后,在我们的环境中,如果你在同一台机器上运行所有节点,你需要为每个节点指定不同的端口:
.否则,容器可能无法正确启动。
如果一切顺利:
主要问题是启动节点需要很长时间。在示例Compose文件中,
healthcheck.interval
是2m
,所有3个节点都需要大约5分钟才能正确启动。