在真实的工作中,数据库的设计是一个非常需要平衡取舍的过程,有时为了优化查询性能不得不做一些数据冗余,而在数据量极大的情况下,又必须谨慎选择每一列的存储类型、避免冗余。
数据量非常大的情况下,大多数时候还要进行分库分表的设计。
ShardingSphere
目前 Java 中主流的分库分表中间件,支持客户端架构、代理架构,Sidecar 架构目前还在开发中。
Vitess
Vitess 是 Youtube 开源的 MySQL 数据库集群系统,采用的是中心化的数据库代理架构,这套数据集群承载了 Youtube 数以亿计的数据量和访问请求。
存储引擎MySQL 中主流使用的是 InnoDB 存储引擎,内部采用了 B+ 树的索引结构,Percona XtraDB 是InnoDB 存储引擎的增强版,Percona 兼容 MySQL,号称拥有更好的性能,也具有一定的市场占有率。
除了 InnoDB 及其衍生引擎,RocksDB 也是一个可选项,这是一个 LSM 存储引擎,不同于传统的基于 B+ 树的存储引擎,基于 LSM 存储引擎的数据库尤其适合写多读少的场景,由于最初是设计用来做持久化的键值数据存储,因此在 KV 存储上具有非常高的性能,可惜的是 MySQL 无法选择 RocksDB 作为存储引擎,目前支持的数据库有 MariaDB 和 Percona。
NewSQLNewSQL 这一新兴领域也大量使用了 RocksDB 作为存储引擎,TiDB 作为流行度较高的 NewSQL 产品,就是用其实现的数据持久化。
NoSQL 数据库MongoDB
MongoDB 介于关系数据库和非关系数据库之间,不要求数据存储具有固定的模式,且能用于存储超大规模的数据集。
时序数据库随着互联网的深入,应用场景越来越丰富,诸如系统运行状态、系统指标采集等场景产生大量的数据,这类基于时间的一系列数据,以写多读少、数据量极大为特点,传统的数据库已经不适合存储这类数据,时序数据库由此诞生。
主流的时序数据库有:
influxdb
Prometheus
graphite
列式数据库传统的关系型数据库采用行式存储,大数据领域多采用列式存储,列式存储的主要优势在于可以按需所取,在并行处理和数据压缩上更有优势。关系型数据库适合 OLTP, 列式数据库更适合 OLAP,为了使列式数据库能更好地支持 OLTP,目前出现了像 kudu 和 Druid 这类优秀的开源产品,它们结合了列式存储的优势,并在 OLTP 方面也做了特别的优化。
主流的列式数据库有:
HBase
Cassandra
kudu
Druid
嵌入式数据库传统的关系型数据库能够支持企业级的应用,但在许多场景下,我们可能只需要一个小型应用,这个时候使用嵌入式数据库是一个方便的选择,除此之外,嵌入式数据库非常适合用于做单元测试。
Java 中流行的嵌入式数据库有:
h2base
moby
中间件 Web ServerNginx
Nginx 使用 AIO 的模型实现高并发,Apache 每个请求独占一个线程。
AIO 模型适合于 IO 密集型服务,多进程或线程适合于 CPU 密集型服务,由于大多数 Web 服务都属于 IO 密集型,nginx 的市场占有率逐渐超过了 Apache。由于这一特点,Nginx 也非常适合做反向代理,通过这种机制做负载均衡也是非常主流的一种方案。
tomcat、jetty、weblogic 等传统 Java Web 服务器
随着容器化技术的流行,这类服务器日渐式微,市场占有率逐渐下降,进行容器化部署时tomcat一般内置在程序中,这种进步使得开发者可以更关注业务代码本身,而无需关注此类服务器的种种细节,可谓是对开发人员的减负。
OpenResty
优秀的开源产品经常出现许多优秀的衍生产品,比如 Percona 之于 MySQL,OpenResty 之于 Nginx,Kong 之于 OpenResty。
Nginx 市场占有率之高,但许多场景下是用其做反向代理,OpenResty 的设计目标则是让 Web 服务直接跑在 Nginx 服务内部。
OpenResty 同时也是基于 LuaJIT 的 Web 平台,开发者可以很方便地使用 Lua 调用 Nignx 模块,具有强大的可扩展性,比如可将典型的 Nginx + Tomcat + MySQL 架构更换为 Nginx + Lua + Redis + Tomcat + MySQL 的架构。
Kong 从技术上讲也属于 Web Server,但一般用来做 API 网关,下文中再详述。
分布式缓存Redis
Redis 作为一个高性能的内存数据库,目前已被广泛使用,其支持多种数据结构,根据不同场景使用不同的数据结构,才能最有效地使用它。
KV 存储Pika
Redis 的性能非常高,但在将其做数据库使用时存在数据持久化的问题,Pika 就是为了解决这一问题而出现,它底层基于 RocksDB,修改了其部分源代码,在 KV 数据持久化上有非常高的性能,与基于内存的 redis 相比仅有较小的性能下降,同时它还兼容大部分的 redis 协议,与 Redis 的使用几乎没有差异,上手简单。
Tair