40
NOSQL 技技技技 ICT- 技技技 - 技技

NoSQL 技术交流

  • Upload
    gwyn

  • View
    246

  • Download
    0

Embed Size (px)

DESCRIPTION

NoSQL 技术交流. ICT- 存储部 - 马健. 目录. 什么是 NoSQL CAP 理论 NoSQL 解决的问题 NoSQL 的不足 较成熟的 NoSQL 数据库对比 TC/TT MongoDB. 什么是 NoSQL. NoSQL 是一种与关系型数据库管理系统截然不同的数据库管理系统,它的数据存储格式可以是松散的、通常不支持 Join 操作并且易于横向扩展。也可以称之为非关系型数据库。. 关系型数据库. nosql. CAP 理论. Availability 可用性. 某个节点的宕机不会影 响其他节点继续完成操 作. Consistency - PowerPoint PPT Presentation

Citation preview

Page 1: NoSQL 技术交流

NOSQL 技术交流ICT- 存储部 - 马健

Page 2: NoSQL 技术交流

目录

• 什么是 NoSQL• CAP 理论• NoSQL 解决的问题• NoSQL 的不足• 较成熟的 NoSQL 数据库对比• TC/TT• MongoDB

Page 3: NoSQL 技术交流

什么是 NOSQL

• NoSQL 是一种与关系型数据库管理系统截然不同的数据库管理系统,它的数据存储格式可以是松散的、通常不支持Join 操作并且易于横向扩展。也可以称之为非关系型数据库。

Name

Age Gender

Birthday

a 20 M 1990-10-1

b 40 F 1970-8-24

c 30 M 1980-1-18

… … … …

关系型数据库Name : a

Age : 20

Gender : M

Birthday : 1990-10-1

Hobby :travel

Name : b

Age : 40

Birthday : 1970-8-24

Tel : 12345678

Name : c

Age : 30

Gender : M

… … … … …

nosql

Page 4: NoSQL 技术交流

CAP 理论

Availability可用性

Partition Tolerance分区容错性

Consistency一致性

RDBMS NoSQL

数据一致更新,所有数据变动都是同步的 尽管有一些信息丢失,系统依旧继续运转

某个节点的宕机不会影响其他节点继续完成操作

Page 5: NoSQL 技术交流

NOSQL 解决的问题

• 对数据库的高并发读写– Key-Value 型数据库: TC/TT 、 Redis 等

• 对海量数据的高效率存储和访问– 文档型数据库: MongoDB 、 CouchDB

• 数据库的可扩展性– 分布式数据库: Cassandra 、 MongoDB

Page 6: NoSQL 技术交流

NOSQL 的不足没有完美的技术, NoSQL 也存在着它的不足:• NoSQL 的技术架构通常只提供较弱的一致性保障,如最终一致性或者单一数据对象的事务约束。• 绝大多数 NoSQL 只能提供简单的查询,无法进行多表联合查询等复杂的查询操作。• 大部分 NoSQL 的替代品都还处于前 - 生产环境阶段 ,还有大量的关键特性有待实现 .

• 功能相对贫乏, NoSQL 数据库大部分功能集仅仅旨在满足现代的 Web 2.0 应用的需求。在一些要求事务一致性较高、业务逻辑比较复杂或者一些需要复杂分析查询的环境中, NoSQL 难以担当重任。

Page 7: NoSQL 技术交流

较成熟的 NOSQL 数据库对比Redis TC&TT MongoDB Cassandra

数据模型 Key-value Key-value Documents Column-family

Value 尺寸限制 1G 1MB 4MB 2G

功能和特性 •复制:一主多从。 •复制:双主。•多种数据结构。

•M-S 、 Replica-set 。•Shard 集群。•GridFS 。•强大的查询功能。

•分布式集群,可以动态扩展集群节点。•点对点的集群

性能 由于是单纯地键值内存操作,其性能四者中居首位。85000 SETs/second72000 GETs/second

总体性能略逊于Redis 。Insert : 43000/second,Search : 46000/second

结构相比 TC 复杂,所以性能不如 TC 。吞吐量:写 92129 KB/S读 104052 KB/S

单点性能最差,但会随着节点的增长而提升。

成功案例 github , Engine Yard 日本最大的 SNS 网站mixi.jp 。 2000 万数据量、 10000 并发量、双主架构。

Foursquare 、 shutterfly 等

Facebook, digg 等。

应用场景 由于受到物理内存的限制,只适合较小数据量的高性能操作和运算场景。

适用于逻辑关系相对简单,但数据量较大的业务。

主要解决海量数据的存储效率、数据分布和数据扩展等问题。

适用于亿万级数据量,存储于多台的大数据量集群环境。

协议 基于 TCP 的文本协议 memcached protocol 、 HTTP protocol

轻量级的 TCP/IP 写入协议

客户端: socket 协议 集群:Gossip 协议

支持语言 Python , Ruby , Erlang , PHP , Java , C

Perl, Ruby, Java, Python, PHP, Erlang

C 、 Java 、 Perl 、 PHP 、 Python 、 Ruby

C++, Java, Python, PHP, Ruby, Erlang, Perl

不足 不适于较大数据对象的读写,性能下降明显。

TC 的主要缺点是在 TDB的数据量达到上亿级别以后,并发写数据性能会大幅度下降

Shard 集群的稳定性并不是很好:数据的分布和安全性在高负载的情况下无法得到 100% 的保障。

Thrift 端口收到非协议标准的随机数据可能导致Cassandra 崩溃。

Page 8: NoSQL 技术交流

TC/TT

• TC : Tokyo Cabinet 。它其实是一套数据库管理的功能类库。它只将字符串和二进制数据以 Key-value 的形式存储。既没有表的概念,也没有数据类型的概念,数据库的记录都被组织在哈希表、 B+Tree 或者定长数组中。 TC 为不同的应用场景设计了不同的数据库类型。虽然具有很高的性能,但 TC 本身并不支持远程访问。• TT : Tokyo Tyrant 。 TC 的网络接口,为其提供了高并发读写、远程访问以及复制等更丰富的管理功能。支持 Memcached兼容协议,也可以通过 HTTP 协议进行数据交换。• TC/TT 由 C语言编写,为 C 、 Perl 、 Ruby 、 Java均提供了程序接口。

Page 9: NoSQL 技术交流

• 物理层面上, TC 的数据库其实就是包含了以简单的key-value 对为记录的数据文件。

• 逻辑层面上, TC 的数据库相当于 RDBMS 中的表。• 每个数据库都拥有它自己的缓存• TC 提供了一系列的 shell工具来对每个数据库 ( 数据文件 ) 进行创建、读、写、优化等操作。当然你也可以通过程序 API调用相应的方法来实现。

TC 的一些概念

Page 10: NoSQL 技术交流

根据不同的使用场景, TC 提供了几种不同的数据存储方式:• TCHDB 哈希数据库

– tchmgr :http://www.nixway.net/index.php?manitem&mid=2444

• TCBDB B+Tree 数据库– tcbmgr :

http://www.nixway.net/index.php?manitem&mid=2438

• TCFDB 定长数据库– tcfmgr :

http://www.nixway.net/index.php?manitem&mid=2441

• TCTDB 表格数据库– tctmgr :

http://www.nixway.net/index.php?manitem&mid=2449

• TCMDB 内存哈希数据库• TCNDB 内存 B+Tree 数据库

TC 的几种数据引擎

Page 11: NoSQL 技术交流

TC 的几种数据引擎 - TCHDB

• 在哈希表数据库中,每个 key必须是唯一的。它提供了遍历访问的功能,但其中的数据是无序的。性能仅次于 FDB 。• TC 通过读取内存中的 bucket array来提升访问速度,这里的 bucket array 实际上就是 TC 为某个数据库设置的缓存,它存放了映射到内存中的全部 / 部分数据文件的数据。• 哈希值冲突由 separate chaining策略来管理。• TC 在存入数据时,除了传统的 insert和 replace ,还提供了 concatenate模式。

Page 12: NoSQL 技术交流

TC 的几种数据引擎 - TCBDB• 与 TCHDB 不同, B+ Tree 数据库的key 可以是重复的。它的数据是排序并排列在逻辑页中的,所以除了拥有 TCHDB的基本功能以外,它还可以根据用户的需求对数据进行排序。• 由于每个逻辑页都被安排成双向链表,所以可以通过游标按某种顺序访问每一条记录,也可以跳到某一个指定的 key 的位置。基于这个特性,实现了字符串的正向匹配和数字的范围查询。• BDB 中的数据页是可以被压缩的,支持ZLIB 和 BZIP2两种方法。

Page 13: NoSQL 技术交流

TC 的几种数据引擎 - TCFDB

• 在定长数组数据库中,每条记录都被给予唯一的自然数作为它的 key ,而这些记录 (Value) 的长度是被限制死的。整个数据库可被看做是一个数组。 FDB 提供了和 HDB 同样的功能。• 因为 FDB 所有的数据都会作为一个多维数组通过mmap映射到内存中,最小化文件 I/O ,所以只要在满足限制的情况下, FDB 的性能在这几种数据库中是最好的。• 数据库的大小和所定义的 key范围和value 大小成正比。 Key范围越小、 value size越小,空间效能就越高。

Page 14: NoSQL 技术交流

TC 的几种数据引擎 - TCTDB• TCTDB 是 TCHDB 的一个变种,每条记录都由主键来识别,并且拥有一组被命名的字段。虽然数据结构可以是松散的,但是依然可以通过索引来加速一些相对复杂的查询。它既具备了 Key-Value 数据库的高效读写性能,又具备了MySQL 单表能实现的一些功能,即:SELECT …. FROM table WHERE …. ORDER BY …. LIMIT xxx,xxx

•支持字符串的完全匹配、正向匹配、正则表达式匹配等。支持数值型的完全匹配和范围匹配。•支持标签搜索和全文搜索•支持多条件查询、 UNION 、正反向排序。

Page 15: NoSQL 技术交流

TC 的使用示例http://fallabs.com/tokyocabinet/

Page 16: NoSQL 技术交流

MONGODB

• MongoDB官方给自己的定义是 Key-value 存储 ( 高性能和高扩展 ) 和传统 RDBMS(丰富的查询和功能 ) 之间的一座桥梁。• 功能: MongoDB 所提供的查询和各种功能在 NoSQL 产品中的确是佼佼者,如 GridFS 提供了文件存储功能、 Map/Reduce 的数据聚合操作为分布式系统的高性能读写提供了技术基础、分布式的动态 sharding 集群提供了高可扩展性、 Replica-set 的投票和复制机制又提供了高可用性……• 性能:丰富的功能无疑带来的就是性能的下降,它无法像 TC/TT一样达到如此高的性能指标,但它的性能依然可以达到 MySQL的 17倍。

Page 17: NoSQL 技术交流

• MongoDB 的最小存储单位就是文档对象,数据在 Mongo 中以BSON( Binary-JSON)文档的格式存储在磁盘上。每一个文档对象, MongoDB 都会为它分配一个唯一的 id号,名为“ _id” 。如果硬要和关系型数据库扯上关系,你可以把文档视作关系型数据库中的行。

• 下图描述了一个最简单的 Mongo document :

MONGODB - DOCUMENT

{ _id : ObjectId( “xxxxxxxx" ) , name : "majian", gender : "M", address : "Beijing"}

如果不显式创建_id , mongo 会自动创建并为它分配一个唯一的值,作为该文档对象的唯一标识。

Page 18: NoSQL 技术交流

• 跟一般的 key-value 数据库不一样的是,它的 value 中存储了结构信息,所以它提供了嵌入式的文档结构。

MONGODB - DOCUMENT

{ _id : ObjectId( “xxxxxxx" ) , name : "majian", gender : "M", address : "Beijing", score :     }

[ Chinese : "60", English : "50"]

Page 19: NoSQL 技术交流

• Collection就是 documents 的集合,可以理解为关系型数据库中的表,也可以看成一个文件夹,用来专门储存同一类文档。

MONGODB - COLLECTION

COLLECTION_____________document__document__document__document_

Page 20: NoSQL 技术交流

• MongoDB 的最外层结构,和关系型数据库一样,是存放多个 Collections 的容器。• 可以把MongoDB看成一个文件仓库,每个

document就如同一页纸;成千上万张纸被存放在文件夹里,这些文件夹就可以看做是 Collection;多个文件夹存放在一个储藏柜里,也就是 Database 。

MONGODB - DATABASE

Document Collection Database

Page 21: NoSQL 技术交流

MONGODB – GRIDFS

物理文件 文件切分元数据

二进制数据

id : ObjectId("xxxxx"), filename : "file",chunkSize : 262144, uploadDate : "xxx",md5 : "xxx", length : 668734007

_id : ObjectId("yyyyy"),files_id : ObjectId("xxxxx"),n : chunk_number,data : data_binary,

Page 22: NoSQL 技术交流

MONGODB – GRIDFS 性能 针对物理文件的存储,我们对 MySQL 和 MongoDB做了一次性能对比,下面的图标反映了二者对于存储 3MB物理文件的性能差异。

并发 MySQL MongoDB耗时 吞吐量 耗时 吞吐量

1 1.63 2004 0.57 567750 34.9 4682 2.24 72928

100 76 4300 4.08 79981150 126 3891 6.87 71340200 175.32 3728 6.93 94309250 233.46 3500 20.27 40304300 251.1 3905 18.01 54442350 481.93 2374 37.04 30879400 686.41 1905 24.05 54341450 1126.32 1306 41.33 35585500 1325.87 1233 178.32 9164

Page 23: NoSQL 技术交流

• db.users.find({'last_name': 'Smith'}) – Select * from users where last_name=‘Smith’;

• db.users.find({last_name: 'Smith'}, {'ssn': 1}); – Select ssn from users where last_name=‘Smith’;

• db.users.find().skip(20).limit(10);– Select * from users limit 20,10;

• db.things.find({j:{$nin: [2,4,6]}}); – Select * from things where j is not in (2,4,6);

• db.address.distinct( "zip-code" , { age : 30 } )– Select distinct zip-code from address where age=30;

• <, <=, >, >=, $all, $exists, $mod, $ne, $in, $nin, $nor, $or, $size, $type 等操作符。

• 游标方法: count(), limit(), skip(), snapshot(), sort()

MONGODB – 数据查询 http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7Bcount%28%29%7D%7D

Page 24: NoSQL 技术交流

• MongoDB 是非关系型数据库,不支持 join 操作 ( 无法 select a.*,b.* from a,b where a.id=b.id; 也无法 select cols from a, b where a.id=b.id;) 。但是可以通过 References 的方式去实现两个document 之间的关联查询。

MONGODB –REFERENCES

> p = db.postings.findOne({title:'Brewing Methods'});{

"_id" : ObjectId("4b866f08234ae01d21d89604"),"author" : "jim","title" : "Brewing Methods"

}> db.users.find( { _id : p.author } ){ "_id" : "jim", "email" : "[email protected]" }

Page 25: NoSQL 技术交流

• 利用 MongoDB 提供的函数 connect() 可以为我们的查询提供更丰富的功能:通过它,你可以进行跨实例的查询:• 假设我们在两个服务器 sv1 和 sv2上各跑一个 mongod , sv1上建 db1 数据库,

sv2上建 db2 数据库,分别创建数据如下:

• 现在要知道 pencil这个物品的拥有者的详细信息,假设我们正在连接 sv1 ,具体实现方法如下:

MONGODB – 跨库跨实例查询

> use db1switched to db db1> db.person.save({name:'xiaoming',job:'student',age:'18',address:'Beijing'}) db.person.save({name:'qiangqiang',job:'Teacher',age:'28',address:'Kunming'})> use db2switched to db db2> db.stuff.save({item:'pencil',owner:'xiaoming'}) > db.stuff.save({item:'table',owner:'qiangqiang'})

> conn = connect("sv2:27017/db2")connecting to: sv2:27017/db2db2> res = conn.stuff.findOne({item:'pencil'}){ "_id" : ObjectId("4c93720a859fbb4e384da194"), "item" : "pencil", "owner" : "xiaoming"}> db.person.findOne({name:res.owner}){ "_id" : ObjectId("4c93775d1d031ab611413187"), "name" : "xiaoming", "job" : "student", "age" : "18", "address" : "Beijing"}

Page 26: NoSQL 技术交流

• MapReduce 是一种编程模式,也是一种处理和生成大型数据集的联合运算方式。 MongoDB使用这个技术去实现对单个实例和 sharding 集群中的数据聚合操作,数据库会自动生成临时的 collection来保存这些结果集, 当关闭连接时,这些临时的 collection 会自动被删除。在 sharding 集群中, map/reduce方法会让查询平行地在每个 shard上面执行,最终返回混合后的结果。

MONGODB –MAP/REDUCEhttp://www.mongodb.org/display/DOCS/MapReduce

Page 27: NoSQL 技术交流

MONGODB – 缓存

• 不存在操作系统缓存和数据库缓存之间的冗余,它们是一样的。• 不需要人为修改设置, MongoDB 会自动使用系统剩余的所有内存作为 cache 。• 缓存动作,如 LRU 等页操作等,都由操作系统来控制。

MongoDB采用的是内存映像存储引擎,它通过内存映像文件进行全部的磁盘 I/O 操作。这样使MongoDB具有如下特性:

Page 28: NoSQL 技术交流

• MongoDB 的 shard 集群支持数据的自动切分和平衡分布。• 数据的分布会根据节点的数据变动而自动迁移,这让数据库的扩展变得很容易;而且,数据分布在多个

shard 节点也打散了读写压力,提供了高并发高负载的解决方案。• 每个 shard 节点都可以由一个 replica-set 高可用架构组成,也就是说实现了自动的故障恢复功能,避免了单点故障。• Shard 集群由以下几个关键点组成: Shard keys 、

Chunks 、 Shard nodes 、 Congfigure servers 、Routine servers

MONGODB – SHARD 集群

Page 29: NoSQL 技术交流

MONGODB 集群 – 架构图

Configure serversc1 mongod

c2 mongod

c3 mongod

mongodmongo

dmongod

Shard 3

Replica-set

mongos

mongos …

client …

mongod

Shard 1

mongod

Shard 2

Page 30: NoSQL 技术交流

MONGODB 集群 – SHARD KEYS

• 当要将一个 Collection 进行分割的时候,需要指定一个 shard key 。 shard key 和索引 key 有些相像,它定义了在分布存储数据时,这一个或几个字段值的上限。这样,相邻的数据都会存储在满足 key 值范围的节点上。 mongodb 的 shard key 是需要你提前预设的,在 congfig 数据库中,你可以找到所有 shard key 的元数据。

Page 31: NoSQL 技术交流

• chunks指的是在某一个 collection 中的一系列相邻的数据。可以从三方面去描述它: collection 、 minkey 、 maxkey 。假设一个document 的 shard key 是 K ,那么只有当 minkey <= K < maxkey 的时候,这个 document才会被分配到这个 chunk 中来。

• 假如,一个 chunk 的最大 size 是 200M ,当超过这个值时,它会分裂出两个 100M 的 chunk来,当一个 shard 节点存储了过多的数据时,那么一些 chunks将被迁移到其他的 shard 节点上。(新加入节点也会引起 chunk 的迁移)

MONGODB 集群 – CHUNKS

Page 32: NoSQL 技术交流

MONGODB 集群 – SHARD NODES

• 每一个 shard 都是由一个或者多个存储着数据的 mongod server组成的。对于生产环境而言,它可以由 replica-set来组成,以提供高可用性,保证无单点故障。mongodb shard 集群需要至少两个的 shard 节点。

• replica-set 基于异步的 replication 技术,由几台( 2-7) replication 的节点组成。在集群初始化时,集群的几个节点会进行投票,决定谁做master ,其余的作为 slave去复制写入 master 的数据。一个 replica-set 中只有 master 是可写的,保证了数据的一致性。当一个 master 宕掉的时候,内部的投票机制会重新选举出一个新的 master出来提供服务。当原来宕掉的节点恢复的时候,只要启动mongd 进程(带有 replica-set 相应参数)就可以自动地加入集群,并且作为一个 slave去提供备障和分摊读压力(可选项)。

vote votevote

Page 33: NoSQL 技术交流

• Config server 的 config 库中存储了集群的元数据,包括每个 shard server 和 chunks 的基本信息。当然,主要的还是 chunks 的信息。每个 config server 完全地拷贝了所有 chunks 的信息。

• 当任何一个 Config server 宕掉的时候,那么这些元数据都将变为只读,但是这并不影响数据节点的读写操作。 mongodb shard 集群需要至少一个 config server 。

MONGODB 集群 – CONFIG SERVER

> use configswitched to db config> show collectionschunkscollectionsdatabaseslockpingslocksmongossettingsshardssystem.indexesVersion

Page 34: NoSQL 技术交流

• 你可以把mongos程序看做是一个路由,它可以使各种不同的组件一起协同工作,看起来就像是一个单独的系统,这有点像mysql 的 proxy 。当客户端发送一条查询, mongos 会依据 config server 的信息,把这条查询分配到相应的 shard 节点上,再将查询结果整合起来,一起返回客户端。你可以开启任意数量的mongos 对外提供服务。

MONGODB 集群 – ROUTINE SERVER

Page 35: NoSQL 技术交流

概述

Page 36: NoSQL 技术交流
Page 37: NoSQL 技术交流

00

01 521-9655

02 521-1234

03

… …

13

14 521-8976

15

… …

00

01 521-9655

02 521-1234

03

… …

13

14 521-8976

15

… …

00

01 521-9655

02 521-1234

03

… …

13

14 521-8976

15

… …

00

01 521-9655

02 521-1234

03

… …

13

14 521-8976

15

… …

Key ValueTom 521-1234

Jerry 521-8976

… …

Smith 521-9655

… …

HASH TABLE

Tom

Jerry

Smith

Hash Function

http://en.wikipedia.org/wiki/Hash_table

Page 38: NoSQL 技术交流

SEPARATE CHAINING

•在 separate chaining策略中,每一个 bucket array 的插槽都是一个指向链表的指针。每个链表包含了所有 hash 到同一个值的 key 的 key-value对。•查找操作需要去扫描这个列表中和给出的 key 相对应的条目。•插入操作需要在这个列表的结尾处增加新的条目。•删除则需要找到并且从列表中移除这个条目。

Page 39: NoSQL 技术交流

B+TREE

Key Value1 d1

2 d2

3 d3

4 d4

5 d5

6 d6

7 d7

内部节点存储 key叶节点存储数据

主干

分枝

Page 40: NoSQL 技术交流

双向链表是一种数据记录集被连接起来的数据结构。每条记录都包含了两个连接字段,里面包含了对序列中前一条和后面一条的记录的引用。它可以被视为同一数据对象的两个方向相反的单向链表。双向链表

单向链表

DOUBLY-LINKED LIST

连接字段中存储的引用通常是指针;但也可能是目标所在地址的偏移值或数组中的索引。