我们已将部分表从 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 在系统中有一个条目。 peers:此条目将被忽略。这可能是由于配置错误造成的;请在集群中的所有节点上验证 cassandra.yaml 中的 rpc_address 配置。
尽管这些警告不会在我们部署代码后和接下来的几个小时后立即出现,但它会在部署后的 24-72 小时后出现。
到目前为止我们做了什么?
我们已经尝试了 AWS Keyspaces 开发人员指南中存在的所有连接方法:https ://docs.aws.amazon.com/keyspaces/latest/devguide/using_java_driver.html
我们发现 AWS 论坛中已经有一个公开讨论:https ://forums.aws.amazon.com/thread.jspa?messageID=945795
- 我们按照亚马逊人的说法配置了我们的客户端: https ://forums.aws.amazon.com/profile.jspa?userID= 512911
我们还在 aws-sigv4-auth-cassandra-java-driver-plugin 的 GitHub 上创建了一个问题。您可以通过以下链接查看详细信息https://github.com/aws/aws-sigv4-auth-cassandra-java-driver-plugin/issues/24
我们已经浏览了 DataStax java 驱动程序代码,看看有什么问题。当我们检查 DefaultTopologyMonitor 类时,我们看到有一条规则检查我们对 AWS Keyspaces -{IP_2}- 的访问点是否从接触点 [cassandra.{REGION}.amazonaws.com:9142] 解析为控制节点或不是。由于此 IP 地址 [{IP_2}] 存在于 system.peers 中,因此始终会触发控制连接,并且迭代和分配会消耗大量 CPU 并产生垃圾。据我们了解,联系点不应该在 system.peers 中列出。我们没有任何决策点来调整 system.peers 表或设置控制节点。这些都由 AWS 密钥空间管理。
尽管可以通过将日志级别设置为错误来抑制警告,但驱动程序表示 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
}
}
}
----------