储备知识
传统数据库
传统的数据库管理系统把所有数据都放在磁盘上进行管理,所以称做磁盘数据库(DRDB:Disk-Resident Database)。磁盘数据库需要频繁地访问磁盘来进行数据的操作,由于对磁盘读写数据的操作一方面要进行磁头 的机械移动,另一方面受到系统调用(通常通过 CPU 中断完成,受到 CPU 时钟周期的制约)时间的影响,当数 据量很大,操作频繁且复杂时,就会暴露出很多问题。
近年来,内存容量不断提高,价格不断下跌,操作系统已经可以支持更大的地址空间(计算机进入了 64 位 时代),同时对数据库系统实时响应能力要求日益提高,充分利用内存技术提升数据库性能成为一个热点。
内存数据库
在数据库技术中,目前主要有两种方法来使用大量的内存。一种是在传统的数据库中,增大缓冲池,将一个事务所涉及的数据都放在缓冲池中,组织成相应的数据结构来进行查询和更新处理,也就是常说的共享内存技术, 这种方法优化的主要目标是最小化磁盘访问。另一种就是内存数据库(MMDB:Main Memory Database,也叫主存 数据库)技术,就是干脆重新设计一种数据库管理系统,对查询处理、并发控制与恢复的算法和数据结构进行重 新设计,以更有效地使用 CPU 周期和内存,这种技术近乎把整个数据库放进内存中,因而会产生一些根本性的 变化。
内存数据库系统带来的优越性能不仅仅在于对内存读写比对磁盘读写快上,更重要的是,从根本上抛弃了磁 盘数据管理的许多传统方式,基于全部数据都在内存中管理进行了新的体系结构的设计,并且在数据缓存、快速 算法、并行操作方面也进行了相应的改进,从而使数据处理速度一般比传统数据库的数据处理速度快很多,一般都在 10 倍以上,理想情况甚至可以达到 1000 倍。
而使用共享内存技术的实时系统和使用内存数据库相比有很多不足,由于优化的目标仍然集中在最小化磁盘 访问上,很难满足完整的数据库管理的要求,设计的非标准化和软件的专用性造成可伸缩性、可用性和系统的效 率都非常低,对于快速部署和简化维护都是不利的。
内存数据库历史和发展
雏形期
从上个世纪 60 年代末到 80 年代初。在这个时期中,出现了主存数据库的雏形。1969 年 IBM 公司研制了世 界上最早的数据库管理系统——基于层次模型的数据库管理系统 IMS,并作为商品化软件投入市场。在设计 IMS 时,IBM 考虑到基于内存的数据管理方法,相应推出了 IMS/VS Fast Path。Fast Path 是一个支持内存驻留数据的商 业化数据库,但它同时也可以很好地支持磁盘驻留数据。在这个产品中体现了主存数据库的主要设计思想,也就 是将需要频繁访问,要求高响应速度的数据直接存放在物理内存中访问和管理。在这个阶段中,包括网状数据库、 关系数据库等其他各种数据库技术也都逐渐成型。
技术理论成熟期
1984 年,DJ DeWitt 等人发表了《主存数据库系统的实现技术》一文。第一次提出了 Main Memory Database (主存数据库)的概念。预言当时异常昂贵的计算机主存价格一定会下降,用户有可能将大容量的数据库全部保 存在主存中,提出了 AVL 树、哈希算法、主存数据库恢复机制等主存数据库技术的关键理论,为主存数据库的发 展指出了明确的方向 。 1984 年,D J DeWitt 等人提出使用非易逝内存或预提交和成组提交技术作为主存数据库的提交处理方案,使 用指针实现主存数据库的存取访问。 1985 年,IBM 推出了 IBM 370 上运行的 OBE 主存数据库。 1986 年,RB Hagman 提出了使用检查点技术实现主存数据库的恢复机制。威斯康星大学提出了按区双向锁 定模式解决主存数据库中的并发控制问题。并设计出 MM-DBMS 主存数据库。贝尔实验室推出了 DALI 主存数据 库模型。1987 年,ACM SIGMOD 会议中提出了以堆文件(HEAP FILE)作为主存数据库的数据存储结构。Southern Methodist 大学设计出 MARS 主存数据库模型。 1988 年普林斯顿大学设计出 TPK 主存数据库。 1990 年普林斯顿大学又设计出 System M 主存数据库。
产品发展期和市场成长期
随着互联网的发展,越来越多的网络应用系统需要能够支持大用户量并发访问、高响应速度的的数据库系统, 主存数据库市场成熟 半导体技术快速发展,半导体内存大规模生产,动态随机存取存储器(DRAM)的容量越来越大,而价格越 来越低,这无疑为计算机内存的不断扩大提供了硬件基础,使得主存数据库的技术可行性逐步成熟
1994 年美国 OSE 公司推出了第一个商业化的,开始实际应用的主存数据库产品 Polyhedra
1998 年德国 SoftwareAG 推出了 Tamino Database。
1999 年日本 UBIT 会社开发出 XDB 主存数据库产品。韩国 Altibase 推出 Altibase。
2000 年奥地利的 QuiLogic 公司推出了 SQL-IMDB。
2001 年美国 McObject 推出 eXtremeDB。加拿大 Empress 公司推出 EmpressDB。
4、 几种主存技术应用的比较
第一代:用户定制的主存数据库。通过应用程序来管理内存和数据;不支持 SQL 语句, 不提供本地存储, 没有数 据库恢复技术;性能好但很难维护和在别的应用中不能使用;应用在实时领域比如工厂自动化生产。
第二代:简单功能的内存数据库。能够快速处理简单的查询;支持部分的 SQL 语句和简单的恢复技术;主要目 的是能够快速处理大量事务;针对简单事务处理领域,尤其是交换机, 移动通信等。
第三代:通用的主存数据库。针对传统的商业关系型数据库领域,能够提供更高的性能、通用性以及稳定性;提 供不同的接口来处理复杂的 SQL 语句和满足不同的应用领域;可以应用在计费、电子商务、在线安全领域,几乎 包括磁盘数据库的所有应用领域。
常用的缓存数据库比较
memcached
Memcached 是一个自由开源的,高性能,分布式内存对象缓存系统。 Memcached 是以 LiveJournal 旗下 Danga Interactive 公司的 Brad Fitzpatric 为首开发的一款软件。现在已成为 mixi、hatena、Facebook、Vox、LiveJournal 等众多服务中提高 Web 应用扩展性的重要因素。 Memcached 是一种基于内存的 key-value 存储,用来存储小块的任意数据(字符串、对象)。这些数据可以 是数据库调用、API 调用或者是页面渲染的结果。 Memcached 简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。 它的 API 兼容大部分流行的开发语言。 本质上,它是一个简洁的 key-value 存储系统。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 应用的速度、提高 可扩展性
优点:高性能读写、单一数据类型、支持客户端式分布式集群、一致性 hash 多核结构、多线程读写性能高。
缺点:无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨机房数据同步困难、架构扩容复 杂度高。
Redis
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统。 Redis 是一个开源的使用 C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、 Key-Value 数据库,并提供多种语言的 API。 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
优点:高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分布式分片集 群、单线程读写性能极高。
缺点:不支持多线程读写,相比 Memcached 会慢。
MongoDB
优点;更类似 MySQL,支持字段索引、游标操作,其优势在于查询功能比较强大,擅长查询 JSON 数据,能存储海量数据
缺点:但是不支持事务
Tair
Tair 是由淘宝网自主开发的 Key/Value 结构数据存储系统,在淘宝网有着大规模的应用。您在登录淘宝、查看商品详情页面或者在淘江湖和好友“捣浆糊”的时候,都在直接或间接地和 Tair 交互。 Tair 是一个 Key/Value 结构数据的解决方案,它默认支持基于内存和文件的两种存储方式,分别和我们通常 所说的缓存和持久化存储对应。 Tair 除了普通 Key/Value 系统提供的功能,比如 get、put、delete 以及批量接口外,还有一些附加的实用功能, 使得其有更广的适用场景。
优点:高性能读写、支持三种存储引擎(ddb、rdb、ldb)、支持高可用、支持分布式分片集群、支撑了几 乎所有淘宝业务的缓存。
缺点:单机情况下,读写性能较其他两种产品较慢。
三种数据库测试对比:
当各缓存的数据库空时,以单线程通过各缓存客户端set调用向服务端推送数据,比较10000操作所消耗的时间,以上动作通过使用不同大小的单个缓存对象重复三次。
在场景一完成的情况下,以单线程通过各缓存客户端get调用向服务端获取数据,比较10000操作所消耗的时间,以上动作通过使用不同大小的单个缓存对象重复三次。
在场景一完成的情况下,缓存服务器有数据,并发1000个线程通过缓存软件的客户set调用向服务端推送数据,每个线程完成10000次的操作,比较各服务器的tps大小,以上动作通过使用不同大小的单个缓存对象重复三次。
在场景三完成的情况下,缓存服务器有数据,并发1000个线程通过缓存软件的客户get调用向服务端获取数据,每个线程完成10000次的操作,比较各服务器的tps大小,以上动作通过使用不同的key取不同大小的数据,重复三次。
测试结果
Memcached:多核的缓存服务,更加适合于多用户并发访问次数(访问次数较少的应用场景)。
Redis:单核缓存服务,在单节点情况下,更加适合少量用户,多次访问的应用场景。
企业级缓存中间件 Redis
Redis 是一款开源的,C 语言编写的,高级键值(key-value)缓存和支持永久存储 NoSQL 数据库产品。Redis 采用内存(In-Memory)数据集(DataSet) 。支持多种数据类型。运行于大多数 POSIX 系统,如 Linux、*BSD、OSX 等。
软件特性
透明性:分布式系统对用户来说是透明的,一个分布式系统在用户面前的表现就像一个传统的单处理机分时 系统,可让用户不必了解内部结构就可以使用。
扩展性:分布式系统的最大特点就是可扩展性,他可以根据需求的增加而扩展,可以通过横向扩展使集群的 整体性能得到线性提升,也可以通过纵向扩展单台服务器的性能使服务器集群的性能得到提升。
可靠性:分布式系统不允许单点失效的问题存在,它的基本思想是:如果一台服务器坏了,其他服务器接替 它的工作,具有持续服务的特性。
高性能:高性能是人们设计分布式系统的一个初衷,如果建立了一个透明,灵活,可靠的分布式系统,但他 运行起来像蜗牛一样慢,那这个系统就是失败的
Redis 的常用功能
-
高速读写:Redis 在运行时,将数据放在内存当中,利用内存的高性能的特性提高自己的服务性能。
-
数据类型丰富:Redis 具有丰富的数据类型,可以适用于各种场景。
-
支持持久化:因为 Redis 的数据是放在内存当中的,当 Redis 关机或者内存失效时,数据随即丢失,不可找 回,为了避免 Redis 重启时发生类似于雪崩事件,所以 Redis 官方增加了一个数据持久化的功能。
-
多种内存分配及回收策略:Redis 可以通过 maxmemory 参数来限制最大可用内存,主要为了避免 Redis 内 存超过操作系统内存,从而导致服务器响应变慢甚至死机的情况。而回收策略主要是删除过期的 key 以及内 存达到 maxmemory 后的淘汰机制。
-
支持事物:Redis 也支持类似于 MySQL 数据库那样的事务。
-
消息队列、消息订阅: Redis 的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易的实现 一个高性能的优先队列。同时在更高层面上,Redis 还支持"发布/订阅"的消息模式,可以基于此构建一个聊 天系统。
-
支持高可用:Redis 支持两种高可用集群方式。