接上一篇关于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。
相关推荐
具有可配置一致性的分布式数据存储:类似于Facebook的Cassanda数据库,这是分布式键值存储的自定义实现,遵循与Cassandra相同的原则,例如可配置一致性,提示切换,内存表,预写日志记录(用于故障恢复) ),并且是...
运行迁移时记录相关的异常消息版本0.2.0 重构schema_information查询以使用LWT和:quorum一致性级别实施简单的锁定系统以防止并发迁移用法CassandraSchema通过CassandraSchema.migration(version)方法使用DSL。...
[面试]Java核心知识点整理 1. 目录 2. JVM 3.JAVA集合 4.JAVA多线程并发 5.JAVA基础 6.Spring 原理 ...20.一致性算法 21.JAVA算法 22.数据结构 23.加密算法 24.分布式缓存 25. Hadoop 26. Spark 27. Storm
1.目录 2.JVM 3.JAVA集合 4.JAVA多线程并发 5.JAVA基础 6.Spring 原理 ...20.一致性算法 21.JAVA算法 22.数据结构 23.加密算法 24.分布式缓存 25.Hadoop 26.Spark 27.Storm 28.YARN 29.机器学习 30.云计算
1. 目录 2. JVM 3. JAVA 集合 4. JAVA 多线程并发 ...20. 一致性算法 21. JAVA 算法 22. 数据结构. 23. 加密算法. 24. 分布式缓存 25. HADOOP 26. SPARK 27. STORM 28. YARN 29. 机器学习 30. 云计算
jvm、java集合、java多线程并发、java基础、spring原理、微服务、netty与rpc、网络、日志、zookeeper、kafka、rabbitmq、hbase、mongodb、cassandra、设计模式、负载均衡、数据库、一致性算法、java算法、数据结构、...
1.目录 2.JVM 3.JAVA集合 4.JAVA多线程并发 5.JAVA基础 6.Spring原理 ...20.一致性算法 21.JAVA算法 22.数据结构 23.加密算法 24.分布式缓存 25.Hadoop 26.Spark 27.Storm 28.YARN 29.机器学习 30.云计算
包含了JVM、java集合、多线程并发、java基础、spring生态原理、微服务、设计模式、NETTY与RPC、网络、日志、ZOOKEEPER、KAFKA、RABBITMQ、HBASE、MONGDB、CASSANDRA、负载均衡、数据库、一致性算法、java算法、数据...
JAVA基础,Java集合,Java多线程并发开发,Spring原理、微服务架构、Netty与RPC、网络相关、日志相关、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB、Cassandra、设计模式、负载均衡相关、数据库理论、一致性算法...
挑战:数据一致性、事务管理、数据分片、数据复制等。 策略:使用分布式数据库解决方案,如Cassandra, CockroachDB等。 主从复制原理 概述:数据从一个MySQL服务器(主)复制到一个或多个MySQL服务器(从)。 工作...
2 最终一致性 2 变体 2 BASE 2 其他 2 I/O的五分钟法则 2 不要删除数据 2 RAM是硬盘,硬盘是磁带 2 Amdahl定律和Gustafson定律 2 万兆以太网 3 手段篇 3 一致性哈希 3 亚马逊的现状 3 算法的选择 3 Quorum NRW 3 ...
JAVA 基础 Spring 原理 ...一致性算法 JAVA 算法 Spark 集合 多线程并发 设计模式 负载均衡 数据结构 加密算法 分布式缓存 机器学习 云计算 JVM Hbase MongoDB Cassandra Hadoop Storm YARN
RabbitMQ、第十三章:Hbase、第十四章:MongoDB、第十五章:Cassandra、第十六章:设计模式、第十七章:负载均衡、第十八章:数据库、第十九章:一致性算法、第二十章:JAVA算法、第二十一章:数据结构、第二十二章...
包含JVM,java集合,多线程并发,java基础,spring原理,微服务,netter和rpc,计算机网络,日志,kafka,rabbitmq,hbase,mongodb,cassandra,设计模式,负载均衡,数据库,一致性算法,java算法,数据结构,加密...
美团java面试资料,目录:jvm,java集合,多线程并发,java基础,spring原理,微服务,netty和rpc,日志,zookeeper,kafka,rabbitmq,hbase,mongodb,cassandra,设计模式,负载均衡,数据库,一致性算法,java...
java面试宝典,包含了JVM、Java集合、Java多线程开发、Java基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB、Cassandra、设计模式、负载均衡、数据库、一致性算法、...
700道面试题:内容主要包括:JVM,集合,java反射,,多线程,JUC并发包,锁,CAS,AQS,,java基础,...负载均衡,数据库,CAP,一致性算法,java常用排序算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN
NoSQL数据库厂商10Gen(MongoDB的供应商)和DataStax(Cassandra的供应商)分别获得了3200万美元和1100万美元的融资;今年4月刚刚在纳斯达克进行IPO,融资2.3亿美元??这个名单可以列得很长。 很显然,在市场研究机构和...