收藏 分享(赏)

Cassandra 教程.ppt

上传人:kpmy5893 文档编号:9216950 上传时间:2019-07-29 格式:PPT 页数:49 大小:351KB
下载 相关 举报
Cassandra 教程.ppt_第1页
第1页 / 共49页
Cassandra 教程.ppt_第2页
第2页 / 共49页
Cassandra 教程.ppt_第3页
第3页 / 共49页
Cassandra 教程.ppt_第4页
第4页 / 共49页
Cassandra 教程.ppt_第5页
第5页 / 共49页
点击查看更多>>
资源描述

1、提 纲,概述和特点 数据模型 概念,排序,twitter,rrd Ring 写操作 读操作 API 性能测试和比较 配置说明,概 述,非关系的数据库 分布式的Key-Value存储系统 一堆数据库节点共同构成的一个分布式网络服务 对Cassandra 的一个写操作,会被复制到其他节点上去 对Cassandra的读操作,也会被路由到某个节点上面去读取,特 点,模式灵活 : 使用Cassandra,像文档存储,你不必提前解决记录中的字段。你可以在系统运行时随意的添加或移除字段。这是一个惊人的效率提升,特别是在大型部署上。 真正的可扩展性 : Cassandra是纯粹意义上的水平扩展。为给集群添加更

2、多容量,可以指向另一台电脑。你不必重启任何进程,改变应用查询,或手动迁移任何数据。 多数据中心识别 : 你可以调整你的节点布局来避免某一个数据中心起火,一个备用的数据中心将至少有每条记录的完全复制。,数据模型,数据模型,可以理解为四维或者五维的hash Cluster 包含多个Keyspace Keyspace 包含多个ColumnFamily ,通常对应一个application,如twitter ColumnFamily包含多个Column,或者是SuperColumn SuperColumn :包含有多个Column Column最小数据单元,三元组:name, value, times

3、tamp,想象成一个name/value对 name和value都是byte类型的,长度不限 例子: “name“: “emailAddress“, “value“: ““, “timestamp“: 123456789 所有的值都由客户点提供,包括timestamp,所以要求客户端同步; Timestamp的作用是用来解决数据冲突,几乎可以忽略;,Column(三元组),SuperColumn,我们可以将SuperColumn想象成Column的数组,它包含一个name,以及一系列相应的Column / 这是一个SuperColumn name: “Address“, value: name

4、: “street”, value: “中关村” , timestamp:1234, name: “city”, value: “北京” ,timestamp:1234, Column和SuperColumn都是name与value的组合,只是value部分不一样; SuperColumn的value部分是columns ; 注意:SuperColumn本身是不包含timestamp的 ;,ColumnFamily,ColumnFamily是一个包含了许多Row的结构,类似数据库的Table。 每一个Row都包含有Key以及和该Key关联的一系列Column。UserProfile / Col

5、umnFamily user1: / key username: “x“, email: ““, phone: “134666666“ , / 第一个row结束 user2: / key username: “zi“, email: “ zi “, phone: “1399888888“ age: “24” , / 第二个row结束 ColumnFamily的类型:Standard(column)或Super(Super column)。,ColumnFamily,SuperColumn familyColumn family,Cassandra和关系数据库的对比: Column name 字

6、段名 Column value 值 Key primary key ; row Columnfamily table Keyspace database Cluster server 插入:cassandra set Keyspace1.Standard1jsmithfirst = John Value inserted. cassandra set Keyspace1.Standard1jsmithlast = Smith Value inserted. cassandra set Keyspace1.Standard1jsmithage = 42 Value inserted.读取:cas

7、sandra get Keyspace1.Standard1jsmith (column=age, value=42; timestamp=1249930062801) (column=first, value=John; timestamp=1249930053103) (column=last, value=Smith; timestamp=1249930058345) Returned 3 rows.,排序,注意:在某一个Key的某个CF内的所有Column都是按照它的Name来排序的 ,不是按照value排序故cassandra表设计有一个特殊的地方:可以将真正的值存入column n

8、ame,而将column value置为空“”排序类型可以配置BytesType, UTF8Type,LexicalUUIDType, TimeUUIDType, AsciiType,LongType Cassandra的排序功能是允许我们自己实现的,只要你继承org.apache.cassandra.db.marshal.ITypeSupercolumn可以指定两级排序,Twitter的数据模型, Users CF记录用户的信息, Statuses CF记录tweets的内容, StatusRelationships CF记录用户看到的tweets UserRelationships CF记

9、录用户看到的followers,Users CF记录用户的信息, Statuses CF记录tweets的内容, StatusRelationships CF记录用户看到的tweets UserRelationships CF记录用户看到的followers,RRD数据的设计,只有一个DS的情况,可以只用column;多个DS,采用supercolumn; 要点:采用timestamp作为super column name,排序方式采用TimeUUIDType; 第一种方法:“8.60”: / key CpuUsage: / CF“10000000”:“used”:”30”,”free”:”7

10、0” / Super column“10000300”:“used”:”20”,”free”:”80” / Super column “10000600”:“used”:”25”,”free”:”75” / Super column. ,第二种方法:,相当于super coumn name就是RRD 的DS name; 这种做法似乎更符合cassandra说的可以认为super coumn name是一个目录的这种结构。“8.60”: / key CpuUsage: / CF“free”: / super coumn name=free“10000600”:“30”“10000900”:“40

11、” . “used”: / super coumn name=used“10000600”:“70”“10000900”:“60” . ,Ring 节点环,所有节点都是对等关系,Ring,数据到底存储在哪些个节点? 集群中的节点组成环 Token 给每一个节点指定一个唯一的整数token(0 至2127)作用:确定数据的第一个副本存储在哪个节点所有的key都会被MD5hash成0 至 2127 之间的整数每个节点负责存储一个key range里面的key的第一个副本按照副本放置策略( ReplicaPlacementStrategy )和 副本个数(ReplicationFactor)确定存储

12、其它n-1个副本的 其它n-1个节点 两种副本策略:RackUnawareStrategy 和 RackAwareStrategy,Ring,根据副本策略,在环上确定数据到底存储在哪些个节点 配置:(副本个数:3)org.apache.cassandra.locator.RackUnawareStrategy ,写操作,CommitlogMemtableSstable详细流程,Write,先写日志文件commitlog,然后数据才会写入到Column Family在内存中对应的Memtable中, Memtable满足一定条件后批量刷新到磁盘上,存储为SSTable。,Commitlog,位置

13、:disk 作用:确保异常情况下,根据持久化的SSTable和Commitlog重构内存中Memtable的内容 写操作:先写Commitlog再写Memtable 当一个Commitlog文件写满以后,会新建一个的文件。 当旧的Commitlog文件不再需要时,会自动清除。 在恢复的时候,所有的磁盘上存在的Commitlog文件都是需要的,Memtable,一种memory结构,每个CF对应一个Memtable 内容按照key排序 缓存写回机制 满足一定条件后批量刷新到磁盘上,存储为SSTable;下一次Memtable需要刷新到一个新的SSTable文件中 优势将随机IO写变成顺序IO写,

14、降低大量的写操作对于存储系统的压力 可以认为只有顺序写,没有随机写操作,Sstable,存储位置:disk 按照key排序后存储key/value键值字符串 Sstable一旦完成写入,就不可变更,只能读取 为了避免大量SSTable带来的性能影响,定期将多个SSTable合并成一个新的SSTable ,称之为Compaction Compaction Merge keys Combine columns SSTable中的key都是已经排序好的,因此只需要做一次合并排序就可以完成该任务,Sstable 的data目录,Column Family Name-序号-Data.db SSTable

15、数据文件,按照key排序后存储key/value键值 Column Family Name-序号-Filter.db Bloom Filter算法生产的映射文件 ;Bloom Filter算法: 快速定位待查询的key所属的SSTable Column Family Name-序号-index.db 索引文件,保存的是每个key在数据文件中的偏移位置,About writes.,No readsNo seeksSequential disk accessAtomic within a column familyFastAny nodeAlways writeable (hinted hand-

16、o),写流程,假设副本个数:n 写操作从客户端发送给一个节点,该节点作为代理,根据复制策略确定数据副本所在的n个节点,并发送写请求给这n个节点。 代理节点等待这n个节点中的某些节点的写响应并将写操作成功的消息告诉客户端(根绝写操作的ConsistencyLevel确定需要等待写成功的节点个数) 这n个节点收到写请求后,做2个操作: 追加commitlog 更新memtable 所以写操作快的原因:写内存,慢的部分仅仅是写日志 后台有一些异步的事件可能发生: Memtable到阀值后要被flush到sstable 同一个cf的多个sstable被合并成一个大的sstable,写流程,写操作能覆盖

17、老数据(根据column的timestamp来判断)Write ConsistencyLevel(副本个数:n) ONE :确保写入至少一个节点的commitlog和memtable(其它n-1个节点也会去写) QUORUM :确保至少写入n/2+1个节点 ALL :确保写入n个节点,有单点失效问题例子:RackUnawareStrategy的副本策略Write ConsistencyLevel:1ReplicationFactor = 2,读操作,Read,查询数据时,需要去合并读取Column Family所有的SSTable和Memtable Bf确定待查找key所在的sstable I

18、dx确定key在sstable中的偏移位置,读流程,假设副本个数:n 读请求从客户端发送给一个节点,该节点作为代理,根据复制策略确定保存数据的n个节点,并发送读请求给这n个节点。 对于每一个收到读请求的节点: 读取memtable 扫描SSTable ConsistencyLevel ONE :返回第一个响应的节点上面的数据,不保证数据时最新的;但是会做读修复,一致性检查,这样后续的调用能够得到最新的数据(有些延迟) QUORUM : 查询所有节点,返回至少 / 2 + 1 个节点中的最新的数据;也有读修复 ALL :查询所有节点,返回所有节点中最新的数据;一个节点失效将导致读失败,About

19、 reads.,Any nodeRead repairUsual caching conventions apply,读写操作,API,update,insert(): (一行一列)写入一个column By keybatch insert(): (一行多列)写入多个Columns or SuperColumns,还可以跨越不同的ColumnFamily By keyremove(): 删除一行的一列,或者一行所有列 By key 并不会马上从disk中删除数据,Querying,get(): (一行一列)获取一个column 或者 SuperColumn get_slice (): (一行多

20、列) Get the group of columnOrSupercolumn ,结果受排序方式影响; by column name, or a range of namesmultiget(): (多行一列) by column name for a set of keys multiget_slice (): (多行多列) a subset of columns for a set of keys get count: number of columns or sub-columnsget_range_slice(): 支持指定范围查询(多行多列) subset of columns fo

21、r a range of keys 配置中要求是order-preserving partitioner,性能测试,Performance vs MySQL w/ 50GB,官方数据 MySQL300ms write350ms readCassandra0.12ms write15ms read,测试性能,写入20万条数据,读出20万条数据 单线程: Cassandra Write:161125 ms,平均0.8 ms/条 Read:2658516 ms,平均13 ms 并发性能好,配 置,集群最基本的配置,ClusterName 每一个集群的名称都应该是不一样的 AutoBootstrap

22、设置为true,节点自动加入集群 Seeds 本节点ip 集群中任何一个节点的ip ReplicationFactor 数据备份的副本个数 ListenAddress 绑定自己的ip地址,用于其它节点和它通信 直接留空:InetAddress.getLocalHost() ThriftAddress Thrift服务的的绑定地址,设置为0.0.0.0监听所有interfaces,添加一台服务器,影响:会自动迁移数据(AutoBootstrap)到该节点,这个过程是后台的,健壮的,智能的。比如,bootstrap启动后,你关闭了某个节点,过一段时间后再启动,原先中途终止的数据迁移会继续进行,不会

23、有数据丢失。 只需要修改该服务器的配置文件,指向集群中任一个节点8.10 本节点8.60 集群中的任一个节点自动加入集群,完成数据迁移工作true 保证集群名字一样Cluster1 可以使用命令查看加入集群成功与否(注意:只有在看到其它节点才算成功,最好确保其它节点和该节点之间彼此都能看到彼此)sh nodeprobe -host .8.60 -port 8080 ring,删除一台服务器,影响: 因为可以对数据有多个备份,不会丢失数据;删除并不会自动删除该节点的数据;1. 对要remove的节点,执行nodeprobe decommission命令;2. 对其它每个节点,执行nodeprob

24、e removetoken命令,删除这个不用的 token,同时其它节点会产生一些数据复制的工作。对被删除节点: sh nodeprobe -host 58.37 port 8080 decommission ;然后关闭其cassandra 对其它节点: sh nodeprobe -host 8.10 -port 8282 removetoken 参数token sh nodeprobe -host 8.60 -port 8080 removetoken 参数token sh nodeprobe -host 8.119 -port 8080 removetoken 参数token 注意:如果该

25、节点要以不同的token再次加入该集群,就需要手动把数据都删除掉。 (data,commitlog,log文件都要删除掉),修改keyspace和cf,目前是必须要修改配置文件并重启机器(以后可能会支持程序配置); 每个节点要依次修改; 修改步骤: Kill cassandra process on one server of the cluster Start it again, wait for the commit log to be written on the disk, and kill it again Make the modifications in the storage.

26、xml file Rename or delete files in the data directories according to the changes we made (新建keyspace和cf无须此操作) Start cassandra Goto 1 with next server on the list,Memtable的配置,MemtableSizeInMB 每个CF的Memtable的阀值,到了这个阀值后将被flush到sstable;设置过大会使插入大量数据后变慢MemtableObjectCountInMillions 每个CF的Memtable的最大column数目

27、 如果有100行,每行有1000列,则这个数是100*1000列这两个值用于控制内存的使用情况 设置大小:取决于cf个数,每个cf的columns数,还有value的大小 使用jconsole跟踪: service:jmx:rmi:/jndi/rmi:/ip:8080/jmxrmi 参考MemtableDataSize 来设置 MemtableSizeInMB 参考MemtableColumnsCount 来设置MemtableObjectCountInMillions 使用jconsole还可以手动flush memtable到sstable,Partitioner,当一个节点加入集群时,如

28、果不指定InitialToken,则使用算法分配给节点一个token,使得这个节点将负责当前集群中负载最重的节点(keys最多)一半的负载(keys) Partitioner: 决定了数据如何分布在集群中 一旦配置了就不能改变,除非将数据的删除掉,因为变化会修改sstable的磁盘格式 RandomPartitioner 能保证负载均衡地散落在节点中 但是不支持range scan OrderPreservingPartitioner 支持range query Knows how to map a range of keys directly onto one or more nodes 不

29、一定保证负载均衡 可以通过配置InitialToken,确保负载均衡,ReplicaPlacementStrategy,假设ReplicationFactor = n 确定第一个节点: key MD5Hash 后的值落在一个节点负责的keyrange,则这个节点存储这个key的第一个副本 RackUnawareStrategy 将其它n-1个副本存储在第一个节点随后的n-1个节点(in increasing Token order ) RackAwareStrategy(没明白) 将第2个副本存储在另一个DC中 其它n-2个副本存储在第一个节点所在的DC中,其 它,MemtableFlushAfterMinutes 停留在Memtable的数据被flush到sstable的最长等待时间 尽量大,以免引起a flush storm ConcurrentReads 建议:2 concurrent reads per processor core ConcurrentWrites 最大并发写数目,可提高以支持更好的并发 GCGraceSeconds 删除数据并不会马上将数据删除掉,而是等待GCGraceSeconds秒后才真正删除,客户端,支持Thrift,可以使用多种语言开发 客户端连接到哪一个节点? 建议采用round robin DNS,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医学治疗 > 基础医学

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报