cassandra权威指南读书笔记--Cassandra架构(2)
环和令牌
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)的更多相关文章
- cassandra权威指南读书笔记--Cassandra架构(3)
分阶段事件驱动架构 SEDASEDA(Staged Event-Driven Architecture)的核心思想是把一个请求处理过程分成几个Stage,不同资源消耗的Stage使用不同数量的线程来处 ...
- cassandra权威指南读书笔记--Cassandra架构(1)
结构 集群-->数据中心-->机架-->节点. cassandra尽可能将数据副本存在多个数据中心,然后读取(查询路由到)尽可能在本地数据中心. 为了去中心化和分区容错性,使用gos ...
- cassandra权威指南读书笔记--cassandra查询语言
cassandra使用一个特殊主键(复合键)表示宽行,宽行也叫分区.复合键由一个分区键和一组可选的集群列组成.分区键用于确定存储行的节点,分区键也可以包含多个列.集群键用于控制数据如何排序以及在分区中 ...
- cassandra权威指南读书笔记--cassandra概述
cassandra是一个开源的.分布式.去中心化.弹性可扩展.高可用.容错.可调一致性.面向行数据库,分布式设计基于Amazon Dynamo,数据模型基于Google BigTable.cassan ...
- cassandra权威指南读书笔记--安全
认证和授权driver,JMX和cassandra服务器支持SSL/TLS,cassandra节点间也支持SSL/TLS.密码认证器cassandra还支持自定义,可插拔的认证机制.默认的认证器:or ...
- cassandra权威指南读书笔记--客户端
DataStax驱动最成熟.默认,驱动程序会使用第一个连接的节点作为支持的版本协议.如果集群存在高低版本的节点(比如升级场景),如果驱动先连接不同不同版本的节点,可能会出现不兼容.驱动支持压缩客户端和 ...
- cassandra权威指南读书笔记--性能调优
cassandra自带测试工具cassandra-stress.nodetool proxyhistograms可以在多个节点运行,发现最慢的协调节点.nodetool tablehistograms ...
- cassandra权威指南读书笔记--监控&维护
cassandra SLF4J API记录日志,具体采用Logback实现.在终端启动cassandra时,可以向程序输入-f,就能在终端看到这个输出.Java Mangement Extension ...
- cassandra权威指南读书笔记--读写数据
写cassandra除了轻量级事务,不支持别的事务.cassandra是追加写,写的速度非常快.cassandra还有hint日志,这个数据库总是可写的,而且单个列的写操作是原子的.hint并不是一定 ...
随机推荐
- 浅析 MVC Pattern
一.前言 最近做CAD插件相关的工作,用到了一些模式,解决对应场景的问题. 比如插件的运行实例上使用Singleton.实例内部使用了MVC(Strategy and Observer ). 针对CA ...
- TensorFlow中数据读取—如何载入样本
考虑到要是自己去做一个项目,那么第一步是如何把数据导入到代码中,何种形式呢?是否需要做预处理?官网中给的实例mnist,数据导入都是写好的模块,那么自己的数据呢? 一.从文件中读取数据(CSV文件.二 ...
- CQRS与Event Sourcing之浅见
引言 DDD是近年软件设计的热门.CQRS与Event Sourcing作为实施DDD的一种选择,也逐步进入人们的视野.围绕这两个主题,软件开发的大咖[Martin Fowler].[Greg You ...
- uni-app阻止事件向父级冒泡
在官网找到的就只有这个方法,但是我放在app项目里并不支持,所以就想到vue的阻止事件冒泡的方法,现在分享,免得大家踩坑 <view class="parent" @ ...
- Linux下安装Oracle11g服务器【转】
安装环境 Linux服务器:oracle linux 6.6 64位 Oracle服务器:Oracle11gR2 64位 系统要求 Linux安装Oracle系统要求 系统要求 说明 内存 必须高于1 ...
- Petalinux和Vivado的安装
Petalinux和Vivado的安装 背景 我是搞软件的, FPGA这块不太了解.由于机缘巧合,最近有接触到这块的开发.所以先挖一坑. 先声明我不是专业搞这块的,所以对这块的内容理解可能会有偏差,以 ...
- jxl解析多个excel工作表-java代码
@Override public ResultBean txImportDqKpi(String filePath) { ResultBean rb = new ResultBean(); int s ...
- java8新特性之stream流
Stream 流是 Java 8 提供给开发者一套新的处理集合的API,他把我们将要处理的集合作为流,就像流水线一样,我们可以对其中的元素进行筛选,过滤,排序等中间操作,只不过这种操作更加简洁高效. ...
- 浅谈sql索引
索引是什么 假如你手上有一个你公司的客户表,老板说找什么客户你就得帮他找出来. 客户不多的时候,你拿着手指一行一行滑,费不了多少时间就能找到. 后来公司做大了,客户越来越多,好几页的客户,你发现,一行 ...
- 鸿蒙的远程交互组件应用及微信小程序的远程交互组件应用
注:鸿蒙的远程交互组件应用相对复杂 ,访问网络时,首先要配置网络权限,华为官方文档有问题,在此引用我老师配置的模板,见附件 过程:1.导入鸿蒙的网络请求模块fetch 2.发起对服务器的请求(在这过程 ...