【问题标题】:Error instantiating snitch class 'org.apache.cassandra.locator.Ec2Snitch'实例化 snitch 类 'org.apache.cassandra.locator.Ec2Snitch' 时出错
【发布时间】:2021-08-24 20:58:29
【问题描述】:

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

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

这是我的 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


    【解决方案1】:

    回答我自己的问题

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-02
      • 2015-04-30
      • 2016-06-01
      • 1970-01-01
      • 2020-09-20
      • 2021-11-14
      • 2018-04-16
      • 1970-01-01
      相关资源
      最近更新 更多