环和令牌
cassandra的数据管理是用一个环来表示。为环中的每个节点分配一or多个数据范围,用token描述。token由64位整数ID表示,范围-2^(63)~2^(63)-1。使用对分区键进行一个hash来计算分区键落到哪个token中,进而决定分配到哪个节点。org.apache.cassandra.dht.Range类。
虚拟节点(vnode),1.2版本引入,2.0默认开启。一个token就是对应一个vnode。将环分解为虚拟节点数的分段,可以让数据分布更均匀,在扩容,缩容,修复都会更快,不仅仅依赖一个节点的数据。num_tokens用来配置,可以让性能强的机器分配多,性能弱的分配少。
org.apache.cassandra.dht.tokenallocator.ReplicationAwareTokenAllocator。

分区器(全局配置)
决定分区键怎么hash。org.apache.cassandra.dht(DHT表示分布式哈希表)。
1.2增加Murmur3Partitioner,默认分区器。生成64哈希值。之前默认分区器RandomParttioner.
可插拔,可自定义。

复制策略
多副本,第一个副本肯定是根据分区键找到的hash环所在的节点上,剩下的副本就得根据复制策略放置。允许扩展,实现org.apache.cassandra.locator.AbstractReplicationStrategy。现在主要实现:SimpleStragety和NetworkTopologyStragety。
SimpleStragety:从分区键的所在环,往后找连续的节点上。
NetworkTopologyStragety:允许为每个数据中心指定一个不同的副本因子,DCXXX:几副本。如果是同一个数据中心,会适当的分配到不同机架。

一致性
ONE,TWO,THREE,QUORUM,LOCAL_QUORUM,ALL,ANY,SERIAL。
一般认为ALL和QURUM是强一致性。R+W>N 即强一致性。R,读副本数;W,写副本数;N,副本因子。
QUORUM:副本因子/2+1;需要多少个节点响应成功才算读写成功。其中写操作,在响应写成功之后,还会继续在后台更新其他副本。
级别:SERIAL
描述:允许读取当前的(包括uncommitted的)数据,如果读的过程中发现uncommitted的事务,则commit它。 用法:轻量级事务。

查询和协调节点
cassandra每个节点都对等,每个节点都可以接收客户端请求,然后转发到对应请求数据所在节点,这就是协调节点。协调节点会合并请求结果返回给客户端。

Memtable,SSTable和commitLog
cassandra节点:
JVM:memtable,键缓存,行缓存,计数器缓存
键缓存存储了分区键和行索引之间的一个映射。以利于更快的访问存储在磁盘上的SSTable。可以对每个表分别配置键缓存的使用。
行缓存可以缓存整个行,对于频繁访问的行,行缓存可以提高读访问的速度,但代价是要使用更多的内存。
计数器缓存通过减少对最常访问的计数器的锁竞争来提高计数器性能。
磁盘:commitLog,SSTable,hint(2.2+)
写操作,先写commitlog,commitlog支持持久性的一种失败恢复机制。写日志成功才算成功。节点重启会把commitlog重放,读取SSTable,保证数据不会丢。
commitLog
属于单个节点。commitlog_sync有2种策略:periodic,group和 batch。默认periodic,表示服务器只按指定的间隔保证写操作是持久的。这个间隔时间由commitlog_sync_perion_in_ms属性指定,默认10000(10秒)。倘若服务器设置为只是在周期时间内保证写操作是持久的,就有可能丢失一些数据,因为在这个周期时间里,那些数据可能还没有从"后台写"(write-behind),缓存同步到磁盘。如果设置为batch,则会阻塞,直到写操作同步到磁盘(提交日志同步到磁盘完成之前,Cassandra不会确认写操作完成),如果要求更快地写,就会限制它管理自己资源的自由。修改为batch,需要设置commitlog_sync_batch_window_in_ms为一个合理的值,每次同步的间隔时间。group和btach类似,也会阻塞。
先写commitlog,再写memtable。每个memtable包含一个特定的表的数据。早前memtable放在JVM堆中。2.1开始把memtable放到原生内存中。这样cassandra不容易受到java垃圾回收的影响。存在memtable的对象达到阈值,就会把内容输出到SSTable上,然后再创建新的memtable。这个输出是非阻塞的:一个表会对应多个memtable,其中一个是当前的memtable,剩下都是等待刷新到磁盘上的。(负载过高会影响刷盘)。
commitlog会为每个表保存一个标志位,第一次写操作时会写入日志,设置为1。当一个memtable正确输出到磁盘,相应的提交位会设置为0。所以是用来表示一个表是否把数据刷盘,表示commitlog不需要再维护这个数据来支持持久性。还有int[] lastFlushedAt,表示恢复从哪里开始。
SSTable是从Google的bigtable借用的。SSTable一旦形成,内容就不可改变,合并也只是改变磁盘的表示,把数据重新归并,然后删除老的sstable。
cassandra写性能高是因为追加写,然后通过合并来提高读的性能。读会读memtable和SSTable。Memtable由org.apache.cassandra.db.Memtable实现。

缓存
键缓存
存储了分区键和行索引之间的一个映射。以利于更快的访问存储在磁盘上的SSTable。可以对每个表分别配置键缓存的使用。JVM堆内。
行缓存
可以缓存整个行,对于频繁访问的行,行缓存可以提高读访问的速度,但代价是要使用更多的内存。存在堆外内存。
计数器缓存(2.1新增)
通过减少对最常访问的计数器的锁竞争来提高计数器性能。
默认启用键缓存和计数器缓存,行缓存是禁用的。

Hinted handoff
某个节点故障不可用,协调节点会记录对应的hint数据,等对应节点恢复,会发送写请求。cassandra为写的每个分区保留一个单独的hint。
一致性是ANY时,写hint成功,也算写成功。只是在节点恢复之前没法读。
Hinted handoff日志是节点恢复之后,进行数据传输是显示的。
防止hint堆积,可以禁止hint或者设置节点故障多久之内还写hint。节点恢复会发送大量hint。
org.apache.cassandra.db.HintedHandOffManager.

轻量级事务和Paxos
2.0支持一种提供线性一致性的轻量级事务或者“LWT”机制,基于单决策的paxos(单决策的分布式共识算法)。
在单决策的paxos(准备/承诺-->提议/接受)上,补充准备/承诺-->读-->提议/接受-->提交确认。协调节点会作为领导者提交提议。paxos来支持“写前读”。
关键是领导者必须先提交这个提议之前的所有在处理的提议。LWT涉及协调节点和副本之间的4次通信。比正常开销写大,谨慎使用。
LWT仅限于一个分区内,cassandra会为各个分区存储一个paxos状态,保证不同分区不会相互干扰。

墓碑
软删除,删除会先记录为墓碑。所以删除也是追加写,速度快。
GCGraceSeconds,超过这个时间,墓碑就会被回收。这是节点故障(坏盘导致的墓碑丢失)会恢复时间。默认864000秒,10天。如果超过那么久还没有恢复,要视为故障节点并替换才行。

布隆过滤器
布隆过滤器用来提升读性能的。布隆过滤器是检查一个元素是否属于一个集合的一种非确定性算法,速度非常快。非确定是因为,有可能得到假阳性(误报),但是不会假阴性(漏报),即会杀错,但不放过。
布隆过滤器使用一个hash函数将一个数据集中的值映射到一个位数组,并将一个较大的数据集缩减位一个摘要字符串。布隆过滤器会缓存在磁盘中,访问磁盘之前会访问布隆过滤器,减少查找键而访问磁盘。org.apache.cassandra.utils.BloomFilter

合并
合并SSTable数据时,键会归并,列会组合,墓碑被删除,会创建一个新的索引。释放空间。
合并会对归并的数据排序,在排序数据上创建新索引,然后将归并后有序的数据并且有索引的全新数据写入新的SSTable(包括:数据,索引和过滤器)org.apache.cassandra.db.compaction.CompationManager.
合并可以减少SSTable的查找。合并时,IO是会有临时峰值,因为读老的SSTable,写新的SSTable。
合并算法:每个表单独配置。扩展AbstractCompactionStragtegy。
默认是STCS,SizeTieredCompactionStrategy,适用写密集的表。
LCS,LeveledCompactionStrategy,适用读密集的表。DTCS,DateTieredCompactionStrategy,适用于时间序列或者基于日期的数据。2.1增加了反合并的特性。修复(repair)会把一个SSTable划分为2个SSTable,一个包含修复后的数据,一个包含未修复的数据。必须分别处理已修复和未修复的SSTable,使它们不会合并在一起。

逆熵,修复和Merkle树
修复包括读修复和逆熵修复(即手动修复,nodetool repair)。逆熵:变有序,一致。
读取数据会检查副本是否有过期数据,如果有最新值的节点数不够就会读修复。
nodetool repair会触发cassandra的主合并,在服务器发起一个TreeRequest/TreeResponse会话,与对应副本之间的节点交换Merkle树。Merkle树是表示这个表中数据的一个hash树。如果不同节点的树不匹配,就必须修复。
Merkle树的比较校验由org.apache.cassandra.service.AbstractReadExecutor负责。
Merkle树,即hash树,可做完整性校验。叶子节点是数据块,通常是系统中的文件。父节点就是直接子节点的一个hash。对比,即先对比根节点,如果根节点都不一样,再看到底是左儿子不一样还是右儿子不一样。org.apache.cassandra.utils.MerkleTree实现。Merkle树可以确保cassandra节点的对等网络可以无修改并且安全地接收数据块。Merkle树也用来在密码学中检验文件和传输的内容。
cassandra每个表有自己的Merkle树,这个树在主合并期间创建为一个快照,Merkle树生命周期仅限于发送给副本因子所在节点的时候,好处是可以减少网络IO(只发送一个树的摘要,比发送所有数据少了很多IO)。

cassandra权威指南读书笔记--Cassandra架构(2)的更多相关文章

  1. cassandra权威指南读书笔记--Cassandra架构(3)

    分阶段事件驱动架构 SEDASEDA(Staged Event-Driven Architecture)的核心思想是把一个请求处理过程分成几个Stage,不同资源消耗的Stage使用不同数量的线程来处 ...

  2. cassandra权威指南读书笔记--Cassandra架构(1)

    结构 集群-->数据中心-->机架-->节点. cassandra尽可能将数据副本存在多个数据中心,然后读取(查询路由到)尽可能在本地数据中心. 为了去中心化和分区容错性,使用gos ...

  3. cassandra权威指南读书笔记--cassandra查询语言

    cassandra使用一个特殊主键(复合键)表示宽行,宽行也叫分区.复合键由一个分区键和一组可选的集群列组成.分区键用于确定存储行的节点,分区键也可以包含多个列.集群键用于控制数据如何排序以及在分区中 ...

  4. cassandra权威指南读书笔记--cassandra概述

    cassandra是一个开源的.分布式.去中心化.弹性可扩展.高可用.容错.可调一致性.面向行数据库,分布式设计基于Amazon Dynamo,数据模型基于Google BigTable.cassan ...

  5. cassandra权威指南读书笔记--安全

    认证和授权driver,JMX和cassandra服务器支持SSL/TLS,cassandra节点间也支持SSL/TLS.密码认证器cassandra还支持自定义,可插拔的认证机制.默认的认证器:or ...

  6. cassandra权威指南读书笔记--客户端

    DataStax驱动最成熟.默认,驱动程序会使用第一个连接的节点作为支持的版本协议.如果集群存在高低版本的节点(比如升级场景),如果驱动先连接不同不同版本的节点,可能会出现不兼容.驱动支持压缩客户端和 ...

  7. cassandra权威指南读书笔记--性能调优

    cassandra自带测试工具cassandra-stress.nodetool proxyhistograms可以在多个节点运行,发现最慢的协调节点.nodetool tablehistograms ...

  8. cassandra权威指南读书笔记--监控&维护

    cassandra SLF4J API记录日志,具体采用Logback实现.在终端启动cassandra时,可以向程序输入-f,就能在终端看到这个输出.Java Mangement Extension ...

  9. cassandra权威指南读书笔记--读写数据

    写cassandra除了轻量级事务,不支持别的事务.cassandra是追加写,写的速度非常快.cassandra还有hint日志,这个数据库总是可写的,而且单个列的写操作是原子的.hint并不是一定 ...

随机推荐

  1. Prometheus集群介绍-1

    Prometheus监控介绍 公司做教育的,要迁移上云,所以需要我这边从零开始调研加后期维护Prometheus:近期看过二本方面的prometheus书籍,一本是深入浅出一般是实战方向的:官方文档主 ...

  2. 树莓派4B智能小车机器套件——入手组装实验记录

    树莓派4B智能小车机器套件--入手组装实验记录 4WD智能小车(4WD SMART ROBOT KIT),支持Arduino.51.STM32.Raspberry Pi等4个版本.本套件采用的是树莓派 ...

  3. wdCP V3.2

    wdCP是什么?关于wdCP更多的介绍,可看http://www.wdlinux.cn/wdcp/安装前先去体验下,看演示站吧http://www.wdlinux.cn/bbs/thread-5285 ...

  4. docker+mysql集群+读写分离+mycat管理+垂直分库+负载均衡

    依然如此,只要大家跟着我的步骤一步步来,100%是可以测试成功的 centos6.8已不再维护,可能很多人的虚拟机中无法使用yum命令下载docker, 但是阿里源还是可以用的 因为他的centos- ...

  5. 1018 Public Bike Management (30分) PAT甲级真题 dijkstra + dfs

    前言: 本题是我在浏览了柳神的代码后,记下的一次半转载式笔记,不经感叹柳神的强大orz,这里给出柳神的题解地址:https://blog.csdn.net/liuchuo/article/detail ...

  6. 如何实现CentOS服务器的扩容??

    Linux的硬盘识别: 一般使用"fdisk -l"命令可以列出系统中当前连接的硬盘 设备和分区信息.新硬盘没有分区信息,则只显示硬盘大小信息. 1.关闭服务器加上新硬盘 2.启动 ...

  7. python学习笔记 | 猜拳游戏

    ''' @author: 人人都爱小雀斑 @time: 2020/3/6 18:52 @desc: 实验结果心得: 1.难点主要在判断谁输谁赢 2.挺好的 ''' import random d={1 ...

  8. 【Spring】Spring中的Bean - 2、Baen的实例化 (构造器、静态工厂、实例工厂)

    Bean的实例化 文章目录 Bean的实例化 构造器实例化 静态工厂方式实例化 实例工厂方式实例化 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-S ...

  9. 【Java】计算机软件、博客的重要性、编程语言介绍和发展史

    之前学得不踏实,重新复习一遍,打扎实基础中. 记录 Java核心技术-宋红康_2019版 & Java零基础学习-秦疆 文章目录 软件开发介绍 软件开发 什么是计算机? 硬件及冯诺依曼结构 计 ...

  10. 【Linux】nohup和&的区别

    同样都是后台执行进程,但是nohup和&有什么区别呢? & 是指后台运行: nohup 的功能和& 之间的功能并不相同. 其中,nohup 可以使得命令永远运行下去和用户终端没 ...