2016-03-15 120 views
0

我们有一个包含7个节点的集群,我们使用datastax java驱动程序连接到集群。问题是,我不断得到NoHostAvailableException这样的:当使用cqlsh执行删除时,Cassandra NoHostAvailableException

造成的: com.datastax.driver.core.exceptions.NoHostAvailableException:所有 主机(S)试了查询失败(尝试:/172.31。 7.243:9042 (com.datastax.driver.core.exceptions.DriverException:尝试获取可用连接的 超时(您可能需要增加每个主机连接的驱动程序号 )),/172.31.7.245:9042 (com.datastax.driver.core.exceptions.DriverException:尝试获取可用连接的 超时(您可能需要增加 驱动程序的p号呃主机连接)),/172.31.7.246:9042 (com.datastax.driver.core.exceptions.DriverException:尝试获取可用连接的 超时(您可能需要增加每个主机连接的驱动器号码 )),/172.31.7.247:9042, /172.31.7.232:9042,/172.31.7.233:9042,/172.31.7.244:9042 [只有 显示前3个主机的错误,请使用getErrors()获取更多详细信息])

所有节点均达到:

UN 172.31.7.244 152.21 GB 256  14.5% 58abea69-e7ba-4e57-9609-24f3673a7e58 RAC1 
UN 172.31.7.245 168.4 GB 256  14.5% bc11b4f0-cf96-4ca5-9a3e-33cc2b92a752 RAC1 
UN 172.31.7.246 177.71 GB 256  13.7% 8dc7bb3d-38f7-49b9-b8db-a622cc80346c RAC1 
UN 172.31.7.247 158.57 GB 256  14.1% 94022081-a563-4042-81ab-75ffe4d13194 RAC1 
UN 172.31.7.243 176.83 GB 256  14.6% 0dda3410-db58-42f2-9351-068bdf68f530 RAC1 
UN 172.31.7.233 159 GB  256  13.6% 01e013fb-2f57-44fb-b3c5-fd89d705bfdd RAC1 
UN 172.31.7.232 166.05 GB 256  15.0% 4d009603-faa9-4add-b3a2-fe24ec16a7c1 RAC1 

,但他们两个都高CPU负载,especia lly 232,因为我在该节点中使用cqlsh进行大量删除。

我知道删除生成墓碑,但在集群中有7个节点,我认为所有主机都不可访问是正常的。

我们为java连接配置是:

com.datastax.driver.core.Cluster cluster = null; 
     //Get contact points 
     String[] contactPoints=this.environment.getRequiredProperty(CASSANDRA_CLUSTER_URL).split(","); 
     cluster = com.datastax.driver.core.Cluster.builder() 
      .addContactPoints(contactPoints)) 
      .withCredentials(this.environment.getRequiredProperty(CASSANDRA_CLUSTER_USERNAME), 
       this.environment.getRequiredProperty(CASSANDRA_CLUSTER_PASSWORD)) 
       .withQueryOptions(new QueryOptions() 
       .setConsistencyLevel(ConsistencyLevel.QUORUM)) 
       .withLoadBalancingPolicy(new TokenAwarePolicy(new RoundRobinPolicy())) 
       .withRetryPolicy(new LoggingRetryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE)) 
       .withPort(Integer.parseInt(this.environment.getRequiredProperty(CASSANDRA_CLUSTER_PORT))) 
       .build(); 

     Metadata metadata = cluster.getMetadata(); 
     for (Host host : metadata.getAllHosts()) { 
      LOG.info("Datacenter: "+host.getDatacenter()+"; Host: "+host.getAddress()+"; DC: "+host.getDatacenter()+"\n"); 
     } 

和接触点是:

172.31.7.244,172.31.7.243,172.31.7.245,172.31.7.246,172.31.7.247

任何人都知道我可以如何解决这个问题?或者至少有任何人有关于如何处理这种情况的暗示?

更新:如果我得到错误信息withe.getErrors()我得到:

/172.31.7.243:9042=com.datastax.driver.core.OperationTimedOutException:[/172.31.7.243:9042 ]操作超时, /172.31.7.244:9042=com.datastax.driver.core.OperationTimedOutException:[/172.31.7.244:9042]操作超时, /172.31.7.245:9042=com.datastax.driver.core .OperationTimedOutException:[/172.31.7.245:9042]操作超时, /172.31.7.246:9042=com.datastax.driver.core.OperationTimedOutException:[/172.31.7.246:9042]操作超时, /172.31.7.247 :9042 = com.datastax.driver.core.Operati onTimedOutException:[/172.31.7.247:9042]操作超时}

UPDATE:

  • 密钥空间的复制因子为3。
  • 对于使用与CQL查询不同的文件中运行它们的删除林:

    cqlsh ip_node_1 -f脚本1.duplicates cqlsh ip_node_1 -f脚本2.duplicates cqlsh ip_node_1 -f脚本-3。重复 ...

  • 我没有指定任何一致性级别,所以使用默认的一个是一个。

  • 先前的每个文件包含删除这样的:

DELETE FROM keyspace_name.search WHERE idline1 = 837和idline2 = 841和PARTID = 8558和id = 18c04c20-8a3a-11e5-9e20- 0025905a2ab2;

  • 和列家族是:

CREATE TABLE搜索( idline1 BIGINT, idline2 BIGINT, PARTID INT, ID UUID, 场3 INT, 字段4 INT, 字段5 INT, field6 int, field7 int, field8 int, field9 double, field10 bigint, field11 bigint, field12 BIGINT, field13布尔, field14布尔, field15 INT, field16 BIGINT, field17 INT, field18 INT, field19 INT, field20 INT, field21 UUID, field22布尔, PRIMARY KEY((idline1 ,idline2,PARTID),ID) )WITH bloom_filter_fp_chance = 0.010000 AND 缓存= 'KEYS_ONLY' AND 评论= AND dclocal_read_repair_chance = 0.000000 AND gc_grace_seconds '与线之间的SNP表'= 0 AND index_inter VAL = 128和 read_repair_chance = 0.100000 AND replicate_on_write = '真' AND populate_io_cache_on_flush = '假' AND default_time_to_live = 0 AND speculative_retry = '99 .0PERCENTILE 'AND memtable_flush_period_in_ms = 0 AND 压实= { '类':' SizeTieredCompactionStrategy'} AND compression = {'sstable_compression':'LZ4Compressor'};

CREATE INDEX search_partid ON search(partid);

CREATE INDEX search_field8 ON search(field8);

UPDATE(18-03-2016):

后删除开始执行,我发现的一些节点的CPU增加了很多:

enter image description here

我检查该节点上的进程,只有cassandra正在运行,但消耗了大量的CPU。剩下的节点几乎不使用cpu。

UPDATE(04-04-2016):我不知道它是否相关。我检查了很多CPU(接近96%)和活动活动保持在1.6%的节点(仅使用10个已分配的3 GB)。

Checing线程池统计:

nodetool tpstats 池名称活跃待完成封锁了所有的时间封锁 ReadStage 0 0 20042001 0 0 RequestResponseStage 0 0 149365845 0 0 MutationStage 32 117720 181498576 0 0 ReadRepairStage 0 0 799373 0 0 ReplicateOnWriteStage 0 0 13624173 0 0 GossipStage 0 0 5580503 0 0 CacheCleanupExecutor 0 0 0 0 0 AntiEntropyStage 0 0 3 2173 0 0 MigrationStage 0 0 9 0 0 MemtablePostFlusher 0 0 45044 0 0 MemoryMeter 0 0 9553 0 0 FlushWriter 0 0 9425 0 18 ValidationExecutor 0 0 15980 0 0 MiscStage 0 0 0 0 0 PendingRangeCalculator 0 0 7 0 0 CompactionExecutor 0 0 1293147 0 0 commitlog_archiver 0 0 0 0 0 InternalResponseStage 0 0 0 0 0 HintedHandoff 0 0 273 0 0

消息类型掉落 RANGE_SLICE 0 READ_REPAIR 0 PAGED_RANGE 0 BINARY 0 阅读0 突变0 _TRACE 0 REQUEST_RESPONSE 0 COUNTER_MUTATION 0

我意识到悬而未决的突变级增长,但活跃值保持不变,可能是这个问题?

+0

您可以显示执行删除的密钥空间吗?你使用什么复制因子? – HashtagMarkus

+0

您的删除语句的示例可能也有帮助。 – phact

+0

删除操作的一致性级别是多少? – Rahul

回答

0

我看到您的数据模型有两个问题。

  • 您使用两个二级索引。一个在分区键的字段上。我不知道cassandra在这种情况下的表现如何。最糟糕的情况是,即使你使用完整的分区键(就像在你的例子中删除)cassandra在二级索引中进行查找。在这种情况下,这意味着完整的群集扫描,因为二级索引仅存储在每个分区中。由于只有部分分区键被索引,因此cassandra不知道索引信息位于哪个分区上。这种行为至少会解释超时。

  • 你说过,你删除了特定分区中的很多行。这也是一个问题。对于每个删除cassandra创建一个墓碑。越多的墓碑,读取越慢。这迟早会导致超时或异常(我相信cassandra会在达到1000个墓碑时发出警告,并在达到10000个墓碑时抛出异常)。顺便说一句。这些墓碑也是在二级索引中创建的。默认情况下,cassandra将在执行压缩时删除gc_grace_seconds(默认10天)后的墓碑。你可以改变每个表的属性。这些表格属性的更多信息可以在这里找到:Table Properties

我认为第一点可能是超时的原因。

+0

尊重索引,我会删除索引并检查是否有所改进。这是模型中的一个错误,我们首先考虑使用seconday索引,最后我们决定将它包含在分区键中。 尊重墓碑,我们已经将这些cf的gc_grace_seconds配置为零,以避免在删除期间生成墓碑。 – ftrujillo

+0

@ftrujillo只是一个旁注:墓碑仍然会生成,但它们会在每次压缩时删除。 – HashtagMarkus

+0

@hashtagmarkus感谢您的澄清。无论如何,我还试图在删除几个删除后正确执行压缩以删除墓碑,然后再继续删除结果。 – ftrujillo

相关问题