使用Java遗留驱动程序将Cassandra Cluster EC2实例替换为AWS密钥空间



我们正试图用AWS Keyspace替换现有的Cassandra EC2集群,并试图保留我们的旧代码库。这个想法是简单地退出devops业务,让我们的Cassandra由AWS管理(扩展、升级等(。查看他们提供的指南

https://docs.aws.amazon.com/keyspaces/latest/devguide/using_java_driver.html

他们使用的驱动程序与我们目前使用的不同(更新(:

我们目前的驱动程序:

<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>3.3.0</version>
</dependency>

他们的例子:

<dependency>
<groupId>com.datastax.oss</groupId>
<artifactId>java-driver-core</artifactId>
<version>4.4.0</version>
</dependency>

代码示例似乎与我们现有的代码完全不同。

问题-是否有人使用旧的驱动程序和旧代码成功迁移到AWS密钥空间?或者这需要升级吗?我的犹豫是,我们有很多代码,考虑到重构的成本,放弃Cassandra并重新开始其他东西(DynamoDB、MongoDB等(可能会更容易

AmazonKeyspaces可以非常简单地使用3.x驱动程序。虽然4.x驱动程序有一些好处,比如外部化配置,但不需要升级来移动AmazonKeyspaces。

您可以使用传统的用户名/名称密码验证或sigv4插件。

<!-- https://mvnrepository.com/artifact/software.aws.mcs/aws-sigv4-auth-cassandra-java-driver-plugin -->
<dependency>
<groupId>software.aws.mcs</groupId>
<artifactId>aws-sigv4-auth-cassandra-java-driver-plugin_3</artifactId>
<version>3.0.3</version>
</dependency>

连接java3.x并写入密钥空间的代码示例。

import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import software.aws.mcs.auth.SigV4AuthProvider;
import java.net.InetSocketAddress;
import java.util.Collections;
import java.util.List;

public class OrderFetcher {
public final static String TABLE_FORMAT = "%-25s%sn";
public final static int KEYSPACES_PORT = 9142;

public static Cluster connectToCluster(String region, List<InetSocketAddress> contactPoints) {
SigV4AuthProvider provider = new SigV4AuthProvider(region);
return Cluster.builder()
.addContactPointsWithPorts(contactPoints)
.withPort(KEYSPACES_PORT)
.withAuthProvider(provider)
.withSSL()
.build();
}

public static void main(String[] args) {
if (args.length != 3) {
System.err.println("Usage: OrderFetcher <region> <endpoint> <customer ID>");
System.exit(1);
}

String region = args[0];
List<InetSocketAddress> contactPoints = Collections.singletonList(new InetSocketAddress(args[1], KEYSPACES_PORT));

try (Cluster cluster = connectToCluster(region, contactPoints)) {
Session session = cluster.connect();

// Use a prepared query for quoting
PreparedStatement prepared = session.prepare("select * from acme.orders where customer_id = ?");

// We use execute to send a query to Cassandra. This returns a ResultSet, which is essentially a collection
// of Row objects.
ResultSet rs = session.execute(prepared.bind(args[2]));

// Print the header
System.out.printf(TABLE_FORMAT, "Date", "Order Id");

for (Row row : rs) {
System.out.printf(TABLE_FORMAT, row.getTimestamp("order_timestamp"), row.getUUID("order_id"));
}
}

}
}

以下是github 示例的链接

https://github.com/aws-samples/amazon-keyspaces-examples/blob/main/java/datastax-v3/connection-sigv4/src/main/java/software/aws/mcs/example/OrderFetcher.java

最新更新