1.Nosql数据库基本知识
1. Nosql在国内的应用
- 新浪微博
- Redis+MySQL
- 200多台物理机
- 淘宝数据平台
- Oceanbase
- Tair:2010年6月30日对外开源
视觉中国
- MongoDB
优酷
- 在线评论 MongoDB
- 运营数据分析 Hadoop/Hbase
- 飞信空间
- HandlerSocket
- 豆瓣社区
- BeansDB
2. NoSQL数据库的产生背景
2.1. 大数据的兴起于发展
2.1.1. What can you do with the data
- Reporting
- Post Hoc—事后比较
- Real time---实时处理
- Root Cause Analysis根本原因分析
- Building Models
- Prediction
- Finding Patterns
- Exploration
- Control Physical Systems
- More/More detailed data -> new business models and products…
2.1.2. Analytics Provide the Key To:
- Personalization—个性化
- Behavioral Targeting—行为定向
- Service Optimization—服务优化
- New and Improved Products
- New and Improved Business Models
2.1.3. 大数据能做什么
- 帮助政府实现市场经济调控、公共卫生安全防范、灾难预警、社会舆论监督
- 帮助城市预防犯罪,实现智慧交通,提升紧急应急能力
- 帮助医疗机构建立患者的疾病风险跟踪机制,帮助医药企业提升药品的临床使用效果,帮助艾滋病研究机构为患者提供定制的药物
- 帮助电商公司向用户推荐商品和服务,帮助旅游网站为旅游者提供心仪的旅游路线,帮助二手市场的买卖双方找到最合适的交易目标,帮助用户找到最合适的商品购买时期、商家和最优惠价格
- 帮助企业提升营销的针对性,降低物流和库存的成本,减少投资的风险,以及帮助企业提升广告投放精准度
- 帮助娱乐行业预测歌手,歌曲,电影,电视剧的受欢迎程度,并为投资者分析评估拍一部电影需要投入多少钱才最合适,否则就有可能收不回成本
- 帮助社交网站提供更准确的好友推荐,为用户提供更精准的企业招聘信息,向用户推荐可能喜欢的游戏以及适合购买的商品
2.1.4. 大数据无处不在
- 科学研究
- 基因组
- LHC 加速器
- 地球与空间探测
- 企业应用
- Email、文档、文件
- 应用日志
- 交易记录
- Web 1.0数据
- 文本
- 图像
- 视频
- Web 2.0数据
-查询日志/点击流
- Twitter/ Blog / SNS
- Wiki
2.1.5. 大数据定义
大数据(big data,mega data),或称巨量资料,指的是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产
- 高德纳咨询公司(Gartner Group)
大数据指不用随机分析法(抽样调查)这样的捷径,而采用所有数据进行分析处理
- 维克托·迈尔-舍恩伯格及肯尼斯·库克耶编写的《大数据时代》
大数据(Big data)通常用来形容一个公司创造的大量非结构化数据和半结构化数据,这些数据在下载到关系型数据库用于分析时会花费过多时间和金钱
- 《著云台》的分析师团队
2.1.6. 大数据的四个特征
- Volume—数量大
- Velocity—速度快
- Variety—多样化
- Value—价值
2.1.7. 从数据库到大数据
池塘捕鱼(数据库)vs.大海捕鱼(大数据) 模式(Schema)和数据的关系处理对象 在“池塘”中捕鱼,“鱼”仅仅是其捕捞对象 在“大海”中,“鱼”除了是捕捞对象之外,还可以通过某些“鱼”的存在来判断其他种类的“鱼”是否存在 传统数据库中数据仅作为处理对象 大数据时代,要将数据作为一种资源来辅助解决其他诸多领域的问题 处理工具 捕捞“池塘”中的“鱼”,一种渔网或少数几种基本就可以应对,也就是所谓的One Size Fits All 在“大海”中,不可能存在一种渔网能够捕获所有的鱼类,也就是说No Size Fits All
2.2. 关系数据库的优势和不足
2.2.1. 优势
- 通用性和高性能
- 保持数据的一致性(事务处理)
- 最小冗余
- 复杂查询如JOIN
- 成熟的技术
2.2.2. 不足
- 不适合在分布式环境中的向外扩展
为什么?
- 假设你要建设这样的系统,有数千用户的要求要处理,合理的方法是使用LAMP(Linux, apache, MySQL, PHP)来实现商业原型。
- 关系数据库自身有很多特性
- 事务可以保证更新多张表的数据是原子的, 保证你数据是强一致性的;
- 参照完整性保证不同表模式间的关系;
- sql让你可以执行复杂的查询(on everything);
- 你不必关心数据是如何保存的,只需要关心表模式。
- 这种工作模式是很好的,而且能在相当长的一段时间内提供很好的服务
如果幸运,你可以成为Internet上下一个
- 热门话题,越来越多的人关注你的网站
随着用户数的不断增加,需要增加更多的应用服务器,但是相对来说比较简单,真正的压力在于所有的应用服务器都共享一个中心的数据库服务器。随着数据库服务器的CPU/IO负载的不断增加,你就要考虑以当前这种用户增速,它还能支持多久
- 第一步,你可能会为主服务器增加多个从服务器,主服务器响应写操作,从服务器只能响应读操作,对于你的网站来说,用户的读操作要远远的多于写操作 (eg. EC2 RDS MySQL read replicas)
- 为减轻主服务器写压力,增加1台主服务器。增加主服务器确实这样似乎可以把每台主数据库的负载减少一半,但是更新处理会发生冲突(同样的数据在两台服务器同时更新成其他值),可能会造成数据的不一致。为了避免这样的问题,就需要把对每个表的请求分别分配给合适的主数据库来处理
- 当第一种方案仍然难以满足访问量时,你可能会考虑增加一个cache,比如说Memcached,把数据放到读取更快速的内存中,缓解读负载压力。但这是要考虑cache和数据库中数据一致性的问题,保证数据库的更新在很短的时间内反映到cache中
- 尽管读负载压力能缓解,但所有的写操作还是集中在主服务器上,一旦主服务器难以承担写负载压力,就要考虑采用向上扩展的模式,增加主服务器的计算资源;同时,从服务器也要相应的升级。当然,这会花更多的钱(eg. EC2 RDS支持DB instance配置的升级)
- 随后网站更热门,以前运行的很好的join sql 现在突然慢下来。情况变得更糟的话,你不得不停止存储过程, 因为这些存储过程变的很慢无法结束
- 负载持续的增加,更多用户访问网站,你可能删除二级索引,因为管理这个索引负担很大,让数据库变的很慢。然后开始只使用主索引 ,其他不在使用
- 如果几个月后你的负载成数量级的增长,甚至更多呢?下一步干什么呢?
还能做的是将数据进行切分(垂直切分和水平切分),分布到多个节点,但代价是很高的(经验丰富并且很贵的DBAs等),同时可能带来一些问题
- 引入分布式事务:由于关系数据库支持事务,切分可能引入分布式事务,但分布式事务对系统资源消耗大,性能也并不高
跨节点的join和排序操作:尽管能在数据库端解决(Oracle DBlink, MySQL Federated),但可能耗费大量的网络资源。通常推荐在应用层进行数据的整合,这需要应用层做很多额外的工作,也加重了应用服务器的负担
- 很多公司将RDBMS作为技术储备,例如facebook, google都有很大的MySQL集群,而且能很好的承担它们的工作
- RDBMS在一定程度上还是很难扩展的
难以支持高并发读写
- 为保障可用性,数据通常保存副本。
- 关系数据库本质上支持事务,那么就要保证ACID特性中的原子性和一致性,因此数据的更新必须在所有副本间同步,会带来一定的延迟。
- 只有极个别云中的关系数据库也支持读副本(Amazon RDS MySQL),允许副本间数据不一致,但这种副本无法在主副本故障时,替代主副本,仍然需要存在同步备份的副本。
总结:
- 大量数据的写入处理
- 表结构变更及建立索引
- 字段不固定的应用
- 对简单查询需要快速返回结果的处理
2.3. Nosql的优势
- 易于数据的分散
- 提升性能和增大规模
- 模式自由
- 扩展性好
- 。。。
3. NoSQL数据库的种类
存储类型 | 解决方案 | 特点 | -- |
---|---|---|---|
列存储 | Hbase,Cassandra, | 按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。 | 如果翻转数据,列式存储与关系存储将会非常相似。与关系模型存储记录不同,列式存储以流的方式在列中存储所有的数据。对于任何记录,索引都可以快速地获取列上的数据。Map-reduce的实现Hadoop的流数据处理效率非常高,列式存储的优点体现的淋漓极致。因此,HBase和Hypertable通常作为非关系型数据仓库,为Map-reduce进行数据分析提供支持。关系类型的列标对数据分析效果不好,因此,用户经常将更复杂的数据存储在列式数据库中。这直接体现在Cassandra中,它引入的“column family”可以被认为是一个“super-column”。列式存储支持行检索,但这需要从每个列获取匹配的列值,并重新组成行 |
文档存储 | MongoDB,CouchDB | 文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有有机会对某些字段建立索引,实现关系数据库的某些功能。 | 文档存储支持对结构化数据的访问,不同于关系模型的是,文档存储没有强制的架构。事实上,文档存储以封包键值对的方式进行存储。在这种情况下,应用对要检索的封包采取一些约定,或者利用存储引擎的能力将不同的文档划分成不同的集合,以管理数据。与关系模型不同的是,文档存储模型支持嵌套结构。例如,文档存储模型支持XML和JSON文档,字段的“值”又可以嵌套存储其它文档。文档存储模型也支持数组和列值键。与键值存储不同的是,文档存储关心文档的内部结构。这使得存储引擎可以直接支持二级索引,从而允许对任意字段进行高效查询。支持文档嵌套存储的能力,使得查询语言具有搜索嵌套对象的能力,XQuery就是一个例子。MongoDB通过支持在查询中指定JSON字段路径实现类似的功能。 |
key-value存储 | Tokyo Cabinet / Tyrant,Berkeley DB,MemcacheDB,Redis | 可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能) | 键值存储提供了基于键对值的访问方式。键值对可以被创建或删除,与键相关联的值可以被更新。键值存储一般不提供事务处理机制。对不同的编程语言而言,键值存储类似于哈希表。对此,不同的编程语言有不同的名字(如,Java称之为“HashMap”,Perl称之为“hash”,Python称之为“dict”,PHP称之为“associative array” ,C++则称之为“boost::unordered_map<...>” )。键值存储支持键上自有的隐式索引。键值存储看起来好像不太有用,但却可以在“值”上存储大量信息。“值”可以是一个XML文档,一个JSON对象,或者其它任何序列化形式。重要的是,键值存储引擎并不在意“值”的内部结构,它依赖客户端对“值”进行解释和管理 |