Cassandra:在集群中的新表中插入时的rpc_timeout

时间:2014-05-07 09:12:45

标签: cassandra cql3 cqlsh

我正在使用Cassandra 2.0.3并通过加载文件(源命令)删除并通过cqlsh重新创建一个简单的表。在同一个文件中,我在新创建的表中插入了一些行。

大约每3-4次尝试一次,我在某些插入上得到了rpc_timeout。 在这种情况下,我总是在集群的一个节点上有这个例外:

 WARN [Thread-63] 2014-05-07 10:52:39,658 IncomingTcpConnection.java (line 83) UnknownColumnFamilyException reading from socket; closing
org.apache.cassandra.db.UnknownColumnFamilyException: Couldn't find cfId=15a8520e-bb08-3a79-82a0-f735287315bf
    at org.apache.cassandra.db.ColumnFamilySerializer.deserializeCfId(ColumnFamilySerializer.java:178)
    at org.apache.cassandra.db.ColumnFamilySerializer.deserialize(ColumnFamilySerializer.java:103)
    at org.apache.cassandra.db.RowMutation$RowMutationSerializer.deserializeOneCf(RowMutation.java:304)
    at org.apache.cassandra.db.RowMutation$RowMutationSerializer.deserialize(RowMutation.java:284)
    at org.apache.cassandra.db.RowMutation$RowMutationSerializer.deserialize(RowMutation.java:312)
    at org.apache.cassandra.db.RowMutation$RowMutationSerializer.deserialize(RowMutation.java:254)
    at org.apache.cassandra.net.MessageIn.read(MessageIn.java:99)
    at org.apache.cassandra.net.IncomingTcpConnection.receiveMessage(IncomingTcpConnection.java:153)
    at org.apache.cassandra.net.IncomingTcpConnection.handleModernVersion(IncomingTcpConnection.java:130)
    at org.apache.cassandra.net.IncomingTcpConnection.run(IncomingTcpConnection.java:74)

即使我在cqlsh中直接执行INSERT,它也会因rpc_timeout而失败。通常在大约一分钟后,插入成功。

我的节点是时间同步的(我在我的电脑上使用了3个虚拟机),当然,所有虚拟机都在本地运行,因此局域网速度非常快。

我通过向在单个节点上运行的现有Cassandra添加2个节点来创建群集。 我的密钥空间没有使用复制:

CREATE KEYSPACE eras
  WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };

以下是我用来重现问题的文件的内容:

DROP TABLE IF EXISTS erasconfig;

CREATE TABLE erasconfig (
  name text,
  category text,
  description text,
  ismodifiablebyuser int,
  value text,
  format text,
  PRIMARY KEY (name, category)
);

INSERT INTO ErasConfig (isModifiableByUser, format, name, value, category, description) VALUES (1, '', 'RECORD_IN_BASE', 'garbage', 'Path', 'Absolute path used for RECORD INPUT files');

此INSERT进入群集的第3个节点,该节点有时在创建表时失败,但上面有例外。

1 个答案:

答案 0 :(得分:1)

问题是模式复制与创建完成是异步的。因此,在多节点群集中,您需要在尝试使用它们之前验证架构更改是否已传播到所有节点。 nodetool describecluster可用于检查模式是否一致。从客户端,您可以检查system.peers表以验证所有架构版本是否已更新。