我正在使用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个节点,该节点有时在创建表时失败,但上面有例外。
答案 0 :(得分:1)
问题是模式复制与创建完成是异步的。因此,在多节点群集中,您需要在尝试使用它们之前验证架构更改是否已传播到所有节点。 nodetool describecluster
可用于检查模式是否一致。从客户端,您可以检查system.peers表以验证所有架构版本是否已更新。