【问题标题】:Amazon Keyspaces "DefaultTokenFactoryRegistry and DefaultTopologyMonitor" causes High CPU and memory usageAmazon Keyspaces“DefaultTokenFactoryRegistry 和 DefaultTopologyMonitor”导致 CPU 和内存使用率高
【发布时间】:2022-02-23 06:56:05
【问题描述】:

我们已将部分表从 AWS RDS 移至 AWS Keyspaces,以查看是否可以在 KeySpaces 上获得更好的性能。我们已经投入了大量工作来从 MySQL 迁移到 Keyspaces,并且我们一直在监控系统以避免爆炸性的不一致。在我们的监控期间,我们观察到以下导致 CPU 和内存使用率过高的警告。

- DefaultTokenFactoryRegistry - [s0] Unsupported partitioner 'com.amazonaws.cassandra.DefaultPartitioner, token map will be empty.

-DefaultTopologyMonitor - [s0] 控制节点 IPx/IPy:9142 在 system.peers 中有自己的条目:此条目将被忽略。这可能是由于配置错误造成的;请在集群中的所有节点上验证 cassandra.yaml 中的 rpc_address 配置(IPx 和 IPy 是 cassandra 节点 IP) - 控制节点 cassandra.{REGION}.amazonaws.com/{IP_1}:9142 在 system.peers 中有自己的条目:此条目将被忽略。这可能是由于配置错误造成的;请在集群中的所有节点上验证您在 cassandra.yaml 中的 rpc_address 配置。

即使这些警告在我们部署代码后和接下来的几个小时内不会立即出现,但它会在部署后 24-72 小时后出现。

到目前为止我们做了什么?

尽管可以通过将日志级别设置为错误来抑制警告,但驱动程序表示 cassandra.yml 中存在错误配置,我们无权编辑或查看。有没有办法避免这个警告或任何建议的解决方案来解决这个问题?

datastax-java-driver {
        basic {
            contact-points = ["cassandra.eu-west-1.amazonaws.com:9142"]
            load-balancing-policy {
                class = DefaultLoadBalancingPolicy
                local-datacenter = eu-west-1
            }
            request {
                timeout = 10 seconds
                default-idempotence = true
            }
        }

        advanced {
            auth-provider = {
                class = software.aws.mcs.auth.SigV4AuthProvider
                aws-region = eu-west-1
            }

            ssl-engine-factory {
                class = DefaultSslEngineFactory
                truststore-path = "./cassandra_truststore.jks"
                truststore-password = "XXX"
                keystore-path = "./cassandra_truststore.jks"
                keystore-password = "XXX"
            }

            retry-policy {
                class =  com.ABC.DEF.config.cassandra.AmazonKeyspacesRetryPolicy
                max-attempts = 5
            }

            connection {
                pool {
                    local {
                        size = 9
                    }
                    remote {
                        size = 1
                    }
                }

                init-query-timeout = 5 seconds

                max-requests-per-connection = 1024
            }

            reconnect-on-init = true

            heartbeat {
                timeout = 1 seconds
            }

            metadata {
                schema {
                    enabled = false
                }
                token-map {
                    enabled = false
                }
            }

            control-connection {
                timeout = 1 seconds
            }

        }
    }


----------


【问题讨论】:

    标签: amazon-web-services cassandra amazon-keyspaces


    【解决方案1】:

    这确实是一个非标准的、不受支持的分区器:com.amazonaws.cassandra.DefaultPartitioner。除非您编写自己的 TopologyMonitorTokenFactory,否则令牌感知路由将不适用于 AWS Keyspaces。

    我建议您完全禁用令牌感知路由,有关说明,请参阅here

    【讨论】:

    • 我已按照您的建议完全禁用了令牌感知路由,但它并没有解决我的问题。我已经更新了我的问题以添加我的 cassandra 驱动程序配置文件。然后我启用了令牌感知路由,使用下面的 datastax 指南实现了自定义 TopologyMonitor 和 TokenFactory。 docs.datastax.com/en/developer/java-driver/4.4/manual/developer/… 但是我没有任何进展,有没有java实现可以分享一下?
    • 抱歉,我对 AWS 密钥空间一无所知,我想我无法为您提供更多帮助。您应该向 AWS 支持团队寻求帮助。
    【解决方案2】:

    警告只是让您知道该 ip 将被过滤掉。请参阅代码行here on github。在 cassandra 中,system.peers 表包含一个节点列表减去控制节点的 ip。在 Amazon Keyspaces 中,system.peers 表还包含控制节点 ip。当驱动程序启动连接或更新驱动程序元数据时,您将看到此警告。使用键空间时,会出现此警告,不会影响性能。有一个补丁可以解决这个警告,但我没有 ETA 可以分享。

    我建议升级java驱动看看你的问题是否解决了。您还可以下载最新的 sigv4 插件,它引入了 java 驱动程序 4.13 作为依赖项。

    <dependency>
        <groupId>software.aws.mcs</groupId>
        <artifactId>aws-sigv4-auth-cassandra-java-driver-plugin</artifactId>
        <version>4.0.5</version>
    </dependency>
    

    这是一个示例驱动程序配置供参考。

    datastax-java-driver {
            basic.contact-points = ["cassandra.us-east-2.amazonaws.com:9142"]
            basic.load-balancing-policy {
                class = DefaultLoadBalancingPolicy
                local-datacenter = us-east-2
            }
            advanced {
                auth-provider = {
                    class = software.aws.mcs.auth.SigV4AuthProvider
                    aws-region = us-east-2
                }
                ssl-engine-factory {
                    class = DefaultSslEngineFactory
                    truststore-path = "./src/main/resources/cassandra_truststore.jks"
                    truststore-password = "my_password"
                    hostname-validation = false
                }
            }
            advanced.metadata.token-map.enabled = false
            advanced.metadata.schema.enabled = false
            advanced.reconnect-on-init = true
            
            advanced.connection {
               pool {
                  local.size = 3
                  remote.size = 1
               }
             }
        }
    
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-07
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多