Cassandra 2.2.19集群配置Ec2Snitch启动报错无法实例化类求助
故障根因
你遇到的启动错误是Cassandra 2.2.19版本的Ec2Snitch初始化失败导致的,该Snitch运行时必须调用EC2实例元数据服务(默认地址169.254.169.254)获取实例的可用区、区域信息,日志中已经明确报错Ec2Snitch was unable to execute the API call,说明实例无法正常访问EC2元数据接口。
排查&解决方案
- 先验证元数据接口连通性
在EC2实例上执行以下命令,确认元数据接口可访问:
curl http://169.254.169.254/latest/meta-data/placement/availability-zone
如果命令返回失败,按以下顺序排查:
- 确认EC2实例的IMDS配置没有关闭元数据服务,且允许IMDSv1访问(Cassandra 2.2.19的Ec2Snitch不支持IMDSv2)
- 确认实例所属安全组、网络ACL没有拦截到
169.254.169.254的出站流量,该地址为AWS内网链路本地地址,不需要公网权限即可访问 - 确认私有子网路由表没有拦截该地址的路由
- 替代方案(无需调整EC2网络配置)
如果不想调整元数据相关配置,可以根据集群部署场景选择合适的Snitch:
- 若双节点都部署在同一AWS可用区:直接使用你已经验证可用的
SimpleSnitch即可,完全满足单数据中心双节点集群的需求 - 若双节点跨可用区部署:替换为
GossipingPropertyFileSnitch,手动在每个节点的cassandra-rackdc.properties配置文件中填写对应节点的dc(对应AWS区域,如us-east-1)和rack(对应AWS可用区,如us-east-1a)信息,即可实现和Ec2Snitch完全一致的拓扑感知能力,无需调用AWS元数据接口。
额外配置提醒
你当前的seed_provider配置中仅填写了当前节点的私有IP,双节点集群需要把两个节点的私有IP都加入seed列表,否则两个节点无法自动发现组成集群,示例配置如下:
seed_provider: - class_name: org.apache.cassandra.locator.SimpleSeedProvider parameters: - seeds: "节点1私有IP,节点2私有IP"
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

