Cassandra多次写入分发

时间:2013-12-26 16:25:37

标签: cassandra cassandra-2.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这些 - 我是用户数组中用户的索引。 我不想使用批量插入,而是模拟插入多个记录的压力。 这是我的代码:

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 write-request / all-nodes图) - 我无法看到原因:据我所知,密钥是随机的......
  3. 有人能指点我吗?

1 个答案:

答案 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摘要,则应该分布在所有节点上。