CAP原则1
CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。
- 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
- 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
- 分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写。BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的结论,是基于CAP定理逐步演化而来的,其核心思想是即使无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。
- 基本可用:指分布式系统在出现不可预知故障的时候,允许损失部分可用性。
注意,这绝不等价于系统不可用,以下两个就是“基本可用”的典型例子:
响应时间上的损失:正常情况下,一个在线搜索引擎需要0.5秒内返回给用户相应的查询结果,但由于出现异常(比如系统部分机房发生断电或断网故障),查询结果的响应时间增加到了1~2秒。
功能上的损失:正常情况下,在一个电子商务网站上进行购物,消费者几乎能够顺利地完成每一笔订单,但是在一些节日大促购物高峰的时候,由于消费者的购物行为激增,为了保护购物系统的稳定性,部分消费者可能会被引导到一个降级页面。 - 弱状态:也称为软状态,和硬状态相对,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。
- 最终一致性:强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。
与NoSQL的关系
- 传统的关系型数据库在功能支持上通常很宽泛,从简单的键值查询,到复杂的多表联合查询再到事务机制的支持。而与之不同的是,NoSQL系统通常注重性能和扩展性,而非事务机制(事务就是强一致性的体现)。
- 传统的SQL数据库的事务通常都是支持ACID的强事务机制。A代表原子性,即在事务中执行多个操作是原子性的,要么事务中的操作全部执行,要么一个都不执行;C代表一致性,即保证进行事务的过程中整个数据库的状态是一致的,不会出现数据花掉的情况;I代表隔离性,即两个事务不会相互影响,覆盖彼此数据等;D表示持久化,即事务一旦完成,那么数据应该是被写到安全的,持久化存储的设备上(比如磁盘)。
- NoSQL系统仅提供对行级别的原子性保证,也就是说同时对同一个Key下的数据进行的两个操作,在实际执行的时候是会串行的执行,保证了每一个Key-Value对不会被破坏。
MongoDB简介
- 非关系型数据库
- 文档存储:类json格式
- 有机会对字段建立索引,实现关系数据库
常用命令
- 查看当前数据库
show dbs - 切换数据库
use demo1 - 往数据库中插入一条数据
db.demo1.insert({“name”:“小红”}) - 删除数据库
db.dropDatabase() - 创建集合
db.createCollection(‘collection1’) - 查看已经创建的集合
show collections - 删除集合
db.collection1.drop() - 插入文档时,MongoDB自动创建集合
db.collectionDemo.insert({“name”:“bob”}) - 查看插入的内容
db.collectionDemo.find().pretty() - 插入复杂文档:声明变量,插入文档
document=({
title:‘MongoDB’,
by:‘Ruotong’,
tags:[‘MongoDB’,‘DataBase’,‘NoSql’],
});
db.collectionDemo.insert(document) - MongoDB中的比较操作
- 修改文档
- 格式
db.collection.update(
< query>, //对哪个文档进行修改
< update>, //修改成什么样子
{ //附加条件
upsert:< boolean>, //如果不存在update的记录,是否插入,默认false
multi:< boolean>, //把按条件查询出来的记录全部更新,默认false
writeConcern:< document> //抛出异常的级别
}
) // update是替换,没有修改的字段会消失。 - 修改文档
db.col.update({‘title’:‘MongoDB’},
{‘title’:‘MongoDB123’}) - 修改多个文档
db.col.update({‘name’:‘hello’},
{$set:{‘name’:‘hello123’}},
{multi:true}) - 删除文档
db.col.remove({“name”:“hello123”},1) - 删除多个文档
db.col.remove({“name”:“hello123”})
- 格式
- 修改操作符
- $inc
- 用法:{$inc:{field:value}}
- 作用:对一个数字字段的某个field增加value
- 示例:将name为xiaoming的学生的age增加5
- db.students.update({“name”:“xiaoming”},{$inc:{age:5}})
- $set
- 用法:{$set:{field:value}}
- 作用:把文档中某个字段field的值设为value
- 示例:把xiaoming的年龄设置为10岁
- db.students.update({“name”:“xiaoming”},{$set:{“age”:10}})
- $unset
- 用法:{$unset:{field:1}}
- 作用:删除某个字段field
- 示例:将chenzhou的年龄字段删除
- db.students.update({“name”:“chenzhou”},{$unset:{age:1}})
- $push
- 用法:{$push:{field:value}}
- 作用:把value追加到field里,注:field只能是数组类型,如果field不存在,会自动插入一个数组类型。
- 示例:给chenzhou添加别名“michael”
- db.student.update({name:“chenzhou”},{$push:{“alias”:“Michael”}})
- $rename
- 用法:{$rename:{old_field_name:new_field_name}}
- 作用:对字段进行重命名
- 示例:把xiaoming记录的name字段重命名为hello
- db.students.update({“name”:“xiaoming”},{$rename:{“name”:“hello”}})
- $inc