在Mesosphere DC/OS上用Docker部署Cassandra集群遇重复创建容器问题求助
问题分析与解决方案
首先,咱们先拆解你遇到的核心问题:Marathon反复重启Cassandra容器,显示TASK_FAILED并提示"容器因Broken pipe信号终止",但宿主机上容器明明在运行。这大概率是端口配置错误+缺少健康检查导致的Marathon误判。
核心原因
端口映射完全错误
你配置的containerPort: 8000,但Cassandra默认根本不监听这个端口!Cassandra的核心常用端口是:- CQL客户端通信:9042
- Thrift接口:9160
- 集群内部节点通信:7000/7001
- JMX管理端口:7199
Marathon会尝试探测你指定的main端口(8000)是否有服务响应,结果连不上,就会认为容器启动失败,触发重启逻辑。
缺少明确的健康检查配置
你的JSON里没有定义healthChecks字段,Marathon只能依赖端口探测来判断服务状态。但端口本身就错了,自然会持续误判。另外,Cassandra启动需要一定的初始化时间(尤其是第一次启动),没有健康检查宽限期的话,Marathon会在容器还没完全就绪时就开始探测,直接标记失败。Broken pipe信号的由来
当Marathon尝试连接容器的8000端口时,容器没有监听这个端口,TCP连接会被重置,Marathon端就会收到Broken pipe错误,进而标记任务失败,启动新容器。
修正后的Cassandra配置文件
我帮你调整了端口映射,添加了合理的健康检查,同时保留了你原有的其他配置:
{ "id": "/cassandra", "acceptedResourceRoles": [ "*" ], "backoffFactor": 1.15, "backoffSeconds": 1, "container": { "portMappings": [ { "containerPort": 9042, "hostPort": 0, "protocol": "tcp", "servicePort": 10003, "name": "cql" } ], "type": "DOCKER", "volumes": [], "docker": { "image": "cassandra:3.9", "forcePullImage": false, "privileged": false, "parameters": [] } }, "cpus": 3, "disk": 10000, "instances": 1, "maxLaunchDelaySeconds": 300, "mem": 6000, "gpus": 0, "networks": [ { "mode": "container/bridge" } ], "requirePorts": false, "upgradeStrategy": { "maximumOverCapacity": 1, "minimumHealthCapacity": 1 }, "killSelection": "YOUNGEST_FIRST", "unreachableStrategy": { "inactiveAfterSeconds": 0, "expungeAfterSeconds": 0 }, "fetch": [], "constraints": [], "healthChecks": [ { "protocol": "TCP", "portIndex": 0, "gracePeriodSeconds": 45, "intervalSeconds": 15, "timeoutSeconds": 5, "maxConsecutiveFailures": 3 } ] }
关键调整说明
- 端口修正:把
containerPort改成9042(Cassandra默认CQL端口),同时把端口名称改成cql更清晰。 - 添加TCP健康检查:
gracePeriodSeconds: 45:给Cassandra足够的启动初始化时间,避免启动初期被误判为失败。intervalSeconds: 15:每15秒检查一次端口连通性。maxConsecutiveFailures: 3:连续3次失败才标记任务失败,减少误判概率。
额外验证步骤
- 部署修正后的配置后,在DC/OS GUI里观察任务状态,等待45秒的健康检查宽限期,看是否能进入
TASK_RUNNING状态。 - 进入宿主机的Cassandra容器,执行
nodetool status确认Cassandra节点正常运行:docker exec -it <容器ID> nodetool status - 如果需要扩展集群到多实例,记得添加Cassandra集群相关的配置(比如
seeds参数),可以通过Docker的parameters传递环境变量,比如:"docker": { "image": "cassandra:3.9", "forcePullImage": false, "privileged": false, "parameters": [ {"name": "env", "value": "CASSANDRA_SEEDS=<第一个节点的IP>"} ] }
内容的提问来源于stack exchange,提问作者govind
相关产品推荐
相关产品推荐

