【问题标题】:Cassandra multiple writes distributionCassandra 多写分布
【发布时间】:2013-12-31 06:02:45
【问题描述】:

我安装了一个 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 写入请求/所有节点图) - 我看不出原因:据我所知,密钥是足够随机的...

有人可以指点我吗?

【问题讨论】:

    标签: cassandra cassandra-2.0


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

    【讨论】:

    • 马丁,关于你答案的第二部分,我知道它应该正确传播。从 opscenter 环视图中我知道令牌很好,但仍然只有一个节点在执行写入操作。
    猜你喜欢
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 2016-05-31
    • 2013-08-05
    相关资源
    最近更新 更多