墨墨导读:开源数据库选择怎么做,应该从哪方面进行考虑?
数据技术嘉年华,十周年盛大开启,点我立即报名!大会以“自研·智能·新基建——云和数据促创新 生态融合新十年” 为主题,相邀数据英雄,总结过往十年历程与成绩,展望未来十年趋势与目标!
数据库的发展基本上也是伴随着计算机技术经历了50年的历史,从最初的文件系统上的文件,到有结构的层次和网状数据库,一直到今天被广泛使用的关系型数据库。迄今为止可以说数据库百花齐放,可供选择的数据库每年都在陆续增长。但这些数据库的多多少少都会有共性,这些共性会让使用者更容易接受。
了解数据库的各种分类有助于在设计应用时选择正确的数据库。以下涉及关系型数据库,文档数据库,缓存数据库。
01
数据库类型有哪些?
1.1 传统的数据库
传统的关系型数据库基本都接触的比较多,比如常见的Oracle、MySQL、PostgreSQL。数据库中每个属性都有特性的类型来定义,可以把数据想象成一个个表格存储着。记录数据的认知非常相似,一行行记录着信息。
例如用户表里一条记录,就是一个用户他的属性描述,包括用户ID,年龄、性别、出生年月日、所属区域等。但区域也有它的更详细的属性,那就可以在用表表里增加一个关系字段来表示该区域所属的区域索引,通过索引连接到用户表,可以查到这个用户的基础信息。
1.2 NoSQL数据库
随着移动互联网时代的到来,需要存储的数据量越来越大,对机器的扩展要求成为了数据库的必备技能,这也是传统数据库的弱点,比如Oracle在做集群是很有限的。NoSQL对于数据库的扩展和高可用是它的强项。
那为什么NoSQL能够有可扩展和高可用?
这里体现CAP理论,CAP理论指的是一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。
分布式系统的一致性通常称为ACID,即原子性、一致性、隔离性、永久性,传统的关系型数据库都能做到。简单的你可以理解一致性为数据写入数据库中,后续读取是否能立刻读取到更新的最新值。
另外,可以看到大多数NoSQL数据库都是“弱一致性”的,强调的是“最终一致性”,可以理解为如果你停止向数据库写入数据,并等待一段不确定的时间,那么最终所有的读取请求都会返回相同的值。换句话说,不一致性是暂时的,最终会解决。通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上改观。显然,NoSQL大都是用一致性来换取了可用性和分区容错性。那么牺牲一致性到底值不值。
1.3 新型数据库
在实际的应用中,存在一种场景,要求数据库必须保证ACID和高可用性,于是一批新型的数据库诞生了,比如:华为GaussDB,中兴GoldenDB,蚂蚁金服的OcenBase和PingCAP的TiDB。看似近乎完美的支持的分布式一致性和高可用性,支持标准SQL,对传统的关系型数据库提供迁移兼容方案。但还是存在一些局限性。这部分需要实际使用中企业来,不过多探讨。
02
数据库选型
各个数据库还都是“术业有专攻”,在开源领域不可能用一种数据库打天下。比如,核心系统的事务数据还是选择使用MySQL或者PostgreSQL。分析性数据库可以选择Vertica或者Greenplum,缓存可以使用redis,memcache。
2.1 关系型数据
关系型数据库将数据组织到称为表的二维结构中,该结构由列和行组成。一张表中的数据可以与另一表中的数据有关联,数据库系统可以保证这种关联。关系型数据库通常强制执行严格的模式,也称为“写时模式(schema on write)”,在该模式中,向数据库写入的数据必须符合数据库中定义的结构。
关系型数据库已经存在很长时间了,许多开发人员都有使用它们的经验。迄今为止,最流行和最常用的数据库仍然是关系型数据库。这些数据库非常成熟,可以处理包含大量关系的数据,并且拥有大量知道如何使用它们的工具和应用程序生态系统。
在文档数据库中可能很难使用多对多关系,但是在关系型数据库中这非常简单。如果应用的数据具有很多关系,尤其是有事务处理的需求,那么这些数据库很合适。
以MySQL和PG等为主的众多开源数据库,在开源成为大势所趋的当下越来越受欢迎,而MySQL和PG分别作为“最受欢迎的开源数据库”和“功能最丰富的开源数据库”,稳居数据库行业排名前几位。
建议选择MySQL数据库,理由如下:
2.2 文档数据库
从1989年起,Lotus通过其群件产品Notes提出了数据库技术的全新概念-“文档数据库”,文档数据库区别于传统的其它数据库,它是用来管理文档。在传统的数据库中,信息被分割成离散的数据段,而在文档数据库中,文档是处理信息的基本单位。一文档可以很长、很复杂、可以无结构,与字处理文档类似。一个文档相当于关系数据库中的一条记录。
文档导向的数据库是键值数据库的子类,这是继承于 NoSQL 数据库的另一概念 [1] 。它们的差别在于处理数据的方式:在键值数据库中,数据是对数据库不透明的;而面向文档的数据库系统依赖于文件的内部结构,它获取元数据以用于数据库引擎进行更深层次的优化。
文档数据库和键/值数据库类似,因为它也通过主键存储文档(值)。与键/值数据库不同的是,文档数据库中的文档需要符合某些定义好的结构,而键/值数据库几乎可以存储任意值。这使得文档数据库可以启用诸如维护二级索引的功能以及基于文档查询数据的功能。
通常存储在文档数据库中的值是哈希图(JSON对象)和列表(JSON数组)的组合。JSON格式在文档数据库中很常用。这里典型的就是MongoDB的BSON。
Mongodb 于 RDBMS数据结构逻辑对比:
MongoDB 使用场景:
MongoDB 使用优势:
业界的案例:
2.3 缓存数据库
内存数据库,顾名思义就是将数据放在内存中直接操作的数据库。相对于磁盘,内存的数据读写速度要高出几个数量级,将数据保存在内存中相比从磁盘上访问能够极大地提高应用的性能。
内存数据库抛弃了磁盘数据管理的传统方式,基于全部数据都在内存中重新设计了体系结构,并且在数据缓存、快速算法、并行操作方面也进行了相应的改进,所以数据处理速度比传统数据库的数据处理速度要快很多,一般都在10倍以上。
在许多的数据库应用系统中,尤其在互联网行业中,对数据的访问性能有很高的要求。这类应用一般都有很高的事务量,又要求有很低的事务响应延迟,而且对数据库的可靠性有很高的要求。这样导致对数据库的频繁交付和相应要是非常高。那引入缓存技术,在内存中存储数据,防止高并发影响数据库性能,减少数据库压力,并提高查询速度。
提到缓存,就一定会想到redis和memcache,Redis的作者Salvatore Sanfilippo曾经对这两种基于内存的数据存储系统进行过比较: 1. Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。 2. 内存使用效率对比:使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。 3. 性能对比:由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。
但决策的时候都会选择redis。因为多数据类型,持久化,运维维护,易扩展等能力体现方面redis优秀于memcache,并且redis的高性能完全满足现有所有场景。
Redis是一种数据结构服务,作为一个需要长期运行的内存数据存储服务,Redis还提供了高性能命令处理,高可用性/扩展性的架构及数据持久等特性
Redis优势:
Redis 6 引入的多线程 IO 特性: 单线程 Redis 性能瓶颈主要在于网络的 IO 消耗, 优化主要有两个方向(): 提高网络 IO 性能,典型的实现像使用 DPDK 来替代内核网络栈的方式 使用多线程充分利用多核,典型的实现像 Memcached 参数:io-threads,io-threads-do-reads
03
问题和挑战
1. 随着数据库数量多,不标准,运维低效:当前数据库,部署在不同环境下,使用不同的版本,使得数据库管理困难,运维工作量大,效率低,故障率高。
2. 单实例运行,业务连续性风险大:当前绝大多数数据库使用单实例模式,带来了极大的安全隐患,业务连续性。
3. 形势与政策:
4. 选择数据的同时,需要准备对应的数据库管理平台,具备以下功能。【借助于恩墨的zCloud平台特性分享】
5. 收益分析
04
总结
墨天轮原文链接:https://www.modb.pro/db/32209(复制到浏览器中打开或者点击“阅读原文”)
推荐阅读:144页!分享珍藏已久的数据库技术年刊