正确建模

开发人员在构建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. Centos7永久修改IP地址(NAT模式)

    永久修改IP地址,即为设置静态的IP地址. 一.修改IP地址前需要准备的工作 1.虚拟机需要使用NAT的网络模式 虚拟机关机状态下,点击"编辑虚拟机设置",点击"网络适配 ...

  2. nmap的使用方法

    0x01 Nmap 典型用途: 1.通过对设备或者防火墙的探测来审计它的安全性. 2.探测目标主机所开放的端口. 3.网络存储,网络映射,维护和资产管理.(这个有待深入) 4.通过识别新的服务器审计网 ...

  3. Codeforces I. Producing Snow(优先队列)

    题目描述: C. Producing Snow time limit per test 1 second memory limit per test 256 megabytes input stand ...

  4. 逆向破解之160个CrackMe —— 019

    CrackMe —— 019 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...

  5. 自定义微信小程序swiper轮播图面板指示点的样式

    微信小程序的swiper组件是滑块视图容器,也就是说平常我们看到的轮播图就可以用它来做,不过这个组件有很多样式是固定的,但是,有时候我们的设计稿的面板指示点是需要个性化的,那么如何去修改swiper组 ...

  6. MyBatis-plus的入门学习

    MyBatis优势: Sql简单语句可以自由控制,更灵活,性能更高.. sql与代码分离,易于阅读和维护 提供xml标签,支持编写动态sql语句. 劣势: 简单crud操作还是写SQL 语句 xml中 ...

  7. 项目Beta冲刺--6/7

    项目Beta冲刺--6/7 作业要求 这个作业属于哪个课程 软件工程1916-W(福州大学) 这个作业要求在哪里 项目Beta冲刺 团队名称 基于云的胜利冲锋队 项目名称 云评:高校学生成绩综合评估及 ...

  8. PHP:ThinkCMFX任意文件包含漏洞

    前言:最近爆出来的漏洞,ThinkCmfX版本应该是通杀的,基于3.X Thinkphp开发的 代码下载地址:https://gitee.com/thinkcmf/ThinkCMFX/releases ...

  9. day005-python基础数据类型之课后作业讲解

    1.元素的分类 需求:有如下集合[11,22,33,44,55,66,77,88,99,90……],将所有大于66的值保存在字典的第一个key中,将小于66的值保存在第二个key的值中 代码实现: # ...

  10. 洛谷2051 [AHOI2009]中国象棋

    题目链接 题意概述:n行m列棋盘放若干个棋子每行每列最多两个求方案总数,答案对9999973取模. 可以比较容易看出这是个dp,设f[i][j][k]表示前i行j列放1个棋子k列放2个棋子的方案总数. ...