这一类限制是在当前的体系架构中无法改变的。每一个key对应的value不能超过磁盘本身的容量限制。这是因为Cassandra是将每一个key对应的value存储在本地磁盘上面的所以当某一个key对应的vaule的大小超过了本地磁盘的容量上限那么当Cassandra记录commitlog的时候就会失败写入到SSTable中同样会失败。这一点与Hadoop中的DFS不同DFS是将本机分块存储的所以无所谓文件的最大上限。Cassandra当前的版本限制这一类限制是在可以通过修改代码和版本升级改变的。key的长度大小限制在65535之内这个限制是由于Cassandra内部在将key写入到磁盘的时候采用的是java.io.DataOutputStream.writeUTF(String, DataOutput)这个方法内部对key的大小有一个65535的限制。在Cassandra中所有的添加和修改操作会经过一个org.apache.cassandra.thrift.ThriftValidation.validateKey(String)进行判断如果key的长度超过65535将抛出异常。不过这个方法也不能保证不会出现问题因为Cassandra最终写入磁盘时候的key是一个被包装后的key会添加token的信息所以即使key本身的长度没有超过65535被包装后的key的长度也有可能超过65535。不过这个不是一个大问题即使是也可以容易修改掉:)执行SSTable压缩操作的时消耗大量内存在Cassandra执行将多个SSTable合并为一个SSTable时候会将需要合并的key对应的所有value合并到。如果某一个key对应的value非常大那么就需要大量的内存来保持value。同时在写入的时候我们需要记录value的大小。如果value的长度超过了Integer的限制也会出现问题。我们在Cassandra的配置文件storage-conf.xml中可以看到这么一个配置选项RowWarningThresholdInMB它的作用就是设置一个阀值当压缩时某一个key对应的value大小超过这个阀值的时候在日志中记录一条WARN信息。这个问题将会在0.7的版本中修复。SupperColumn下的Column无索引现在的SSTable格式由包括3种文件组成dataindex和filter。其中filter文件用于判断需要寻找的key是否在data中index文件用于快速定位每一个key在data文件中的位置data文件中不仅保持了key和该key对应的value这些value就是一系列Column同时还有对应value的filter和index。同理data文件中的filter用于判断某一个Column是否存在根据Column的Nameindex用于快速定位这个key下面的这个Column在文件中的位置。但是这里存在一个问题data文件中的index只有一级索引即如果都是Column那么可以很快定位到所有的Column的位置。但如果是SupperColumn那么只能定位到某一个SupperColumn的位置而无法定位到SupperColumn下面的某一个Column的位置。这种SSTable的设计就造成了一个很严重的问题如果我们读取某一个key下的SupperColumn下的某一个Column的数据那么Cassandra会将该SupperColumn下的所有数据都读取出来然后找到我们需要的Column数据。这也就造成了如果某一个SupperColumn数据量非常大那么读取的时间也会非常长的现象。要解决这个问题需要一种新的SSTable的格式。这个问题暂时还没有指定修复的版本。Client端一次性从Cassandra中无法获取大量的数据由于Cassandra是使用Thrift提供外部接口所以Client端和Cassandra交互的时候所有的数据传输都要先放到机器的内存中再进行传输。假设我们使用multiget接口关于Cassandra的编程接口可以参考谈谈Cassandra的客户端获取一些列key的值并且这些key的值都比较大超过了内存的限制那么这种交互将永远不会成功。所以我们应该做的就是避免出现这个大量的请求操作。如果交互的数据量非常大可以考虑压缩或者是拆分的策略。这个问题暂时还没有指定修复的版本。Client端如果发送不符合要求的数据会导致Cassandra运行出错我们使用Cassandra的时候都是使用Cassandra提供的一系列Thrift API来调用的包括JavaPHPPython等等。但是我们要是通过这些Thrift发送一些不符合要求的数据就会导致Cassandra运行出错。这个问题是由于Thrift本身的原因造成的。但是这个问题不是一个大问题只要我们不要暴露Cassandra的Thrift端口给外部直接使用即可。这个问题将会在0.7的版本中修复。