实例化告密者类“org.apache.cassandra.locator.Ec2Snitch”时出错

问题描述 投票:0回答:2

我很难在 Ec2 实例上设置 2 节点 Cassandra 集群。这是2.2.19版本。由于涉及一些其他依赖项,我无法升级。

Ec2 实例位于私有子网中。分配静态私有 ip

这是我的 cassandra.yaml

cluster_name: 'Test-cluster'
data_file_directories:
    - /var/lib/cassandra/data
commitlog_directory: /var/lib/cassandra/commitlog
saved_caches_directory: /var/lib/cassandra/saved_caches
commitlog_sync: periodic
commitlog_sync_period_in_ms: 10000

commitlog_segment_size_in_mb: 32

seed_provider:
    # Addresses of hosts that are deemed contact points.
    # Cassandra nodes use this list of hosts to find each other and learn
    # the topology of the ring.  You must change this if you are running
    # multiple nodes!
    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
      parameters:
          # seeds is actually a comma-delimited list of addresses.
          # Ex: "<ip1>,<ip2>,<ip3>"
          - seeds: "${private_ip}"
listen_address: ${private_ip}
start_native_transport: true
native_transport_port: 9042
storage_port: 7000
num_tokens: 32
ssl_storage_port: 9042
start_rpc: true
rpc_address: ${private_ip}
rpc_port: 9160
broadcast_rpc_address: ${private_ip}
endpoint_snitch: Ec2Snitch
partitioner: org.apache.cassandra.dht.RandomPartitioner

这是我的系统日志

INFO  [main] 2021-06-07 18:42:41,900 DatabaseDescriptor.java:327 - DiskAccessMode 'auto' determined to be mmap, indexAccessMode is mmap
INFO  [main] 2021-06-07 18:42:42,022 DatabaseDescriptor.java:437 - Global memtable on-heap threshold is enabled at 251MB
INFO  [main] 2021-06-07 18:42:42,023 DatabaseDescriptor.java:441 - Global memtable off-heap threshold is enabled at 251MB
ERROR [main] 2021-06-07 18:42:42,049 CassandraDaemon.java:787 - Exception encountered during startup
org.apache.cassandra.exceptions.ConfigurationException: Error instantiating snitch class 'org.apache.cassandra.locator.Ec2Snitch'.
        at org.apache.cassandra.utils.FBUtilities.construct(FBUtilities.java:551) ~[apache-cassandra-2.2.19.jar:2.2.19]
        at org.apache.cassandra.utils.FBUtilities.construct(FBUtilities.java:529) ~[apache-cassandra-2.2.19.jar:2.2.19]
        at org.apache.cassandra.config.DatabaseDescriptor.createEndpointSnitch(DatabaseDescriptor.java:741) ~[apache-cassandra-2.2.19.jar:2.2.19]
        at org.apache.cassandra.config.DatabaseDescriptor.applyConfig(DatabaseDescriptor.java:465) ~[apache-cassandra-2.2.19.jar:2.2.19]
        at org.apache.cassandra.config.DatabaseDescriptor.<clinit>(DatabaseDescriptor.java:133) ~[apache-cassandra-2.2.19.jar:2.2.19]
        at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:599) [apache-cassandra-2.2.19.jar:2.2.19]
        at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:774) [apache-cassandra-2.2.19.jar:2.2.19]
Caused by: org.apache.cassandra.exceptions.ConfigurationException: Ec2Snitch was unable to execute the API call. Not an ec2 node?
        at org.apache.cassandra.locator.Ec2Snitch.awsApiCall(Ec2Snitch.java:79) ~[apache-cassandra-2.2.19.jar:2.2.19]
        at org.apache.cassandra.locator.Ec2Snitch.<init>(Ec2Snitch.java:55) ~[apache-cassandra-2.2.19.jar:2.2.19]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_282]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_282]
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_282]
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_282]
        at java.lang.Class.newInstance(Class.java:442) ~[na:1.8.0_282]
        at org.apache.cassandra.utils.FBUtilities.construct(FBUtilities.java:536) ~[apache-cassandra-2.2.19.jar:2.2.19]

注意:当我将 snitch 更改为 SimpleSnitch 时,它实际上有效。

请帮忙!!

amazon-web-services amazon-ec2 cassandra terraform cassandra-2.2
2个回答
2
投票

回答我自己的问题

Ec2snitch 使用 IMDVs1 获取元数据 http://169.254.169.254/latest/meta-data/placement/availability-zone 以确定某些属性。

我通过 terraform 创建了 Ec2 实例,其中我的代码有

metadata_options {
  http_endpoint = "enabled"
    http_tokens = "enabled"
  }

上述代码强制仅使用 imdsv2,这导致了问题。 Ec2snitch 无法通过简单的curl 命令获取元数据。

解决方案:

metadata_options {
      http_endpoint = "enabled"
        http_tokens = "optional"
      }

如果您通过控制台进行操作,启动实例时,请确保元数据版本设置为V1和V2


0
投票

如果您使用

Ec2MultiRegionSnitch
遇到同样的错误,请确保您的实例附加了公共 IP 地址。

Cassandra 在实例化此告密者时使用 http://169.254.169.254/latest/meta-data/public-ipv4 进行查询,如果您的实例不使用公共 IP,则此端点将返回 404,并且启动会失败

这是显示该行为的构造函数源代码的链接:https://github.com/apache/cassandra/blob/48607b83952ab923c401fd7886d76a5a5a5b3c78/src/java/org/apache/cassandra/locator/Ec2MultiRegionSnitch.java#L46

© www.soinside.com 2019 - 2024. All rights reserved.