在Cassandra的同一数据中心的不同节点之间遇到同步问题。使用NetworkTopology将密钥空间的复制因子设置为3,并且在DC中有3个节点。有效地确保每个节点都有数据的副本。当节点工具状态为run时,它显示DC中的所有三个节点拥有100%的数据。
然而,该键空间中的applied_migrations列族并不同步。这很奇怪,因为在键空间中只有一个列族受到影响。所有其他柱族都在这三个节点之间完全复制。测试是通过对键空间中每个列族的行数进行计数来完成的。
keyspace_name | durable_writes | strategy_class | strategy_options
--------------+----------------+------------------------------------------------------+----------------------------
core_service | True | org.apache.cassandra.locator.NetworkTopologyStrategy | {"DC_DATA_1":"3"}
keyspace: core_service
Datacenter: DC_DATA_1
=====================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN host_ip_address_1_DC_DATA_1 3.75 MB 256 100.0% 3851106b RAC1
UN host_ip_address_2_DC_DATA_1 3.72 MB 256 100.0% d1201142 RAC1
UN host_ip_address_3_DC_DATA_1 3.72 MB 256 100.0% 81625495 RAC1
Datacenter: DC_OPSCENTER_1
==========================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN host_ip_address_4_DC_OPSCENTER_1 631.31 MB 256 0.0% 39e4f8af RAC1查询:从core_service.applied_migrations中选择计数(*);
host_ip_address_1_DC_DATA_1 core_service applied_migrations
count
-------
1
(1 rows)
host_ip_address_2_DC_DATA_1 core_service applied_migrations
count
-------
2
(1 rows)
host_ip_address_3_DC_DATA_1 core_service applied_migrations
count
-------
2
(1 rows)
host_ip_address_4_DC_OPSCENTER_1 core_service applied_migrations
count
-------
2
(1 rows)收到类似的错误,如以下问题所述。由于并非所有数据行都可用,因此迁移脚本会失败,因为它正在尝试创建现有表:https://github.com/comeara/pillar/issues/25
发布于 2015-07-23 06:05:12
我需要很强的一致性
如果你想确保你的读取是一致的,你需要使用正确的一致性级别。
对于RF3,您可以选择以下选项:
Cassandra做了什么来提高一致性
Cassandra的反熵机制是:
Repair将确保您的节点保持一致。它为您提供了一致性基线,因此应将其作为维护操作的一部分来运行。至少比你的gc_grace_seconds运行修复的频率更高,以避免僵尸墓碑再次出现。DataStax OpsCenter提供了自动执行此任务的修复服务。
您可以手动运行:
在一个节点中修复nodetool或
nodetool修复每个节点中的-pr。-pr选项将确保您只修复节点的主要范围。
Read repair以概率方式发生(可在表def中配置)。当你读取行的时候,c*会注意到一些副本没有最新的数据并修复它。
当一个节点不能进行写操作时,提示由其他节点收集。
操纵c*模式
我注意到Pillar的全部要点是“将Cassandra模式作为代码自动管理”。这是一个危险的概念--,特别是当Pillar是一个分布式应用程序时(我不知道它是否是)。因为它可能会导致模式冲突,从而使集群处于奇怪的状态。
假设Pillar是 not 一个分布式/多线程系统,您可以确保在模式修改前后在Java驱动程序中进行模式更改之前和之后利用checkSchemaAgreement()不会破坏模式。
长期
Cassandra模式将更加健壮,并处理分布式更新。观看(并为CASSANDRA-9424投票)
https://stackoverflow.com/questions/31574328
复制相似问题