0

我正在使用 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 而失败。通常大约一分钟后,插入成功。

我的节点是时间同步的(我在我的 PC 上使用了 3 个虚拟机),并且 LAN 在所有本地运行的虚拟机上当然都非常快。

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

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 进入集群的第三个节点,这是在创建表期间有时会失败的节点,但上述例外。

4

1 回答 1

1

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

于 2014-05-13T05:16:46.463 回答