我安装了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这些 - 我是用户数组中用户的索引。 我不想使用批量插入,而是模拟插入多个记录的压力。 这是我的代码:
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...
有人能指点我吗?
答案 0 :(得分:1)
在计算记录数量时(使用cqlsh)我永远不会超过4k(超过10k)
您正在使用未绑定的线程池,这意味着所有写入几乎都在同一时间执行。可能你达到了性能极限,Cassandra用写入超时来回答。尝试减少并发写入次数并检查执行结果。 E.g。
final ThreadPoolExecutor tpe = (ThreadPoolExecutor) Executors.newFixedThreadPool(20);
...
ResultSetFuture future = session.executeAsync(bs);
try {
future.getUninterruptibly();
} catch (Exception e) {
e.printStackTrace();
}
只有一台服务器在进行写操作(使用opscenter write-request / all-nodes图) - 我看不出原因:据我所知,密钥是随机的......
主要定义为PRIMARY KEY (phone, id)
。这意味着phone
是分区键,而id
只是群集键。但如果手机值确实是不同的MD5摘要,则应该分布在所有节点上。