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