引言
翻了一下以前写的Cassandra相关的教程, 发现最开始是2016年写的博客了.
也没想到坚持了这么久. 经过这么长一段时间使用Cassandra作为基础数据承载的基础架构, 有一些实战获得的经验.
总而言之, Cassandra并不适合类似金融方向这种需要高可靠性\事务性的业务. 但是对数据分析, 确实有一些功能比较好用.
省心的重复数据处理
在批量导入数据到 数据库 之中的时候, 难免有重复导入的时候. 如果使用 MySQL 等等, 就需要事先按照时间或者其他条件, 先把历史数据删除.
而Cassandra并不需要特殊处理. 在导入之前, 只要设计好相应的主键, 在导入的时候, Cassandra会自动覆盖相应的记录. 不会存在多一份数据的问题
Insert == Update
我们在插入数据的时候, 经常会这种需求: 如果存在, 就更新, 如果不存在就插入
如果使用MySQL, 就只能自己先select一把再相应的insert或者update.
当然, 也能通过一些Workaound来解决. 比如 on update XXX key
的方式.
但是在Cassandra之中, 虽然 insert
与 update
的CQL长得完全不一样(都是标准SQL), 可是作用是一样的. 无论原来是否存在相应的数据, 使用 insert
或者 update
最后结果都是一样的.
直接塞入 Json 字符串
【个人认为, 这个feature非常非常的重要!】
这个feature跟MySQL 5.7 或者 MongoDB 直接塞入json不太一样.
在MySQL或者MongoDB之中, Json数据是某一个单元格的数据是json类型. 而Cassandra可以把一行的数据以JSON的方式直接插入, 让Cassandra自己相应的塞入对应的列之中.
举个例子:
cqlsh> INSERT INTO cycling.cyclist_category JSON '{ "category" : "GC", "points" : 780, "id" : "829aa84a-4bba-411f-a4fb-38167a987cda", "lastname" : "SUTHERLAND" }';
结合上面提到的 insert == update
, 如果在更新的时候, 也可以转成 insert
的方式进行.
另外, 这种方式还有一个好处: 可以做成通用的插入函数. 这样无论是什么数据, 在塞入的时候变成相应的json字符串即可. 他们使用的SQL都是相同的. 不再需要单独编写SQL
代价就是: 批量插入速度可能会降低25%这样
text == varchar == string
我们在设计MySQL schema的时候, 还得考虑是 char
还是 varchar
还是 longtext
之类的.
在Cassandra, 这个设计就简化很多了: 只有 text
也不需要你考虑长度.
我想, 虽然性能没有那么机制, 但是Cassandra在设计之初, 就考虑的是拥有足够的硬盘. 另外在性能上面, 可能也没有那么机制, 不过好在用起来非常简单.
结语:
如果你要处理的数据量在10G~1000G这个级别, 我相信Cassandra会是比较好用的.
如果只是非常小的数据库, 纯文件 服务器 或者MySQL也够用了.
如果是超过1T的级别, 目前笔者还没有经验, 可以尝试Cassandra集群, 也可以尝试HBase / Hive等解决方案.