接上一篇关于Cassandra一致性的讨论,见:
通过对Cassandra源码添加若干日志,今天应该是找到了问题的根本原因。共三台机器10.130.24.90,10.130.24.91,10.130.24.143
问题原因分析:
日志按照请求的先后顺序截取。表格的主键为(empID, deptID)
日志1:
请求被发送到91机器,要求插入first_name为eran10003的数据,可以看到时间戳为1392953766795000,取到了first_name为eran10003
DEBUG [Thrift:22] 2014-02-21 11:36:06,795 CassandraServer.java (line 1916) execute_cql3_query:[INSERT INTO employees (empID, deptID, first_name, last_name) VALUES (111, 222, 'eran10003', 'landau');] with clever:QUORUM TRACE [Thrift:22] 2014-02-21 11:36:06,795 QueryProcessor.java (line 97) Process org.apache.cassandra.cql3.statements.UpdateStatement@1342464f @CL.QUORUM INFO [Thrift:22] 2014-02-21 11:36:06,795 StorageProxy.java (line 801) destination:/10.130.24.90 INFO [Thrift:22] 2014-02-21 11:36:06,795 StorageProxy.java (line 822) insert to different server INFO [Thrift:22] 2014-02-21 11:36:06,796 StorageProxy.java (line 831) direct writes to local DC TRACE [Thrift:22] 2014-02-21 11:36:06,796 MessagingService.java (line 615) /10.130.24.91 sending MUTATION to 29474@/10.130.24.90 INFO [Thrift:22] 2014-02-21 11:36:06,796 StorageProxy.java (line 801) destination:/10.130.24.143 INFO [Thrift:22] 2014-02-21 11:36:06,796 StorageProxy.java (line 822) insert to different server INFO [Thrift:22] 2014-02-21 11:36:06,796 StorageProxy.java (line 831) direct writes to local DC TRACE [Thrift:22] 2014-02-21 11:36:06,796 MessagingService.java (line 615) /10.130.24.91 sending MUTATION to 29475@/10.130.24.143 INFO [Thrift:22] 2014-02-21 11:36:06,796 StorageProxy.java (line 801) destination:/10.130.24.91 INFO [Thrift:22] 2014-02-21 11:36:06,797 StorageProxy.java (line 817) insertLocal DEBUG [MutationStage:112] 2014-02-21 11:36:06,797 Keyspace.java (line 351) RowMutation:RowMutation(keyspace='contactks', key='0000006f', modifications=[java.nio.HeapByteBuffer[pos=0 lim=10 cap=12]: timestamp:1392953766795000,java.nio.HeapByteBuffer[pos=0 lim=20 cap=38]:eran10003 timestamp:1392953766795000,java.nio.HeapByteBuffer[pos=0 lim=19 cap=36]:landau timestamp:1392953766795000,]) DEBUG [MutationStage:112] 2014-02-21 11:36:06,797 Keyspace.java (line 359) Appending to commitlog DEBUG [MutationStage:112] 2014-02-21 11:36:06,797 Keyspace.java (line 375) Adding to employees memtable DEBUG [Thread-3] 2014-02-21 11:36:06,798 MessagingService.java (line 697) Message received from /10.130.24.90, id :29474 DEBUG [RequestResponseStage:312] 2014-02-21 11:36:06,798 MessageDeliveryTask.java (line 61) doVerb:REQUEST_RESPONSE DEBUG [Thrift:22] 2014-02-21 11:36:06,798 Tracing.java (line 157) request complete
日志2:
请求被发送到90机器,要求插入first_name为eran10004的数据,可以看到时间戳为1392953753016000 ,取到了first_name仍然为eran10003
DEBUG [Thrift:16] 2014-02-21 11:35:53,016 org.apache.cassandra.thrift.CassandraServer (line 1916) execute_cql3_query:[INSERT INTO employees (empID, deptID, first_name, last_name) VALUES (111, 222, 'eran10004', 'landau');] with clever:QUORUM TRACE [Thrift:16] 2014-02-21 11:35:53,016 org.apache.cassandra.cql3.QueryProcessor (line 97) Process org.apache.cassandra.cql3.statements.UpdateStatement@6372d3ed @CL.QUORUM INFO [Thrift:16] 2014-02-21 11:35:53,016 org.apache.cassandra.service.StorageProxy (line 801) destination:/10.130.24.90 INFO [Thrift:16] 2014-02-21 11:35:53,016 org.apache.cassandra.service.StorageProxy (line 817) insertLocal INFO [Thrift:16] 2014-02-21 11:35:53,017 org.apache.cassandra.service.StorageProxy (line 801) destination:/10.130.24.143 INFO [Thrift:16] 2014-02-21 11:35:53,017 org.apache.cassandra.service.StorageProxy (line 822) insert to different server INFO [Thrift:16] 2014-02-21 11:35:53,017 org.apache.cassandra.service.StorageProxy (line 831) direct writes to local DC TRACE [Thrift:16] 2014-02-21 11:35:53,017 org.apache.cassandra.net.MessagingService (line 615) /10.130.24.90 sending MUTATION to 28704@/10.130.24.143 INFO [Thrift:16] 2014-02-21 11:35:53,017 org.apache.cassandra.service.StorageProxy (line 801) destination:/10.130.24.91 INFO [Thrift:16] 2014-02-21 11:35:53,018 org.apache.cassandra.service.StorageProxy (line 822) insert to different server INFO [Thrift:16] 2014-02-21 11:35:53,018 org.apache.cassandra.service.StorageProxy (line 831) direct writes to local DC TRACE [Thrift:16] 2014-02-21 11:35:53,018 org.apache.cassandra.net.MessagingService (line 615) /10.130.24.90 sending MUTATION to 28705@/10.130.24.91 DEBUG [MutationStage:117] 2014-02-21 11:35:53,017 org.apache.cassandra.db.Keyspace (line 351) RowMutation:RowMutation(keyspace='contactks', key='0000006f', modifications=[java.nio.HeapByteBuffer[pos=0 lim=10 cap=12]: timestamp:1392953753016000,java.nio.HeapByteBuffer[pos=0 lim=20 cap=38]:eran10004 timestamp:1392953753016000,java.nio.HeapByteBuffer[pos=0 lim=19 cap=36]:landau timestamp:1392953753016000,]) DEBUG [MutationStage:117] 2014-02-21 11:35:53,018 org.apache.cassandra.db.Keyspace (line 359) Appending to commitlog DEBUG [MutationStage:117] 2014-02-21 11:35:53,019 org.apache.cassandra.db.Keyspace (line 375) Adding to employees memtable DEBUG [Thread-8] 2014-02-21 11:35:53,020 org.apache.cassandra.net.MessagingService (line 697) Message received from /10.130.24.91, id :28705 DEBUG [Thread-10] 2014-02-21 11:35:53,020 org.apache.cassandra.net.MessagingService (line 697) Message received from /10.130.24.143, id :28704 DEBUG [RequestResponseStage:82] 2014-02-21 11:35:53,021 org.apache.cassandra.net.MessageDeliveryTask (line 61) doVerb:REQUEST_RESPONSE DEBUG [RequestResponseStage:83] 2014-02-21 11:35:53,021 org.apache.cassandra.net.MessageDeliveryTask (line 61) doVerb:REQUEST_RESPONSE DEBUG [Thrift:16] 2014-02-21 11:35:53,021 org.apache.cassandra.tracing.Tracing (line 157) request complete
观察上述结果,发现新插入的数据:eran10004,没有成功获取,但是请求确实已经发送到了服务器,并且已经被执行。究竟是什么原因导致的呢?熟悉Cassandra数据存储特点的一定都知道,Cassandra的每一列都是分版本存储的,即插入一列新数据,Cassandra都要赋予其一个时间戳作为版本号,如果主键一致,那原来的数据并不删除,而是直接把新数据覆盖在旧数据上,并按时间戳排序;每次查询都会获取时间戳最大的那一个。
结合日志发现eran10003的时间戳为1392953766795000,大于eran10004的时间戳:1392953753016000 。于是查询的时候,Cassandra就认为eran10003是最新的,而eran10004也就获取不到了。
时间戳是服务器本地时间,91的时间大于90的时间所以出现了问题。
解决方案:
1、使用Ntp同步91和90及143的时间。
2、时间戳有客户端控制而不在服务端,如果是多客户端,客户端之间还要同步时间。
当然还需要使用Consistency Level: QUORUM。
相关推荐
【Cassandra一致性详解】 在2019云栖大会上,郭泽晖(索月)对Cassandra的一致性进行了深入的解析。Cassandra是一个分布式NoSQL数据库系统,它遵循CAP定理,即在分布式系统中,无法同时保证一致性(Consistency)、...
此外,Cassandra还支持时间序列数据的高效存储和查询,使其成为处理物联网、日志分析等大数据量实时监控场景的理想选择。 ### 关键知识点三:Cassandra的读写操作 Cassandra的读写操作遵循一致性模型,允许用户在...
Cassandra 的数据分布和一致性策略基于其分区策略。每个键(Key)都会被哈希计算出一个分布式散列值,这个值决定了数据将在哪个节点上存储,并且可以通过一致性哈希实现数据的均匀分布。这种设计使得 Cassandra 能够...
- Read/Write Consistency:用户可以选择不同的一致性级别,平衡读写速度和数据一致性。 6. **监控与故障恢复** - JMX接口:用于系统监控和管理,例如查看节点状态、性能指标。 - 系统日志:记录Cassandra运行中...
Cassandra 使用一致性哈希和分布式数据存储,可以实现数据的全局一致性,并能应对节点故障。 ### YCSB 和 Cassandra 结合使用 1. **安装与配置** - 下载 YCSB 包:YCSB 提供了针对 Cassandra 的绑定模块,您已...
2. **一致性与可用性**:Cassandra 使用了最终一致性的模型,允许用户在一致性和可用性之间进行权衡。在3.11.13版本中,Cassandra继续优化了这一特性,确保在大规模分布式环境下的数据一致性和服务稳定性。 3. **...
### Cassandra数据库:复制与一致性详解 #### 一、概述 Cassandra是一款分布式NoSQL数据库系统,以其高可扩展性和容错性而闻名于业界。它最初由Facebook开发,并于2008年开源,之后成为了Apache软件基金会的一个...
数据一致性方面,Cassandra支持多种一致性级别,允许用户在性能和一致性间做出平衡。它还提供了类似RDBMS事务的轻量级事务支持,并允许实现线性一致性。 在集群部署规划方面,文档介绍了如何在基于RHEL和Debian的...
10. **数据分区与一致性**:Cassandra提供了多种一致性级别,如QUORUM、LOCAL_QUORUM等,以平衡读写性能和数据一致性。数据分区是通过分区键实现的,决定了数据如何在集群中分布。 11. **运维与监控**:Cassandra...
- **日志分析**:处理大量实时日志数据。 - **推荐系统**:存储用户行为数据,快速计算推荐结果。 - **物联网(IoT)**:处理设备产生的大量实时数据。 7. **最佳实践** - **节点规划**:合理分配节点,避免热点...
2. 数据预处理:收集到的日志数据往往包含噪声和不一致性,因此需要进行清洗和转换。Spark的DataFrame和Dataset API非常适合进行数据预处理,如去除重复项、填充缺失值、转换数据格式等。 3. 日志存储:系统可能...
Cassandra作为一个NoSQL数据库,它适用于需要在大量节点之间进行数据复制和分布的应用场景,如互联网服务、日志分析和物联网(IoT)数据存储。 Cassandra的核心特性包括: 1. **分布式架构**:Cassandra采用分布式...
**Cassandra 数据模型详解** Cassandra 是一种分布式非关系型数据库系统,由Facebook开发并开源,主要用于...在实际应用中,根据业务场景选择合适的分区策略、复制策略以及一致性级别,是充分利用Cassandra的关键。
- **最终一致性**:为了提高可用性,Cassandra牺牲了一定程度的一致性,通过事件最终一致性的模型,允许系统在短暂时间内处于不一致状态,但在一段时间后自动恢复一致性。 - **增量可扩展性**:Cassandra支持水平...
由于分布式系统可能出现数据不一致,Cassandra提供了反熵(Anti-Entropy)机制,定期进行数据修复以保持数据一致性。数据修复可以手动触发,也可以设置为定时任务。 ### 8. 灾备与恢复 为了应对灾难情况,...
2. **一致性与可用性**:Cassandra 支持多副本策略,可以配置不同的一致性级别(如 QUORUM、ONE、ALL 等),以平衡读写速度和数据一致性。这使得开发者可以根据业务需求选择最适合的一致性策略。 3. **容错性**:当...
在实际应用中,Dynamo 常用于亚马逊的各种内部服务,如购物车、用户会话等场景,而Cassandra被广泛应用于需要高吞吐、低延迟和灵活查询需求的场景,如物联网设备数据存储、日志分析和实时推荐系统。 总结来说,...
2. **一致性与可用性**:Cassandra遵循CAP定理,允许用户在一致性、可用性和分区容错性之间进行权衡,以适应不同业务需求。 3. **分布式架构**:Cassandra的数据分布在多台服务器上,通过数据复制和分区策略实现高...
在进行配置时,需要设置各种参数,如内存分配、存储引擎、复制因子和一致性级别等。 优化Cassandra数据库是一个持续的过程,涉及到资源分配、数据建模和查询性能。资源优化包括监控和调整JVM堆大小、垃圾回收策略和...