墨墨导读:开源数据库选择怎么做,应该从哪方面进行考虑?
数据技术嘉年华,十周年盛大开启,点我立即报名!大会以“自研·智能·新基建——云和数据促创新 生态融合新十年” 为主题,相邀数据英雄,总结过往十年历程与成绩,展望未来十年趋势与目标!
数据库的发展基本上也是伴随着计算机技术经历了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数据库,理由如下:
- MySQL数据库在开源业界可以说“炙手可热”,便捷灵活,已经广泛被业内看好,而且被Oracle公司接管后,其开发不再像以前典型的开源项目那样开发人员散落世界各地,而是由Oracle公司专门组建了一个MySQL开发团队,团队中有的小组在做集群化软件,有的在做数据库算法,有的在做备份功能,整体上提供了更加成熟的工程模式,未来提升的空间巨大。
- 从市场占有率看,MySQL排名今年连续攀升,大有赶超数据库龙头“Oracle”的趋势。从如数据库下排名可以看出,市场还是比较青睐MySQL开源数据库的。
- 最后,生态环境好说明从事MySQL数据库开发运维的技术人员多,遇到相关疑难杂症获得及时解决的概率比较大,对于东航来说,无论是自己招人,还是招第三方协助运维,都将更容易。
- 相较之下,PG在国内的使用则更少。据了解,国内唯一的PG第三方维护厂商只有四川某厂家能做,但只有几个人的团队,只能是远程支持、本身技术能力、支持能力都十分有限。而且,估计未来几年业内第三方维护也没有更多的选择性。MySQL在全国非常普遍可以本地技术支持。
- MySQL8.0版本功能,高可用方面提供的功能场景也非常丰富,逐渐把oracle 一些功能,融入到MySQL里。
2.2 文档数据库
从1989年起,Lotus通过其群件产品Notes提出了数据库技术的全新概念-“文档数据库”,文档数据库区别于传统的其它数据库,它是用来管理文档。在传统的数据库中,信息被分割成离散的数据段,而在文档数据库中,文档是处理信息的基本单位。一文档可以很长、很复杂、可以无结构,与字处理文档类似。一个文档相当于关系数据库中的一条记录。
文档导向的数据库是键值数据库的子类,这是继承于 NoSQL 数据库的另一概念 [1] 。它们的差别在于处理数据的方式:在键值数据库中,数据是对数据库不透明的;而面向文档的数据库系统依赖于文件的内部结构,它获取元数据以用于数据库引擎进行更深层次的优化。
文档数据库和键/值数据库类似,因为它也通过主键存储文档(值)。与键/值数据库不同的是,文档数据库中的文档需要符合某些定义好的结构,而键/值数据库几乎可以存储任意值。这使得文档数据库可以启用诸如维护二级索引的功能以及基于文档查询数据的功能。
通常存储在文档数据库中的值是哈希图(JSON对象)和列表(JSON数组)的组合。JSON格式在文档数据库中很常用。这里典型的就是MongoDB的BSON。
Mongodb 于 RDBMS数据结构逻辑对比:
- 面向集合存储,容易存储对象类型的数据
- 模式自由,结构灵活,采用无模式结构存储
- 支持完全索引,可以在任意属性上建立索引,包含内部对象
- 支持丰富的查询操作
- 强大的聚合工具。如count、group 等
- 使用高效的二进制数据存储,包括大型对象(如视频)
- 支持Perl、PHP、Java、C#、JavaScript、Ruby、C 和C 语言的驱动程序,。
- 文件存储格式为BSON & 提供对大容量文件GridFS。
- 副本集和分片集群(Replica Sets and Sharded Clusters)&自动处理分片,以支持云计算层次的扩展
MongoDB 使用场景:
- 游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新
- 物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
- 社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能
- 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析
- 视频直播,使用 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能读的速度是 110000次/S,写的速度是81000次/S
- 丰富的数据类型:Redis支持Strings,Lists,Hashes,Sets 及 Ordered Sets数据类型操作
- 单线程:利用redis队列技术并将访问的变为串行访问,消除了传统数据库串行控制的开销,
- 原子:Redis所有的操作是原子性的,意思就是要么成功执行,要么失败 完全不执行
- 丰富的特性:Redis还支持publish/subscrible,通知,key过期等等特性
- 数据持久化:日志,RDB 方式
- 高可用性:支持主从,哨兵方案,集群等方案
Redis 6 引入的多线程 IO 特性: 单线程 Redis 性能瓶颈主要在于网络的 IO 消耗, 优化主要有两个方向(): 提高网络 IO 性能,典型的实现像使用 DPDK 来替代内核网络栈的方式 使用多线程充分利用多核,典型的实现像 Memcached 参数:io-threads,io-threads-do-reads
03
问题和挑战
1. 随着数据库数量多,不标准,运维低效:当前数据库,部署在不同环境下,使用不同的版本,使得数据库管理困难,运维工作量大,效率低,故障率高。
2. 单实例运行,业务连续性风险大:当前绝大多数数据库使用单实例模式,带来了极大的安全隐患,业务连续性。
3. 形势与政策:
- 云计算兴起
- 去IOE
- 分布式兴起
- 禁止风波
- 自主可控
- 去中心化
- 安全合规
4. 选择数据的同时,需要准备对应的数据库管理平台,具备以下功能。【借助于恩墨的zCloud平台特性分享】
5. 收益分析
- 涵盖高可用集群、平台化运维管理、监控告警、自动化部署的一体化解决方案。保证数据库运行环境符合核心数据库的要求, 当故障发生,数据库不间断提供服务;
- 统一运维管理。整个数据库的资源通过管理平台统一运维管理,大大降低对IT管理人员和运维人员的技能要求,降低了使用数据库的门槛,提高运维效率,提高运维数据库服务 反应时间和质量 ,为日后数据库服务规划,对以后扩展奠定基础; 资源充分利用。零散数据库服务合并在一起,避免资源浪费。
04
总结
数据库选型一直坚持的原则:选择成熟的平台和技术,同时是最熟悉的,能做到极致的,用好不用坏,用熟不用生。
墨天轮原文链接:https://www.modb.pro/db/32209(复制到浏览器中打开或者点击“阅读原文”)
推荐阅读:144页!分享珍藏已久的数据库技术年刊