关系型数据库
①事务、ACID和两阶段提交
数据库事务是一种具有ACID特征的“状态转义过程”。
ACID是原子性(Atomic)、一致性(Consistent)、隔离性(Isolated)和持久性(Durable)的缩写,是验证事务是否正确、是否成功执行的标尺和准则。
为保证事务跨越多主机成功执行,人们提出了两阶段提交(2PC,即two-phase commit),但是因为两阶段提交锁住了所有的相关资源,这种方法只对可以很快完成的操作可用。
两阶段提交是阻塞式的,也就是说客户端(竞争消费者)必须等待前一个事务完成,否则就无法访问阻塞了的资源。两阶段提交需要等待一个节点的响应,但或许这个节点已经死去;一个节点可以发送一个消息给事务协调节点,声明自己已经完成任务,可以提交了,然后它就会等待协调节点发回提交响应,但如果这时协调节点宕机了,那么这个节点就得永远等下去。
为了解决两阶段提交的分布式事务的问题,有人提出了补偿的概念,简单的说就是把操作立刻提交出去,如果发现了什么错误的话,就调用一个新的操作来恢复开始的状态。
2PC给应用开发者引入的问题包括可用性的损失和部分出错时导致的高延时。②分片
·按照特性或功能来分片
如将用户分到一个分片中,出售的产品放到一个分片中,电影评分放到一个分片中等。
·基于键值的分片
这种分发需要在你的数据中找到一个可以均匀分布到各个分片中的键值。应当对一个关键数据元素进行一次单项哈希,根据哈希值将数据分布到多台机器上,这种策略经常会使用一个时间或是数值键进行哈希
·查表法
集群中的一个节点充当黄页目录的角色,用于查询哪个节点拥有用户要访问的数据。这种方法存在的问题:由于每次查询都需要进行查表操作,这会影响到查询的性能;其次,这个表不仅会成为一个瓶颈,还可能是系统的一个单点失效点③Cassandra是一个开源的、分布式的、无中心、弹性可扩展、高可用、容错、一致性可调、面向列的数据库。
Cassandra是无中心的,每个节点都一样,没有节点会承担特殊的管理任务。与主从结构相反,Cassandra的协议是P2P的,并使用gossip来维护存活或死亡节点的列表。
无中心意味着Cassandra不会存在单点失效,所有节点的功能都一样,有时这被叫做“服务器对称”。无中心的设计是Cassandra的高可用性的关键所在。
无中心架构有两个关键优势:不仅比主从架构更加简单,而且可以避免系统宕机。
弹性可扩展,集群能够在不大幅修改或重新配置的情况下,接收那些新加入、获得全部或部分数据的节点,不需要重新启动服务,也无需自己手工重新均衡数据分布。在Cassandra里,你只要加入新的计算机,Cassandra会自动的发现它并开始让它工作
一致性的基本含义是读操作一定会返回最新写入的结果。
·严格一致性:也叫顺序一致性,要求所有读操作总是返回最新的写结果。要达到严格的一致性,需要某种全局锁机制来给每个操作加上一个时间戳。
·因果一致性:按照因果关系来达到一致性,潜在相关的写操作必须被顺序读出。
·弱一致性:也叫最终一致性,更新终将传播到整个分布式系统的每个角落,但这需要一定的时间。最终,所有的副本都会是一致的④CAP理论
在一个大规模分布式数据系统中,有三个需求是彼此循环依赖的:
一致性(Consistency),对于所有的数据库客户端使用同样的查询都可以得到同样的结果。
可用性(Availability),所有的数据库客户端总是可以读写数据
分区耐受性(Partiton Tolerance),数据库可以分散在多台机器上,即使发生网络故障,被分成多个分区,依然可以提供分区。
对任一系统,只能强化这三个特性中的两个。⑤Cassandra的应用场景
·大规模部署
·写密集、统计和分析型工作
·地区分布
·变化的应用安装Cassandra
① 进行配置文件的修改,主要是conf目录下的cassandra.yaml的修改。
主要修改几个位置:
cluster_name: 集群名称
seed_provider: 种子节点
listen_address: 侦听地址IP
rpc_address: 消息IP② 同时设置相应的数据、日志、和缓存的文件夹,这些文件夹必须具备读写的权限。
data_file_directories:/var/lib/cassandra/data
commitlog_directory: /var/lib/cassandra/commitlog
saved_caches_directory: /var/lib/cassandra/saved_caches③ 将文件SUDO SCP分发到各个节点主机上。保存同样的路径。并针对性修改各个节点上配置的IP地址。
④ 测试,打开某些节点的cassandra服务。 ./bin/cassandra -f
配置Cassandra
① keyspace
要创建一个keyspace,所需要做的就是给定名称、指定副本放置策略以及设定副本因子。② 分区器
分区器的用途是允许你指定行键的值应该被如何排序,这会严重影响数据在节点间如何分布,还会影响查询一个范围的行时可选的选项。
可以通过修改配置文件中的Partitioner元素或通过API来设置分区器
·随机分区器
这是Cassandra默认的分区器,使用BigIntegerToken存放MD5哈希值,通过哈希值来决定键值放在环上的具体位置。可以让键值很均匀地分布到集群中,不足的是区间查询效率不高。
·有序分区器
使用这个分区器,令牌是基于键值的UTF8字符串,各行按照键值的顺序存储,按照排序顺序对应其物理结构,将列族配置为使用有序分区器,允许你进行区间切片操作。有序分区器在区间查询时并不比随机分区器更有效率,它只是提供顺序性。它的一个缺点是非常容易让环不均匀。
·配页有序分区器
·字节序分区器
如果需要有序分区器,但不需要验证键值是否是字符串,推荐使用字节序分区器来提高性能。
③ Snitch
Snitch的工作是用于确定主机间的大致相互关系。Snitch收集网络拓扑的信息,以便Cassandra可以有效地路由请求信息。Snitch可以指出某个节点相对于其他节点的位置。它可以为副本放置策略推断节点属于哪个数据中心等信息。
④ 安全
·SimpleAuthenticator
在config目录中有两个文件:access.properties和passwd.properties。access文件中存放的键值对用于指定允许访问某个keyspace的用户;passwd文件则包含每个用户及其密码。
要使用简单鉴权器,需要在cassandra.yaml中替换authenticator元素的内容。
·编程鉴权
如果为keyspace设置了鉴权,那么客户端应用代码就需要登陆操作
·使用MD5加密
⑤ 其他设置
·column_index_size_in_kb
指定两次列索引之间,一行可以增长的尺寸,单位为KB。如果列值都非常大,可能需要提高这个参数的值。
·in_memory_compaction_limit_in_mb
代表在内存中进行压紧操作的行的尺寸限制。如果一行的长度超过了这个值,那么就会分段放在磁盘上进行压紧操作。
·gc_grace_seconds
对墓碑进行垃圾回收之前等待的秒数
·phi_convict_threshold
规定了Cassandra的故障检测算法的阈值,Phi值达到这个值之后,Cassandra会确信这个服务器离线了。如果网络状况不佳,可以增大这个值。默认为8cassandra的数据模型
① Cassandra的最外层结构是集群(cluster),有时也叫做环(ring),因为Cassandra将集群中的节点组织成一个环,并以此来分配数据到集群中的节点上。每个节点会存放部分数据的一个副本,如果一个节点宕机了,它的另一个副本可以响应查询请求。P2P协议允许数据以对用户透明的方式在节点间相互复制。
② 集群是keyspace的容器,而且里面通常只有一个keyspace。keyspace是Cassandra中数据的最外层容器,keyspace有一个名字和一些定义了整个keyspace范围的全局行为的属性。
在Cassandra中,可以针对keyspace设置的基本属性如下:
·副本因子:决定了要为一致性付出多少代价
·副本放置策略:非机架感知策略、机架感知策略、数据中心分片策略
·列族:keyspace是一个或多个列族的容器。③ 列族
列族有两个属性:名称和比较器。比较器是在查询数据时返回的列的排序方式,可以根据long、byte、UTF8或其他排序方式进行.
因为每个列族在磁盘上都存储为不同的文件,所以把相关的列放在同一个列族中十分重要。Cassandra中可以定义超级列族,使用超级列族的好处是允许嵌套定义
标准的列族类型是Standard,这是默认的;而对于超级列族,它的类型是Super
一些人认为Cassandra的列族类似于四维哈希:
[keyspace][ColumnFamily][Key][Column]
【同一行的所有数据必须存放在集群中的同一台机器上,每列的大小不能超过2GB】
还可以为每个列族定义如下一些附加的参数:
·keys_cached
每个SSTable中缓存的位置数量信息。列族中行的位置按照LRU的方式缓存在内存中
·rows_cached
缓存进内存中的整行内容的数量,包括每个行键对应的所有名值对的列表
·comment
这就是个标准的注释信息
·read_repair_chance
一个介于0和1之间的值。读取的多个副本值不一致时,这个值决定了进行读修复操作的概率。当读操作比写操作多很多时,你可能会希望这个概率低一些④ 列
列是一个由名称、值和时钟构成的三元组
列还有一个可选的生存时间(TTL),允许列在创建以后的一段时间后过期⑤ 宽行和窄行
宽行意味着有上万甚至上百万的列,宽行需要考虑列名的排序问题:
列通过列族中定义的“Compare With”类型来排序,可以从如下类型中选择:AsciiType、BytesType、LexicalUUIDType、LongType、IntegerType、TimeUUIDType、UTF8Type(在Cassandra中,除非你要验证数据,否则不要使用UTF8Type)、Custom(需要扩展org.apache.cassandra.db.marshal.AbstractType,并指定自己的类名)
列名的存储是按照compare_with的值来排序的,行则按照分区器定义的顺序排序再存储的(比如使用RandomPartitoner,就是随机顺序)
【列排序是可控的,但键值排序不是,行健值总是按照字节序来排序的】⑥ 超级列
普通列的值是字节数组,而超级列的值是一个子列的映射。超级列不能存储其他超级列的映射。
当引入超级列时,Cassandra变成了一个五维哈希:
[keyspace][ColumnFamily][Key][SuperColumn][SubColumn]
要使用超级列,就需要为列族定义类型为Super。然后,和普通列一样,仍然使用行健值,但这个行健值指向的是一个普通列的列表或是映射的名字,这里的普通列也叫子列⑦ 设计模式
·具体化视图
以第二列族的形式,创建外部键
·无值列
·聚合键
把多个标量值以一个分隔符连在一起来创建一个聚合键读写数据
① Cassandra的写操作非常快,因为它允许在写时不进行任何磁盘读或定位的操作。memtable和SSTable让Cassandra可以不必在写时进行这些操作。
② 一致性级别:Cassandra的可调一致性级别意味着可以在查询中指定需要多少一致性。高一致性意味着更多的节点需要响应这次查询,以提供更高的一致性保障,确保每个副本都是同样的值。
③ 列是按照类型排序的(由CompareWith指定),而行是按照它们的分区器排序的
区间通常指(行)键值的范围。而切片则用来指一行之中的一个范围内的列。
列是有序存储的,通过区间查询,可以一次取出名称在一定范围之内的列(称为一个区间切片)
区间查询需要使用有序分区器,这样键值就可以有序返回。④ 切片谓词:用于指定一组列的限定词。可以使用两种方式来指定切片谓词:get_slice一组列名或是一个切片区间;使用切片区间来指定范围。
可以使用sliceRange结构的计数(count)属性来限制切片区间返回列的数量。
可以设置切片区间的reversed=true属性来取出呈现逆序的列。
取出一行中的所有列,也要使用有切片区间的谓词,但只要给区间的起始和结束参数一个空字节组就可以了。
get_range_slices可以访问一个键值或令牌区间
multiget_slice可以根据一个指定的行键值得到一组指定列⑤ 批量变更
batch_mutate方法用于一次进行批量的插入和更新
Cassandra_基础
最新推荐文章于 2022-09-13 17:21:23 发布