0

我安装了一个 3 节点 Cassandra (2.0.3) 集群,这是我的表:

CREATE TABLE user (
    id text,
    phone text,
    name text,
    email text,
    PRIMARY KEY (phone, id)
);

我使用 datastax java 驱动程序

这是我的用户对象创建:

User user = new User();
user.setId(UUIDs.timeBased().toString());
user.setEmail(null);
user.setName("test-user");
user.setPhone(Credential.MD5.digest("user-" + i));

我创建了其中的 10k - i 是用户数组中用户的索引。我不想使用批量插入,而是模拟插入多条记录的压力。这是我的代码:

Cluster cluster = Cluster.builder()
            .addContactPoints(CASSANDRA_CLUSTER_ADDRESSES)
            .build();
final Session session = cluster.connect(keyspaceName);
final ThreadPoolExecutor tpe = (ThreadPoolExecutor) Executors.newCachedThreadPool();
for (final User user : users) {
    tpe.execute(new Runnable() {
        @Override
        public void run() {
            PreparedStatement ps = 
                session.prepare("INSERT INTO user (id, phone, name, email) VALUES (?, ?, ?, ?)");
            BoundStatement bs = new BoundStatement(ps);
            bs.bind(
                    user.getId(),
                    user.getPhone(),
                    user.getName(),
                    user.getEmail(),
            );

            session.executeAsync(bs);
        }
    });
}

tpe.shutdown();
tpe.awaitTermination...
  1. 计算记录数时(使用 cqlsh)我永远不会超过 4k(10k 中)
  2. 只有一个服务器正在执行写入(使用 opscenter 写入请求/所有节点图) - 我看不出原因:据我所知,密钥足够随机......

有人可以指出我的任何地方吗?

4

1 回答 1

1

计算记录数时(使用 cqlsh)我永远不会超过 4k(10k 中)

您正在使用未绑定的线程池,这意味着所有写入几乎同时执行。可能您达到了性能限制,Cassandra 以写入超时回答。尝试减少并发写入的数量并检查执行结果。例如

final ThreadPoolExecutor tpe = (ThreadPoolExecutor) Executors.newFixedThreadPool(20);    
...
ResultSetFuture future = session.executeAsync(bs);
try {
    future.getUninterruptibly();
} catch (Exception e) {
    e.printStackTrace();
}

只有一个服务器正在执行写入(使用 opscenter 写入请求/所有节点图) - 我看不出原因:据我所知,密钥足够随机......

初级定义为PRIMARY KEY (phone, id)。这意味着phone是分区键,并且id只是集群键。但是如果电话值真的是不同的 MD5 摘要,这应该分布在所有节点上。

于 2013-12-30T22:02:45.940 回答