物理存储结构、逻辑存储结构、内存结构和实例进程结构。这是内部体系结构
本期目录
DB-Engines数据库排行榜
新闻快讯
一、RDBMS家族
二、NoSQL家族
三、NewSQL家族
四、时间序列
五、大数据生态圈
六、国产数据库概览
七、云数据库
八、推出dbaplus Newsletter的想法
九、感谢名单
为方便阅读、重点呈现,本期Newsletter(2019年1月)将对各个板块的内容进行精简。需要阅读全文的同学可点击文末 【阅读原文】 或登录https://pan.baidu.com/s/13BgipbaHeMfvm0YPtiYviA
进行下载。DB-Engines数据库排行榜
以下取自2019年1月的数据,具体信息可以参考http://db-engines.com/en/ranking/,数据仅供参考。
DB-Engines排名的数据依据5个不同的因素:
新闻快讯
1、2018年9月24日,微软公布了SQL Server2019预览版,SQL Server 2019将结合Spark创建统一数据平台。
2、2018年10月5日,ElasticSearch在美国纽约证券交易所上市。
3、亚马逊放弃甲骨文数据库软件,导致最大仓库之一在黄金时段宕机。受此消息影响,亚马逊盘前股价小幅跳水,跌超2%。
4、2018年10月31日,Percona发布了Percona Server 8.0 RC版本,发布对MongoDB 4.0的支持,发布对XtraBackup测试第二个版本。
5、2018年10月31日,Gartner陆续发布了2018年的数据库系列报告,包括《数据库魔力象限》、《数据库核心能力》以及《数据库推荐报告》。
今年的总上榜数据库产品达到了5家,分别来自:阿里云,华为,巨杉数据库,腾讯云,星环 科技 。其中阿里云和巨杉数据库已经连续两年入选。
6、2018年11月初,Neo4j宣布完成E轮8000万美元融资。11月15日,Neo4j宣布企业版彻底闭源:
7、2019年1月8日,阿里巴巴以1.033亿美元(9000万欧元)的价格收购了Apache Flink商业公司DataArtisans。
8、2019年1月11日早间消息,亚马逊宣布推出云数据库软件,亚马逊和MongoDB将会直接竞争。
RDBMS家族
Oracle 发布18.3版本
2018年7月,Oracle Database 18.3通用版开始提供下载。我们可以将Oracle Database 18c视为采用之前发布模式的Oracle Database 12c第2版的第一个补丁集。未来,客户将不再需要等待多年才能用上最新版Oracle数据库,而是每年都可以期待新数据库特性和增强。Database 19c将于2019年Q1率先在Oracle cloud上发布云版本。
Oracle Database 18c及19c部分关键功能:
1、性能
2、多租户,大量功能增强及改进,大幅节省成本和提高敏捷性
3、高可用
4、数据仓库和大数据
MySQL发布8.0.13版本
1、账户管理
经过配置,修改密码时,必须带上原密码。在之前的版本,用户登录之后,就可以修改自己的密码。这种方式存在一定安全风险。比如用户登录上数据库后,中途离开一段时间,那么非法用户可能会修改密码。由参数password_require_current控制。
2、配置
Innodb表必须有主键。在用户没有指定主键时,系统会生成一个默认的主键。但是在主从复制的场景下,默认的主键,会对丛库应用速度带来致命的影响。如果设置sql_require_primary_key,那么数据库会强制用户在创建表、修改表时,加上主键。
3、字段默认值
BLOB、TEXT、GEOMETRY和JSON字段可以指定默认值了。
4、优化器
1)Skip Scan
非前缀索引也可以用了。
之前的版本,任何没有带上f1字段的查询,都没法使用索引。在新的版本中,它可以忽略前面的字段,让这个查询使用到索引。其实现原理就是把(f1 = 1 AND f2 >40) 和(f1 = 2 AND f2 >40)的查询结果合并。
2)函数索引
之前版本只能基于某个列或者多个列加索引,但是不允许在上面做计算,如今这个限制消除了。
5、SQL语法
GROUP BY ASC和GROUP BY DESC语法已经被废弃,要想达到类似的效果,请使用GROUP BY ORDER BY ASC和GROUP BY ORDER BY DESC。
6、功能变化
1)设置用户变量,请使用SET语句
如下类型语句将要被废弃SELECT @var, @var:=@var+1。
2)新增innodb_fsync_threshold
该变量是控制文件刷新到磁盘的速率,防止磁盘在短时间内饱和。
3)新增会话级临时表空间
在以往的版本中,当执行SQL时,产生的临时表都在全局表空间ibtmp1中,及时执行结束,临时表被释放,空间不会被回收。新版本中,会为session从临时表空间池中分配一个临时表空间,当连接断开时,临时表空间的磁盘空间被回收。
4)在线切换Group Replication的状态
5)新增了group_replication_member_expel_timeout
之前,如果某个节点被怀疑有问题,在5秒检测期结束之后,那么就直接被驱逐出这个集群。即使该节点恢复正常时,也不会再被加入集群。那么,瞬时的故障,会把某些节点驱逐出集群。
group_replication_member_expel_timeout让管理员能更好的依据自身的场景,做出最合适的配置(建议配置时间小于一个小时)。
MariaDB 10.3版本功能展示
1、MariaDB 10.3支持update多表ORDER BY and LIMIT
1)update连表更新,limit语句
update t1 join t2 on t1.id=t2.id set t1.name='hechunyang' limit 3
MySQL 8.0直接报错
MariaDB 10.3更新成功
2)update连表更新,ORDER BY and LIMIT语句
update t1 join t2 on t1.id=t2.id set t1.name='HEchunyang' order by t1.id DESC limit 3
MySQL 8.0直接报错
MariaDB 10.3更新成功
参考:
https://jira.mariadb.org/browse/MDEV-13911
2、MariaDB10.3增补AliSQL补丁——安全执行Online DDL
Online DDL从名字上看很容易误导新手,以为不论什么情况,修改表结构都不会锁表,理想很丰满,现实很骨感,注意这个坑!
有以下两种情况执行DDL *** 作会锁表的,Waiting for table metadata lock(元数据表锁):
针对第二种情况,MariaDB10.3增补AliSQL补丁-DDL FAST FAIL,让其DDL *** 作快速失败。
例:
如果线上有某个慢SQL对该表进行 *** 作,可以使用WAIT n(以秒为单位设置等待)或NOWAIT在语句中显式设置锁等待超时,在这种情况下,如果无法获取锁,语句将立即失败。 WAIT 0相当于NOWAIT。
参考:
https://jira.mariadb.org/browse/MDEV-11388
3、MariaDB Window Functions窗口函数分组取TOP N记录
窗口函数在MariaDB10.2版本里实现,其简化了复杂SQL的撰写,提高了可读性。
参考:
https://mariadb.com/kb/en/library/window-functions-overview/
Percona Server发布8.0 GA版本
2018年12月21日,Percona发布了Percona Server 8.0 GA版本。
在支持MySQL8.0社区的基础版上,Percona Server for MySQL 8.0版本中带来了许多新功能:
1、安全性和合规性
2、性能和可扩展性
3、可观察性和可用性
Percona Server for MySQL 8.0中将要被废用功能:
Percona Server for MySQL 8.0中删除的功能:
RocksDB发布V5.17.2版本
2018年10月24日,RocksDB发布V5.17.2版本。
RocksDB是Facebook在LevelDB基础上用C++写的高效内嵌式K/V存储引擎。相比LevelDB,RocksDB提供了Column-Family,TTL,Transaction,Merge等方面的支持。目前MyRocks,TiKV等底层的存储都是基于RocksDB来构建。
PostgreSQL发布11版本
2018年10月18日,PostgreSQL 11发布。
1、PostgreSQL 11的重大增强
2、PostgreSQL 插件动态
1)分布式插件citus发布 8.1
citus是PostgreSQL的一款sharding插件,目前国内苏宁、铁总、探探有较大量使用案例。
https://github.com/citusdata/citus
2)地理信息插件postgis发布2.5.1
PostGIS是专业的时空数据库插件,在测绘、航天、气象、地震、国土资源、地图等时空专业领域应用广泛。同时在互联网行业也得到了对GIS有性能、功能深度要求的客户青睐,比如共享出行、外卖等客户。
http://postgis.net/
3)时序插件timescale发布1.1.1
timescale是PostgreSQL的一款时序数据库插件,在IoT行业中有非常好的应用。github star数目前有5000多,是一个非常火爆的插件。
https://github.com/timescale/timescaledb
4)流计算插件 pipelinedb 正式插件化
Pipelinedb是PostgreSQL的一款流计算插件,使用这个创建可以对高速写入的数据进行实时根据定义的聚合规则进行聚合(支持概率计算),实时根据定义的规则触发事件(支持事件处理函数的自定义)。可用于IoT,监控,FEED实时计算等场景。
https://github.com/pipelinedb/pipelinedb
3、PostgreSQL衍生开源产品动态
1)agensgraph发布 2.0.0版本
agensgraph是兼容PostgreSQL、opencypher的专业图数据库,适合图式关系的管理。
https://github.com/bitnine-oss/agensgraph
2)gpdb发布5.15
gpdb是兼容PostgreSQL的mpp数据库,适合OLAP场景。近两年,gpdb一直在追赶PostgreSQL的社区版本,预计很快会追上10的PostgreSQL,在TP方面的性能也会得到显著提升。
https://github.com/greenplum-db/gpdb
3)antdb发布3.2
antdb是以Postgres-XC为基础开发的一款PostgreSQL sharding数据库,亚信主导开发,开源,目前主要服务于亚信自有客户。
https://github.com/ADBSQL/AntDB
4)迁移工具MTK发布52版本
MTK是EDB提供的可以将Oracle、PostgreSQL、MySQL、MSSQL、Sybase数据库迁移到PostgreSQL, PPAS的产品,迁移速度可以达到100万行/s以上。
https://github.com/digoal/blog/blob/master/201812/20181226_01.md
DB2发布 11.1.4.4版本
DB2最新发布Mod Pack 4 and Fix Pack 4,包含以下几方面的改动及增强:
1、性能
2、高可用
3、管理视图
4、应用开发方面
5、联邦功能
6、pureScale
NoSQL家族
Redis发布5.0.3版本
MongoDB升级更新MongoDB Mobile和MongoDB Stitch
2018年11月21日,MongoDB升级更新MongoDB Mobile和MongoDB Stitch,助力开发人员提升工作效率。
MongoDB 公司日前发布了多项新产品功能,旨在更好地帮助开发人员在世界各地管理数据。通过利用存储在移动设备和后台数据库的数据之间的实时、自动的同步特性,MongoDB Mobile通用版本助力开发人员构建更快捷、反应更迅速的应用程序。此前,这只能通过在移动应用内部安装一个可供选择或限定功能的数据库来实现。
MongoDB Mobile在为客户提供随处运行的自由度方面更进了一步。用户在iOS和安卓终端设备上可拥有MongoDB所有功能,将网络边界扩展到其物联网资产范畴。应用系统还可以使用MongoDB Stitch的软件开发包访问移动客户端或后台数据,帮助开发人员通过他们希望的任意方式查询移动终端数据和物联网数据,包括本地读写、本地JSON存储、索引和聚合。通过Stitch移动同步功能(现可提供beta版),用户可以自动对保存在本地的数据以及后台数据库的数据进行同步。
本期新秀:Cassandra发布3.11.3版本
2018年8月11日,Cassandra发布正式版3.11.3。
Apache Cassandra是一款开源分布式NoSQL数据库系统,使用了基于Google BigTable的数据模型,与面向行(row)的传统关系型数据库或键值存储key-value数据库不同,Cassandra使用的是宽列存储模型(Wide Column Stores)。与BigTable和其模仿者HBase不同,数据并不存储在分布式文件系统如GFS或HDFS中,而是直接存于本地。
Cassandra的系统架构与Amazon DynamoDB类似,是基于一致性哈希的完全P2P架构,每行数据通过哈希来决定应该存在哪个或哪些节点中。集群没有master的概念,所有节点都是同样的角色,彻底避免了整个系统的单点问题导致的不稳定性,集群间的状态同步通过Gossip协议来进行P2P的通信。
3.11.3版本的一些bug fix和改进:
NewSQL家族
TiDB 发布2.1.2版本
2018 年 12 月 22 日,TiDB 发布 2.1.2 版,TiDB-Ansible 相应发布 2.1.2 版本。该版本在 2.1.1 版的基础上,对系统兼容性、稳定性做出了改进。
TiDB 是一款定位于在线事务处理/在线分析处理( HTAP: Hybrid Transactional/Analytical Processing)的融合型数据库产品。除了底层的 RocksDB 存储引擎之外,分布式SQL层、分布式KV存储引擎(TiKV)完全自主设计和研发。
TiDB 完全开源,兼容MySQL协议和语法,可以简单理解为一个可以无限水平扩展的MySQL,并且提供分布式事务、跨节点 JOIN、吞吐和存储容量水平扩展、故障自恢复、高可用等优异的特性;对业务没有任何侵入性,简化开发,利于维护和平滑迁移。
TiDB:
PD:
TiKV:
Tools:
1)TiDB-Lightning
2)TiDB-Binlog
EsgynDB发布R2.5版本
2018年12月22日,EsgynDB R2.5版本正式发布。
作为企业级产品,EsgynDB 2.5向前迈进了一大步,它拥有以下功能和改进:
CockroachDB发布2.1版本
2018年10月30日,CockroachDB正式发布2.1版本,其新增特性如下:
新增企业级特性:
新增SQL特性:
新增内核特性:
Admin UI增强:
时间序列
本期新秀:TimescaleDB发布1.0版本
10月底,TimescaleDB 1.0宣布正式推出,官方表示该版本已可用于生产环境,支持完整SQL和扩展。
TimescaleDB是基于PostgreSQL数据库开发的一款时序数据库,以插件化的形式打包提供,随着PostgreSQL的版本升级而升级,不会因为另立分支带来麻烦。
TimescaleDB架构:
数据自动按时间和空间分片(chunk)
更新亮点:
https://github.com/timescale/timescaledb/releases/tag/1.0.0
大数据生态圈
Hadoop发布2.9.2版本
2018年11月中旬,Hadoop在2.9分支上发布了新的2.9.2版本,该版本进行了204个大大小小的变更,主要变更如下:
Greenplum 发布5.15版本
Greenplum最新的5.15版本中发布了流式数据加载工具。
该版本中的Greenplum Streem Server组件已经集成了Kafka流式加载功能,并通过了Confluent官方的集成认证,其支持的主要功能如下:
国产数据库概览
K-DB发布数据库一体机版
2018年11月7日,K-DB发布了数据库一体机版。该版本更新情况如下:
OceanBase迁移服务发布1.0版本
1月4日,OceanBase 正式发布OMS迁移服务1.0版本。
以下内容包含 OceanBase 迁移服务的重要特性和功能:
SequoiaDB发布3.0.1新版本
1、架构
1)完整计算存储分离架构,兼容MySQL协议、语法
计算存储分离体系以松耦合的方式将计算与存储层分别部署,通过标准接口或插件对各个模块和组件进行无缝替换,在计算层与存储层均可实现自由的d性伸缩。
SequoiaDB巨杉数据库“计算-存储分离”架构详细示意
用户可以根据自身业务特征选择面向交易的SQL解析器(例如MySQL或PGSQL)或面向统计分析的执行引擎(例如SparkSQL)。众所周知,使用不同的SQL优化与执行方式,数据库的访问性能可能会存在上千上万倍的差距。计算存储分离的核心思想便是在数据存储层面进行一体化存储,在计算层面则利用每种执行引擎的特点针对不同业务场景进行选择和优化,用户可以在存储层进行逻辑与物理的隔离,将面向高频交易的前端业务与面向高吞吐量的统计分析使用不同的硬件进行存储,确保在多类型数据访问时互不干扰,以真正达到生产环境可用的多租户与HTAP能力。
2、其他更新信息
1)接口变更:
2)主要特性:
云数据库
本期新秀:腾讯发布数据库CynosDB,开启公测
1、News
1)腾讯云数据库MySQL2018年重大更新:
2)腾讯云数据库MongoDB2018年重大更新:
3)腾讯云数据库Redis/CKV+2018年重大更新:
4)腾讯云数据库CTSDB2018年重大更新:
2、Redis 4.0集群版商业化上线
2018年10月,腾讯云数据库Redis 4.0集群版完成邀测、公测、商业化三个迭代,在广州、上海、北京正式全量商业化上线。
产品特性:
使用场景:
官网文档:
https://cloud.tencent.com/document/product/239/18336
3、腾讯自研数据库CynosDB发布,开启公测
2018年11月22日,腾讯云召开新一代自研数据库CynosDB发布会,业界第一款全面兼容市面上两大最主流的开源数据库MySQL和PostgreSQL的高性能企业级分布式云数据库。
本期新秀:京东云DRDS发布1.0版本
12月24日,京东云分布式关系型数据库DRDS正式发布1.0版本。
DRDS是京东云精心自研的数据库中间件产品,获得了2018年 ”可信云技术创新奖”。DRDS可实现海量数据下的自动分库分表,具有高性能,分布式,d性升级,兼容MySQL等优点,适用于高并发、大规模数据的在线交易, 历史 数据查询,自动数据分片等业务场景,历经多次618,双十一的考验,已经在京东集团内大规模使用。
京东云DRDS产品有以下主要特性
1)自动分库分表
通过简单的定义即可自动实现分库分表,将数据实际存放在多个MySQL实例的数据库中,但呈现给应用程序的依旧是一张表,对业务透明,应用程序几乎无需改动,实现了对数据库存储和处理能力的水平扩展。
2)分布式架构
基于分布式架构的集群方案,多个对等节点同时对外提供服务,不但可有效规避服务的单点故障,而且更加容易扩展。
3)超强性能
具有极高的处理能力,双节点即可支持数万QPS,满足用户超大规模处理能力的需求。
4)兼容MySQL
兼容绝大部分MySQL语法,包括MySQL语法、数据类型、索引、常用函数、排序、关联等DDL,DML语句,使用成本低。
参考链接:
https://www.jdcloud.com/cn/products/drds
RadonDB发布1.0.3版本
2018年12月26日,MyNewSQL领域的RadonDB云数据库发布1.0.3版本。
推出dbaplus Newsletter的想法
dbaplus Newsletter旨在向广大技术爱好者提供数据库行业的最新技术发展趋势,为社区的技术发展提供一个统一的发声平台。为此,我们策划了RDBMS、NoSQL、NewSQL、时间序列、大数据生态圈、国产数据库、云数据库等几个版块。
我们不以商业宣传为目的,不接受任何商业广告宣传,严格审查信息源的可信度和准确性,力争为大家提供一个纯净的技术学习环境,欢迎大家监督指正。
至于Newsletter发布的周期,目前计划是每三个月左右会做一次跟进, 下期计划时间是2019年4月14日~4月25日, 如果有相关的信息提供请发送至邮箱:newsletter@dbaplus.cn
感谢名单
最后要感谢那些提供宝贵信息和建议的专家朋友,排名不分先后。
往期回顾:
↓↓别忘了点这里下载 2019年1月 完整版Newsletter 哦~
随着时间和业务的发展,数据库中的数据量增长是不可控的,库和表中的数据会越来越大,随之带来的是更高的 磁盘 、 IO 、 系统开销 ,甚至 性能 上的瓶颈,而单台服务器的 资源终究是有限 的。
因此在面对业务扩张过程中,应用程序对数据库系统的 健壮性 , 安全性 , 扩展性 提出了更高的要求。
以下,我从数据库架构、选型与落地来让大家入门。
数据库会面临什么样的挑战呢?
业务刚开始我们只用单机数据库就够了,但随着业务增长,数据规模和用户规模上升,这个时候数据库会面临IO瓶颈、存储瓶颈、可用性、安全性问题。
为了解决上述的各种问题,数据库衍生了出不同的架构来解决不同的场景需求。
将数据库的写 *** 作和读 *** 作分离,主库接收写请求,使用多个从库副本负责读请求,从库和主库同步更新数据保持数据一致性,从库可以水平扩展,用于面对读请求的增加。
这个模式也就是常说的读写分离,针对的是小规模数据,而且存在大量读 *** 作的场景。
因为主从的数据是相同的,一旦主库宕机的时候,从库可以 切换为主库提供写入 ,所以这个架构也可以提高数据库系统的 安全性 和 可用性 ;
优点:
缺点:
在数据库遇到 IO瓶颈 过程中,如果IO集中在某一块的业务中,这个时候可以考虑的就是垂直分库,将热点业务拆分出去,避免由 热点业务 的 密集IO请求 影响了其他正常业务,所以垂直分库也叫 业务分库 。
优点:
缺点:
在数据库遇到存储瓶颈的时候,由于数据量过大造成索引性能下降。
这个时候可以考虑将数据做水平拆分,针对数据量巨大的单张表,按照某种规则,切分到多张表里面去。
但是这些表还是在同一个库中,所以库级别的数据库 *** 作还是有IO瓶颈(单个服务器的IO有上限)。
所以水平分表主要还是针对 数据量较大 ,整体业务 请求量较低 的场景。
优点:
缺点:
四、分库分表
在数据库遇到存储瓶颈和IO瓶颈的时候,数据量过大造成索引性能下降,加上同一时间需要处理大规模的业务请求,这个时候单库的IO上限会限制处理效率。
所以需要将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。
分库分表能够有效地缓解单机和单库的 性能瓶颈和压力 ,突破IO、连接数、硬件资源等的瓶颈。
优点:
缺点:
注:分库还是分表核心关键是有没有IO瓶颈 。
分片方式都有什么呢?
RANGE(范围分片)
将业务表中的某个 关键字段排序 后,按照顺序从0到10000一个表,10001到20000一个表。最常见的就是 按照时间切分 (月表、年表)。
比如将6个月前,甚至一年前的数据切出去放到另外的一张表,因为随着时间流逝,这些表的数据被查询的概率变小,银行的交易记录多数是采用这种方式。
优点:
缺点:
HASH(哈希分片)
将订单作为主表,然后将其相关的业务表作为附表,取用户id然后 hash取模 ,分配到不同的数据表或者数据库上。
优点:
缺点:
讲到这里,我们已经知道数据库有哪些架构,解决的是哪些问题,因此, 我们在日常设计中需要根据数据的特点,数据的倾向性,数据的安全性等来选择不同的架构 。
那么,我们应该如何选择数据库架构呢?
虽然把上面的架构全部组合在一起可以形成一个强大的高可用,高负载的数据库系统,但是架构选择合适才是最重要的。
混合架构虽然能够解决所有的场景的问题,但是也会面临更多的挑战,你以为的完美架构,背后其实有着更多的坑。
1、对事务支持
分库分表后(无论是垂直还是水平拆分),就成了分布式事务了,如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价(XA事务);如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担(TCC、SAGA)。
2、多库结果集合并 (group by,order by)
由于数据分布于不同的数据库中,无法直接对其做分页、分组、排序等 *** 作,一般应对这种多库结果集合并的查询业务都需要采用数据清洗、同步等其他手段处理(TIDB、KUDU等)。
3、数据延迟
主从架构下的多副本机制和水平分库后的聚合库都会存在主数据和副本数据之间的延迟问题。
4、跨库join
分库分表后表之间的关联 *** 作将受到限制,我们无法join位于不同分库的表(垂直),也无法join分表粒度不同的表(水平), 结果原本一次查询就能够完成的业务,可能需要多次查询才能完成。
5、分片扩容
水平分片之后,一旦需要做扩容时。需要将对应的数据做一次迁移,成本代价都极高的。
6、ID生成
分库分表后由于数据库独立,原有的基于数据库自增ID将无法再使用,这个时候需要采用其他外部的ID生成方案。
一、应用层依赖类(JDBC)
这类分库分表中间件的特点就是和应用强耦合,需要应用显示依赖相应的jar包(以Java为例),比如知名的TDDL、当当开源的 sharding-jdbc 、蘑菇街的TSharding等。
此类中间件的基本思路就是重新实现JDBC的API,通过重新实现 DataSource 、 PrepareStatement 等 *** 作数据库的接口,让应用层在 基本 不改变业务代码的情况下透明地实现分库分表的能力。
中间件给上层应用提供熟悉的JDBC API,内部通过 sql解析 、 sql重写 、 sql路由 等一系列的准备工作获取真正可执行的sql,然后底层再按照传统的方法(比如数据库连接池)获取物理连接来执行sql,最后把数据 结果合并 处理成ResultSet返回给应用层。
优点
缺点
二、中间层代理类(Proxy)
这类分库分表中间件的核心原理是在应用和数据库的连接之间搭起一个 代理层 ,上层应用以 标准的MySQL协议 来连接代理层,然后代理层负责 转发请求 到底层的MySQL物理实例,这种方式对应用只有一个要求,就是只要用MySQL协议来通信即可。
所以用MySQL Navicat这种纯的客户端都可以直接连接你的分布式数据库,自然也天然 支持所有的编程语言 。
在技术实现上除了和应用层依赖类中间件基本相似外,代理类的分库分表产品必须实现标准的MySQL协议,某种意义上讲数据库代理层转发的就是MySQL协议请求,就像Nginx转发的是Http协议请求。
比较有代表性的产品有开创性质的Amoeba、阿里开源的Cobar、社区发展比较好的 Mycat (基于Cobar开发)等。
优点
缺点
JDBC方案 :无中心化架构,兼容市面上大多数关系型数据库,适用于开发高性能的轻量级 OLTP 应用(面向前台)。
Proxy方案 :提供静态入口以及异构语言的支持,适用于 OLAP 应用(面向后台)以及对分片数据库进行管理和运维的场景。
混合方案 :在大型复杂系统中存在面向C端用户的前台应用,也有面向企业分析的后台应用,这个时候就可以采用混合模式。
JDBC 采用无中心化架构,适用于 Java 开发的高性能的轻量级 OLTP 应用;Proxy 提供静态入口以及异构语言的支持,适用于 OLAP 应用以及对分片数据库进行管理和运维的场景。
ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 Sharding-JDBC 、 Sharding-Proxy 和 Sharding-Sidecar (计划中)这3款相互独立的产品组成,他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。
ShardingSphere提供的核心功能:
Sharding-Proxy
定位为透明化的 数据库代理端 ,提供封装了 数据库二进制协议的服务端版本 ,用于完成对 异构语言的支持 。
目前已提供MySQL版本,它可以使用 任何兼容MySQL协议的访问客户端 (如:MySQL Command Client, MySQL Workbench, Navicat等) *** 作数据,对DBA更加友好。
向 应用程序完全透明 ,可直接当做MySQL使用。
适用于任何兼容MySQL协议的客户端。
Sharding-JDBC
定位为 轻量级Java框架 ,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为 增强版的JDBC驱动,完全兼容JDBC和各种ORM框架 。
以电商SaaS系统为例,前台应用采用Sharding-JDBC,根据业务场景的差异主要分为三种方案。
分库(用户)
问题解析:头部企业日活高并发高,单独分库避免干扰其他企业用户,用户数据的增长缓慢可以不分表。
拆分维度:企业ID分库
拆分策略:头部企业单独库、非头部企业一个库
分库分表(订单)
问题解析:订单数据增长速度较快,在分库之余需要分表。
拆分维度:企业ID分库、用户ID分表
拆分策略:头部企业单独库、非头部企业一个库,分库之后用户ID取模拆分表
单库分表(附件)
问题解析:附件数据特点是并发量不大,只需要解决数据增长问题,所以单库IO足以支撑的情况下分表即可。
拆分维度:用户ID分表
拆分策略:用户ID取模分表
问题一:分布式事务
分布式事务过于复杂也是分布式系统最难处理的问题,由于篇幅有限,后续会开篇专讲这一块内容。
问题二:分布式ID
问题三:跨片查询
举个例子,以用户id分片之后,需要根据企业id查询企业所有用户信息。
sharding针对跨片查询也是能够支持的,本质上sharding的跨片查询是采用同时查询多个分片的数据,然后聚合结果返回,这个方式对资源耗费比较大,特别是对数据库连接资源的消耗。
假设分4个数据库,8个表,则sharding会同时发出32个SQL去查询。一下子消耗掉了32个连接;
特别是针对单库分表的情况要注意,假设单库分64个表,则要消耗64个连接。如果我们部署了2个节点,这个时候两个节点同时查询的话,就会遇到数据库连接数上限问题(mysql默认100连接数)
问题四:分片扩容
随着数据增长,每个片区的数据也会达到瓶颈,这个时候需要将原有的分片数量进行增加。由于增加了片区,原先的hash规则也跟着变化,造成了需要将旧数据做迁移。
假设原先1个亿的数据,hash分64个表,现在增长到50亿的数据,需要扩容到128个表,一旦扩容就需要将这50亿的数据做一次迁移,迁移成本是无法想象的。
问题五:一致性哈希
首先,求出每个 服务器的hash值 ,将其配置到一个 0~2^n 的圆环上 (n通常取32)
其次,用同样的方法求出待 存储对象的主键 hash值 ,也将其配置到这个圆环上。
然后,从数据映射到的位置开始顺时针查找,将数据分布到找到的第一个服务器节点上。
一致性hash的优点在于加入和删除节点时只会影响到在哈希环中相邻的节点,而对其他节点没有影响。
所以使用一致性哈希在集群扩容过程中可以减少数据的迁移。
好了,这次分享到这里,我们日常的实践可能只会用到其中一种方案,但它不是数据库架构的全貌,打开技术视野,才能更好地把存储工具利用起来。
老规矩,一键三连,日入两千,点赞在看,年薪百万!
本文作者:Jensen
7年Java老兵,小米主题设计师,手机输入法设计师,ProcessOn特邀讲师。
曾涉猎航空、电信、IoT、垂直电商产品研发,现就职于某知名电商企业。
技术公众号 【架构师修行录】 号主,专注于分享日常架构、技术、职场干货,Java Goals:架构师。
交个朋友,一起成长!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)