你想问李飞飞什么问题?
数据库的操作对于我们 Web 应用开发尤其重要,关于数据库的性能,这并不只是 DBA 才需要担心的事,而这更是我们程序员需要去关注的事情。当我们去设计数据库表结构,对操作数据库时(尤其是查表时的 SQL 语句)下面是我总结的关于市面上主流的关系型数据库和非关系型数据库的简介。
一、关系型数据库
1. MySQL 数据库
MySQL 是最受欢迎的开源 SQL 数据库管理系统,它由 MySQL AB 开发、发布和支持。MySQL AB 是一家基于 MySQL 开发人员的商业公司,它是一家使用了一种成功的商业模式来结合开源价值和方法论的第二代开源公司。MySQL 是 MySQL AB 的注册商标。
MySQL 是一个快速的、多线程、多用户和健壮的 SQL 数据库服务器。MySQL 服务器支持关键任务、重负载生产系统的使用,也可以将它嵌入到一个大配置 (mass- deployed) 的软件中去。
定位:
开源、多平台、关系型数据库
目前使用最广泛、流行度最高的的开源数据库。
特点:
(1) 支持事务,符合关系型数据库原理,符合 ACID,支持多数 SQL 规范,以二维表方式组织数据,有插件式存储引擎,支持多种存储引擎格式
(2) 用编译安装的方式,或者二进制包的方式,按照 “安装软件 - 创建实例 - 库表用户初始化”,可以很快完成数据库部署
(3) 使用标准的 SQL 语句进行数据库管理,简单 SQL 语句的并发和性能较好,对视图、存储过程、函数、触发器等支持的不是太好
(4) 在命令行界面有一些常用的命令显示状态和性能,在图形界面方面,有比较多的开源监控工具来监控和记录数据库的状态,比如 zabbix,nagios,cacti,lepus 等
(5) 逻辑备份 mysqldump/mysqldumper ,物理备份 用 xtrabackup 等工具进行备份;
(6)MySQL 高可用有多种方案,官方有基础的 master-slave 主从复制,新版本的 innodb cluster,第三方的有 MHA 等高可用方案;
(7)MySQL 水平拆分,可以通过水平拆分 proxy 中间进行逻辑映射和拆分,扩大 MySQL 数据库的并发能力和吞吐量。
适用场景:
默认的 innodb 存储引擎,支持高并发,简单的绝大部分 OLTP 场景;
Tokudb 存储引擎,使用高并发 insert 的场景;
Inforbright 存储引擎,可以进行列压缩和 OLAP 统计查询场景;
选择注意:
使用 MySQL 进行 OLTP 业务时,需要注意数据量级,如果数据量级过大,需要进行水平拆分;
如果有 OLAP 需求,可以结合其他架构综合考虑。
2. Microsoft SQL Server 数据库
SQL Server 是由微软开发的数据库管理系统,是 Web 上最流行的用于存储数据的数据库,它已广泛用于电子商务、银行、保险、电力等与数据库有关的行业。
目前最新版本是 SQL Server 2005,它只能在 Windows 上运行,操作系统的系统稳定性对数据库十分重要。并行实施和共存模型并不成熟,很难处理日益增多的用户数和数据卷,伸缩性有限。
SQL Server 提供了众多的 Web 和电子商务功能,如对 XML 和 Internet 标准的丰富支持,通过 Web 对数据进行轻松安全的访问,具有强大的、灵活的、基于 Web 的和安全的应用程序管理等。而且,由于其易操作性及其友好的操作界面,深受广大用户的喜爱。
定位:
商业、Windows 平台、关系型数据库
最早接触、与微软体系结合紧密的的商业数据库,属于 “微软技术体系”
特点:
(1) 支持事务,符合关系型数据库原理,符合 ACID,支持多数 SQL 规范,以二维表方式组织数据
(2) 在 Windows 平台,用图形界面进行软件安装;
使用:在 Windows 平台,使用 SQL Server Mangement Studio 图形界面进行安装;
(3) 一般通过 Windows 资源管理和 SQL server 图形工具进行系统和数据库性能显示;
(4) 通常用第三方备份恢复软件进行备份恢复;
高可用:通过共享存储和双机热备的方式,可以实现 SQL Server 数据库的高可用;
(5) SQL Server 数据库集群采用共存存储的方式,通过硬件垂直升级来对数据库集群进行扩展;
适用场景:
大多数 OLTP 场景(与微软体系配合)
选择注意:
SQL Server 与微软技术体系结合比较紧密,绝大多数工作,都是通过图形界面完成,对于习惯使用命令行的 DBA 可能会有不习惯;
SQL server 对双引号,大小写,元信息的管理和处理方式,与其他数据库很不相同,需要注意;
使用 SQL Server 满足 OLTP 业务,会有比较好的效果,但对于大数据量的 OLAP 业务,最好还是选用专门的 OLAP 架构,不要在同一个 SQL Server 实例上混用 OLTP 和 OLAP 业务;
SQL server 属于商业软件,需要注意版权和 licence 授权费用;
3. Oracle 数据库
Oracle Database,又名 Oracle RDBMS,或简称 Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说 Oracle 数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的 适应高吞吐量的数据库解决方案。
定位:
商业、多平台、关系型数据库
功能最强大、最复杂、市场占比最高的商业数据库
特点:
(1) 支持事务,符合关系型数据库原理,符合 ACID,支持多数 SQL 规范,以二维表方式组织数据
(2)Oracle 单实例数据库部署相对容易,但 Oracle RAC 集群环境,部署的步骤和依赖条件都比较多;
(3) 通常使用命令行工具,进行各种数据库的管理,通常也可以用 shell 脚本和 python 脚本提高 Oracle 数据库管理效率;各种管理功能,都比较强大;
(4)Oracle 官方有比较全面的监控工具,常用的第三方监控平台,如 zabbix,cacti,lepus 等都有对 Oracle 数据库的各项指标的完善监控;
(5) 支持冷备份和热备份,可以用 exp/imp , expdp/impdp 等进行逻辑备份和恢复,可以使用强大的 RMAN 工具进行专业的物理热备份和恢复;
(6)Oracle 数据库的高可用架构,可以用第三方双机热备软件,结合 Oracle 单实例实现;可以使用 Oracle Dataguard,实现 master 和 standby 的备份;可以使用 Oracle RAC 集群实现实例级别的高可用和负载均衡,使用 ASM 实现存储级别的高可用;
(7) 由于 Oracle 集群采用共享存储的方式,一般只能通过垂直硬件升级进行升级;
适用场景:
绝大多数 OLTP 场景,部分 OLAP
选择注意:
Oracle 从架构到运维,可以说是最难的数据库,学习和使用难度较高。
4. Postgresql 数据库
PostgreSQL 是以加州大学伯克利分校计算机系开发的 POSTGRES,现在已经更名为 PostgreSQL,版本 4.2 为基础的对象关系型数据库管理系统(ORDBMS)。PostgreSQL 支持大部分 SQL 标准并且提供了许多其他现代特性:复杂查询、外键、触发器、视图、事务完整性、MVCC。同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新的数据类型、函数、操作符、聚集函数、索引。免费使用、修改、和分发 PostgreSQL,不管是私用、商用、还是学术研究使用。
PostgreSQL 是一个免费的对象 - 关系数据库服务器 (数据库管理系统),它在灵活的 BSD - 风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server) 之外的另一种选择。
定位:
开源、多平台、关系型数据库,功能最强大的开源数据库。
特点:
(1) 支持事务,符合关系型数据库原理,符合 ACID,支持多数 SQL 规范,以二维表方式组织数据;
(2)postgresql 需要先准备好 Python 等环境,然后编译安装软件,初始化数据库,启动实例,整个部署过程相对比较清晰;
(3)postgresql 数据库可以使用命令行方式进行管理,也可以通过 pgadmin 图形工具进行管理;各种管理功能,都比较强大;
(4) 可以在命令行中查看各种性能视图和状态视图;相对其他其他数据库,并没有太好的图形监控工具和平台;
(5) 支持冷备份和热备份,可以用 COPY 命令进行逻辑导出和导入;用 pgdump 和 pgrestore 进行物理备份和恢复;
(6)postgresql 官方支持 master-standby 复制;也可以用 Slony-I 第三方组件进行数据库同步;
(7)postgresql 可以通过修改源码实现的 postgres-XC 实现水平扩展;
适用场景:
绝大多数 OLTP 场景,部分 OLAP
适合目前互联网需要的一些信息,比如地理位置信息处理;
以 postgresql 作为底层数据库的 greenplum 数据仓库,是主流的 MPP 数据仓库;
基于 postgresql 的 TimeScaleDB,是目前比较火的时序数据库之一;
选择注意:
Postgresql 的架构、使用难度、功能性介于 Oracle 数据库和 MySQL 数据库之间,但因其开源的推动,各方面也有不错的发展;
Postgresql 目前还没有比较主流和好用的监控平台,这是 postgresql 数据库目前存在的一个不足。
5. Sybase 数据库
美国 Sybase 公司研制的一种关系型数据库系统,是一种典型的 UNIX 或 WindowsNT 平台上客户机 / 服务器环境下的大型数据库系统。
Sybase 提供了一套应用程序编程接口和库,可以与非 Sybase 数据源及服务器集成,允许在多个数据库之间复制数据,适于创建多层应用。系统具有完备的触发器、存储过程、规则以及完整性定义,支持优化查询,具有较好的数据安全性。
Sybase 通常与 SybaseSQLAnywhere 用于客户机 / 服务器环境,前者作为服务器数据库,后者为客户机数据库,采用该公司研制的 PowerBuilder 为开发工具,在我国大中型系统中具有广泛的应用。
6. DB2 数据库
DB2 主要应用于大型应用系统,具有较好的可伸缩性,可支持从大型机到单用户环境,应用于所有常见的服务器操作系统平台下。
DB2 提供了高层次的数据利用性、完整性、安全性、可恢复性,以及小规模到大规模应用程序的执行能力,具有与平台无关的基本功能和 SQL 命令。
DB2 采用了数据分级技术,能够使大型机数据很方便地下载到 LAN 数据库服务器,使得客户机 / 服务器用户和基于 LAN 的应用程序可以访问大型机数据,并使数据库本地化及远程连接透明化。
DB2 以拥有一个非常完备的查询优化器而著称,其外部连接改善了查询性能,并支持多任务并行查询。 DB2 具有很好的网络支持能力,每个子系统可以连接十几万个分布式用户,可同时激活上千个活动线程,对大型分布式应用系统尤为适用。
7. Access 数据库
Microsoft Office Access 是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是 Microsoft Office 的系统程序之一。
Microsoft Office Access 是微软把数据库引擎的图形用户界面和软件开发工具结合在一起的一个数据库管理系统。它是微软 OFFICE 的一个成员, 在包括专业版和更高版本的 office 版本里面被单独出售。
MS ACCESS 以它自己的格式将数据存储在基于 Access Jet 的数据库引擎里。它还可以直接导入或者链接数据 (这些数据存储在其他应用程序和数据库)。
软件开发人员和数据架构师可以使用 Microsoft Access 开发应用软件,“高级用户” 可以使用它来构建软件应用程序。和其他办公应用程序一样,ACCESS 支持 Visual Basic 宏语言, 它是一个面向对象的编程语言, 可以引用各种对象,包括 DAO(数据访问对象),ActiveX 数据对象, 以及许多其他的 ActiveX 组件。可视对象用于显示表和报表,他们的方法和属性是在 VBA 编程环境下,VBA 代码模块可以声明和调用 Windows 操作系统函数。
(1) 完善地管理各种数据库对象,具有强大的数据组织、用户管理、安全检查等功能。
(2) 强大的数据处理功能
(2)强大的数据处理功能 (3) 可以方便地生成各种数据对象,利用存储的数据建立窗体和报表,可视性好
(4) 作为 Office 套件的一部分,可以与 Office 集成,实现无缝连接
(5) 能够利用 Web 检索和发布数据,实现与 Internet 的连接。 Access 主要适用于中小型应用系统,或作为客户机 / 服务器系统中的客户端数据库。
二、非关系型数据库
1. Mongodb 数据库
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型。Mongo 最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
定位:
开源、多平台、文档型 nosql 数据库
非常主流的文档型 nosql 数据库,“最像关系型数据库”,定位于 “灵活” 的 nosql 数据库
特点:
(1) 数据文件存储格式为 BSON,模式自由,整体架构与关系型数据库有对应关系,具有较好的高可用性和伸缩性,有插件式存储引擎,新版本默认是 writedtiger 存储引擎;
(2) 部署比较简答,下载软件,设置好配置文件即可启动服务;
(3) 不支持 SQL 语句,使用与 SQL 对应的 json 方式管理数据库;
(4) 有比较丰富的监控和性能命令,官方有比较完善的图形监控系统,但需要购买;
(5) 支持冷备份和热备份,可以使用 mongoexport/mongimport 进行逻辑备份,也可以使用基于 oplog 的 mongodump/mongorestore 物理热备份;
(6)MongoDB master-slave 主从复制:在 master 节点上加 --master 参数,从数据库加 -slave 和 - source 参数,就可以实现同步,这种目前不建议;ReplicaSets 复制集,在 mongodb 1.6 之后,开发了新的 replicaset,着呢家了故障自动切换和自动修复成员节点,各个 DB 将数据一致,建议使用这种方式;可以测试读写分离和故障转移;
(7)mongodb 海量数据水平拆分,将数据分别存储在 sharding 各个节点上,构建出分布式集群。Sharding 架构由 底层多个 mongodb Shared Server,config 水平拆分配置库 config server,前端路由 route process,三部分构成。Sharding 集群底层可以是 mongodb 单实例,也可以高可用的 replicaSet 复制集。
适用场景:
网站后台数据库:mongodb 非常适合实话实说插入、更新与查询,并可以实时复制和高伸缩性,适合更新迭代快、需求变更多、以对象为主的网站应用;
小文件系统:对于 json 文件,二进制数据,适合用 mongodb 进行存储和查询
日志分析系统:对于数据量大的日志文件,IM 会话消息记录,适合用 mongodb 来保存和查询;
缓存系统:mongodb 数据库也会使用大量的内存,合理的设计,也可以作为缓存系统使用;不过目前缓存系统使用更多的方案是 memcached 和 redis。
选择注意:
Mongodb 不适合的场景:
高度事务性的系统:即传统的 OLTP 业务,mongodb,乃至其他 nosql,对事务性支持都不太好;
传统的统计分析应用:即传统的 OLAP 业务,需要高度优化的查询方式,mongodb 支持不好;
使用 SQL 语句比较方便的业务:mongodb 是 json 类型的查询方式,虽然也灵活,但不如用 SQL 方便,如果业务和适合 SQL,则就不太合适 mongodb 了。
2. Redis 数据库
redis 是一个 key-value 存储系统。和 Memcached 类似,它支持存储的 value 类型相对更多,包括 string(字符串)、list(链表)、set(集合)、zset(sorted set -- 有序集合) 和 hash(哈希类型)。这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis 支持各种不同方式的排序。与 memcached 一样,为了保证效率,数据都是缓存在内存中。区别的是 redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave(主从) 同步。
Redis 支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得 Redis 可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布 / 订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
定位:
开源、Linux 平台、key-value 键值型 Nosql 数据库
简单稳定,非常主流的、全数据 in-momory、定位于 “快” 的键值型 nosql 数据库
特点:
(1) 命令执行速度非常快,读写性能可达 10 万 / 秒;数据结构是 key-value 类似字典的功能,可以键过期 - 缓存,发布订阅 - 消息系统,简单的事物功能;
(2) 用下载软件介质,编译安装的方式,可以很快完成数据库部署;服务启动 redis-server,可以用默认配置、运行参数配置、配置文件启动,三种方式;redis 在 Linux 平台支撑较好,官方没有 Windows 版本,微软维护了一个分支;
(3) 用 redis-cli 客户端连接,一般用简单的 set ,get,del 进行数据管理; 在单实例 redis 的基础上,进行可以数据持久化,主从复制,高可用和分布式等功能;
(4) 在命令行界面有一些常用的命令显示状态和性能,在图形界面方面,有开源监控工具来监控和记录数据库的状态,比如 cachecloud;
(5) 直接备份成物理问价的 RDB 持久化,基于 AOF 日志的实时 AOF 持久化
(6) 官方的 redis sentinel 哨兵高可用集群
(7) 官方基于分配槽的 redis cluster 分布式集群
适用场景:
缓存
基础消息队列系统
排行榜系统
计数器使用
社交网站的点赞、粉丝、下拉刷新等应用;
选择注意:
Redis 的使用场景,是 redis 适合的解决的问题,也有不适合解决的问题。
从数据规模角度讲,小数据规模使用 redis 比较合适,大数据规模使用 redis 不合适;(大数据规模,在一定程度上,可以用 SSDB 替代 redis 使用);
从数据冷热角度看,热数据适合放在 redis 中,冷数据不适合放在 redis 中。
3. Hbase 数据库
HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统(File System)所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。
HBase 是 Apache 的 Hadoop 项目的子项目。HBase 不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是 HBase 基于列的而不是基于行的模式。
1、定位:
开源、Linux 平台、列存储 nosql 数据库
可用于海量数据存储、与 Hadoop 生态圈结合、定位于 “大” 的列存储 nosql 数据库
2、特点:
(1) 命令执行速度非常快,读写性能可达 10 万 / 秒;数据结构是 key-value 类似字典的功能,可以键过期 - 缓存,发布订阅 - 消息系统,简单的事物功能;
(2) 相对其他数据库,hbase 的部署比较复杂,依赖 Hadoop,zookeeper 等组件,Hbase 集群包括一个 mater 节点,多个 regionServer,zookeeper 管理所有 regionServer,需要依次部署 Hadoop、zookeeper 之后,再部署 HBASE 集群;
(3) 用 redis-cli 客户端连接,一般用简单的 set ,get,del 进行数据管理; 在单实例 redis 的基础上,进行可以数据持久化,主从复制,高可用和分布式等功能;
(4) 在命令行界面有一些常用的命令显示状态和性能,在图形界面方面,有开源监控工具来监控和记录数据库的状态,比如 cachecloud;
(5)Hbase 一般用作海量数据的仓库,本身通过多层副本来保证数据安全性,不用进行专门的备份
(6)HBASE 集群基于 Hadoop,需要依次部署 Hadoop 单机模式、集群模式、HA 模式,通过 Hadoop HA 实现高可用;
(7)HBASE 以集群形式,依次是单机模式,伪分布模式,完全分布模式,底层基于 HDFS,zookeeper 可以很好地进行扩展;
3、适用场景:
两大用途:
用于简单数据写入和海量、结构简单数据查询的业务场景;
用于成为其他数据库备份和下沉的数据库;
4、选择注意:
Hbase 不适合的场景:对数据分析需求高,需要能够用 sql 或者简单的 MapReduce 实现分析需求的业务场景,不适合用 Hbase;
单表数据量,不超过千万时,使用 Hbase,体现不出 Hbase 的优势,而且会比较慢,不适合用 Hbase。
4. Memcaced 数据库
Memcaced 是一个开源的、高性能的、具有分布式内存对象的缓存系统。通过它可以减轻数据库负载,加速动态的 web 应用,最初版本由 LiveJoumal 的 Brad Fitzpatrick 在 2003 年开发完成。目前全球有非常多的用户都在使用它来架构主机的大负载网站或提升主机的高访问网站的响应速度。注意:Memcache 是这个项目的名称,而 Memcached 是服务端的主程序文件名。
缓存一般用来保存一些进程被存取的对象或数据,通过缓存来存取对象或数据要比在磁盘上存取快很多,前者是内存,后者是磁盘、Memcached 是一种纯内存缓存系统,把经常存取的对象或数据缓存在 memcached 的内存中,这些被缓存的数据被程序通过 API 的方式被读取,memcached 里面的数据就像一张巨大的 hash 表,数据以 key-value 对的方式存在
Memcached 通过缓存经常被存取的对象或数据,从而减轻频繁读取数据库的压力,提高网站的响应速度,构建出快速更快的可扩展的 Web 应用。
三、对话李飞飞老师想了解的关于数据库存在的问题
1. 如何结合不同的业务场景选择合适的数据库?
2.业务系统应用架构设计时如何适配分布式数据库以实现高性能,在线扩展后性能如何同步提升?
3. 分布式数据库故障时如何确保故障自动转移,自动恢复业务,实现高可用?
4. 分布式数据库全局一致性和高性能如何取舍达到平衡?
5. 中小企业公司后端稳态类系统进行分布式方向改造的必要性?
6. 关于国产分布式数据库未来趋势分析?
7. 在分布式数据库架构选型中,如何看待计算与存储分离?
8. 有没有数据库综合管理平台推荐?
9. 国产数据库选型集中式与分布式如何选取?
10. 阿里云PolarDB数据库都有哪些具体的优势,未来的规划以及进一步发展?
赞3
踩8