正确建模

开发人员在构建Cassandra数据库时犯的另一个主要错误是分区键的选择不佳。
cassandra是分布式的。这意味着您需要有一种方法来跨节点分布数据。Cassandra通过散列每个表的主键(称为分区键)的一部分并将散列值token分配给集群中的特定节点来完成此操作。选择分区键时,请务必考虑以下规则:

  • 应该有足够的分区键值,以便在群集中的所有节点之间均匀地分布数据。
  • 最好单个分区涵盖一次读所想拿到的数据
  • 不要让分区太大。Cassandra可以处理大于100MB的大分区,但效率不高。此外,如果您划分的分区很大,则说明您的数据分发不太可能是均匀的。
  • 理想情况下,所有分区的大小大致相同。
    典型的真实世界分区键是用户ID,设备ID,帐号等。为了管理分区大小,通常将诸如年,月或年的时间修饰符添加到分区键。

这点在所有分布式数据库都是一样的,不再赘述。

错误的功能

Cassandra目前有一堆实验级别的功能,可能这些功能不应该存在,容易对用户造成混淆,容易让人误以为能做到关系数据库做到的任何事情:

  • 二级索引:它们有自己的用途,不能滥用,不能替代表的访问
  • 计数器(counter):它们能正常工作,但它们开销非常大,不应经常使用。
  • 轻量级事务:并非事务,也完全不轻量级。
  • 批处理:一次向服务器发送一堆操作通常很好,节省了网络时间,对吧?那么在Cassandra时表现就不那么好了
  • 物化视图:它看起来很有意义。但目前仍是实验级别的,实现还不完备,如不能保证跟base表保持sync,如果有不一致,只能先删,再重建。
  • CQL:看起来像SQL让人们误以为它是SQL。
    使用上述任何功能,您希望它们在传统数据库中工作的方式肯定会导致严重的性能问题,并且在某些情况下会导致数据库损坏。

Cassandra的错误使用案例

如果您有一个数据库,您依赖以下任何一项内容 - Cassandra对您的需求都是不合适的,请不要使用Cassandra。

  • 表需要有多个访问路径。示例:许多二级索引。
  • 应用程序依赖于底层数据库自增主键功能。MySQL自增主键或Oracle序列。
  • cassandra不支持ACID,没有事务,CQL没有开始/提交事务语法,如果你确实需要事物,尝试其他数据库。
  • 聚合:Cassandra不支持聚合,如果你需要做很多聚合,尝试其他数据库。
  • Joins:Cassandra不支持Join,nosql数据库都是反数据库范式设计的。
  • 锁:Cassandra不支持锁定。这是跟底层实现有关,各node都是对等的,可并发写,不是强主模式。
  • 并发更新:大量的并发更新会带来数据的正确性问题,上层应用往往需要先读后更新。
    如果您需要上述的任何一个功能,cassandra支持的都不是很好,请考虑使用可能更符合您需求的其他数据库技术。

什么时候应该考虑使用Cassandra

每个数据库服务器都是为满足特定的设计目标而构建,这些设计目标定义了数据库适合和不适合的场景。
Cassandra的设计目标如下:

  • 分布式:在多个服务器节点上运行。
  • 线性扩展:通过添加节点实现水平扩容
  • 全球分布:群集可以在地理上分布。
  • 写优于读:写入比读取快一个数量级。
  • 民主对等架构:没有主/从。
  • 支持分区容忍度和可用性而不是一致性:最终一致(参见CAP定理:https://en.wikipedia.org/wiki/CAP_theorem。)
  • 通过主键支持快速目标读取:关注主键读取,其他路径次优。
  • 支持具有生命周期的数据:Cassandra数据库中的所有数据都具有已定义的生命周期,生命周期到期后自动删除数据。
    功能列表中没有关于ACID,关系型库中常见聚合等功能。此时您可能会想,“那它有什么用?”ACID,Join和聚合对于所有数据库至关重要。没有ACID意味着没有原子,没有原子操作,你如何确保任何事情都正确发生,如何保证一致。Cassandra的的确确确实不能保证,所以如果您考虑选型某数据库来跟踪银行的账户余额,您可能应该考虑其他选择。

理想的cassandra使用场景

事实证明,Cassandra对某些应用程序非常有用。
理想的Cassandra应用程序具有以下特征:

    • 写入大幅度超出读。
    • 数据很少更新,并且在进行更新时它们是幂等的。
    • 通过主键查询,非二级索引。
    • 可以通过partitionKey均匀分区。
    • 不需要Join或聚合。
      我最推荐使用Cassandra的一些好场景是:
    • 交易日志:购买,测试分数,观看的电影等。
    • 存储时序数据(需要您自行聚合)。
    • 跟踪几乎任何事情,包括订单状态,包裹等。
    • 存储健康追踪数据。
    • 气象服务历史。
    • 物联网状态和事件历史。
    • 汽车的物联网数据。
    • 电子邮件

Cassandra开发入门文档第五部分(使用场景)的更多相关文章

  1. Cassandra开发入门文档第一部分

    Cassandra的特点 横向可扩展性: Cassandra部署具有几乎无限的存储和处理数据的能力.当需要额外的容量时,可以简单地将更多的机器添加到集群中.当新机器加入集群时,Cassandra需要对 ...

  2. Cassandra开发入门文档第四部分(集合类型、元组类型、时间序列、计数列)

    Cassandra 提供了三种集合类型,分别是Set,List,MapSet: 非重复集,存储了一组类型相同的不重复元素,当被查询时会返回排好序的结果,但是内部构成是无序的值,应该是在查询时对结果进行 ...

  3. Cassandra开发入门文档第三部分(非规范化关系结构、批处理)

    非规范化关系结构 第二部分我们讲了复合主键,这可以灵活的解决主从关系,也即是一对多关系,那么多对多关系呢?多对多关系的数据模型应该回答两个问题: 我跟着谁? 谁跟着我? -- 建表,我们发现这里有个不 ...

  4. Cassandra开发入门文档第二部分(timeuuid类型、复合主键、静态字段详解)

    timeuuid类型 timeuuid具有唯一索引和日期时间的综合特性,可以与日期和时间函数联合使用,常用的关联函数: dateOf() now() minTimeuuid() and maxTime ...

  5. Apache BeanUtils 1.9.2 官方入门文档

    为什么需要Apache BeanUtils? Apache BeanUtils 是 Apache开源软件组织下面的一个项目,被广泛使用于Spring.Struts.Hibernate等框架,有数千个j ...

  6. 【简明翻译】Hibernate 5.4 Getting Started Guide 官方入门文档

    前言 最近的精力主要集中在Hibernate上,在意识到Hibernate 5 的中文资料并不多的时候,我不得不把目光转向Hibernate的官方doc,学习之余简要翻一下入门文档. 原文地址:htt ...

  7. Duilib入门文档提供下载

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] Duilib入门文档 基本框架 编写界面xml 响应事件 贴图描述 类html文本描述 动态换肤 Dll插件 资源打包 Duil ...

  8. 2022最新IntellJ IDEA诺依开发部署文档

    前景提示 若伊是国内一款很好的开源项目,非常的便于学习,而且它是开源免费的,但是,它的开发部署文档实在是没法按照那个文档,快速高效的在本地搭建一套可以运行的项目,对于学习开发和使用实在是一大难题,为此 ...

  9. 2022最新IntellJ IDEA的zheng开发部署文档

    目录 前景提示 一.环境整合 构建工具(参考工具部署方式) 二.git 导入编译器 三.模块描述浅析 四.配置文档 1.总配置 2.数据库配置 3.密码设置 4.配置建议 五.在IDEA中执行MySQ ...

随机推荐

  1. 什么是OSI参考模型?

    一.OSI参考模型 1.OSI的来源 OSI(Open System Interconnect),即开放式系统互联. 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模 ...

  2. Haproxy 反向代理

    一.haproxy介绍 HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理. 特点如下: .支持两种代理模式:TCP(四层)和H ...

  3. Flutter初探与环境搭建

    最近组里有个前端的同事在疯狂学习Flutter,本来上半年就一直想学它,但是..由于个人的原因还有其它的东东想学就一直把它给无限搁置了,为了跟上时代的潮流所以接一来还是下定决定好好将它学一下,毕境如今 ...

  4. 【比赛游记】NOI2019打铁记

    上接 NOIWC2019冬眠记.(THUPC,CTS,APIO)2019四连爆蛋记 和 THUSC2019酱油记. Day0.5 笔试 AK 是容易的. 国家队选手见面会太好玩了啊! Day1 Day ...

  5. 导入Excel——解析Excel

    读取Excel 思路:先读取整个Excel,即工作簿,再依次读取其中的每个工作表Sheet,最后读取工作表内的表格. 一.读取工作簿利用流读取指定目录中的工作簿,并写入内存. /** * Constr ...

  6. hadoop spark合并小文件

      一.输入文件类型设置为 CombineTextInputFormat hadoop job.setInputFormatClass(CombineTextInputFormat.class) sp ...

  7. SpringCloud断路器(Hystrix)和服务降级案列

    断路器(Hystrix) 为什么需要 Hystrix? 在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用(RPC).为了保证其高可用,单个服务又必须集群部署.由于网络原因或者自 ...

  8. 13--网页,网站,微信公众号基础入门(PHP获取网页的get请求)

    https://www.cnblogs.com/yangfengwu/p/11148976.html 大家在访问网页的时候有没有注意一件事情 现在咱来看这种哈 现在咱做个功能哈,类似于这样 长话短说 ...

  9. 鸿蒙OS还有机会吗?

    鸿蒙最初的定位是手机操作系统,那在市场已饱和.生态已成熟,Android地位已牢不可破的当下,能成功是小概率事件,就像PC时代无法撼动Windows地位一样. 好在鸿蒙调整定位定义为面向未来的IOT操 ...

  10. SQL进阶-去重

    一.去重的2种基本方法 1.DISTINCT ## 建表: CREATE TABLE teacher( teacher_id ), teacher_name ), id_no ) ); CREATE ...