基础普及之什么是分布式SQL
译文2019-12-13 08:00:00本文向您介绍分布式SQL的基本概念,其对应的数据库架构,以及对于业务应用的各种优势。
【51CTO.com快译】在过去的近40年中,SQL已经成为了关系型数据库(又称为RDBMS)的通用语言。这也就是为什么关系型数据库经常被简单称为SQL数据库的原因。从架构而言,以Oracle、PostgreSQL和MySQL为首的传统SQL数据库,是单体式(monolithic)的。也就是说,它们无法在多个实例之间自动地分配数据和查询。而NewSQL数据库的出现使得SQL具有了可扩展性和高性能。当然,此类数据库仍然具有与生俱来的局限性。
2015年,docker容器和Kubernetes编排的出现,让我们能够以灵活、可组合的基础架构方式,来创建各种基于微服务的应用。其中,内置的可扩容性、灵活性、以及地理分布特性,是此类云原生架构的核心特点。这也就是人们常说的“分布式SQL”–这一新型的数据库。在应用方面,此类分布式SQL数据库的一个显著特征是:无论其中有多少个节点,整个数据库集群对于应用程序而言,都被其视为一个逻辑的SQL数据库。
数据库的架构
分布式SQL数据库通常具有如下三层体系结构。
顾名思义,分布式SQL数据库仍然必须提供SQL API服务,以便应用程序可以对关系型数据进行建模,并执行涉及到各种关系信息的查询操作。它保留了SQL数据库典型的数据建模结构,包括:索引、外键约束、JOIN查询、以及多行ACID事务(译者注:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability))。
2.分布式查询执行
由于分布式SQL的查询能够被自动地分配到目标群集的多个节点上,因此,此举有效地避免了单个节点成为查询处理中的瓶颈问题。具体的查询流程为:目标群集中的任一节点都可以接受传入的某个查询。通过在网络中的各节点之间传输数据、协同工作,该节点能够以最小化处理等待时间的方式,仅分担查询请求中的一部分任务。而由其他节点协助完成剩余的部分。最后,该接受请求的原始节点,将汇总所有的查询结果,并发回给客户端应用程序。
3.分布式数据存储
那些包含有索引信息的数据会被自动分布(也称为分片,sharded)到群集的多个节点处。此举确保了单个节点都不会成为高性能和高可用性的瓶颈。此外,数据库集群能够支持高一致性的复制、以及多行(也称为分布式)ACID事务,进而保留了单个逻辑数据库的基本概念。
高度一致性的复制
在数据库的管理概念中,所谓支持强大的SQL API层,其本质上就是要求处于底层的存储层,能够在跨数据库的群集节点上建立强一致性的复制。这就意味着:对于数据库的写入操作,将会在多个节点上被同步提交,以保证出现故障时的数据可用性。而读取操作则是基于最后一次被提交的写入数据,或是出错之前的数据。该属性通常被称为线性一致性(Linearizability,。根据著名的CAP原则(,译者注:一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)),分布式SQL数据库具有一致性和分区容错性。
分布式的ACID事务
为了能够支持分布式的ACID事务,分布式数据库的存储层需要在多个节点的多个数据行中进行事务性的协调任务。此处,它们正好用到了两阶段提交(2 Phase Commit,2PC)协议。参照ACID中I(隔离性)的要求,为了能够对并发式的数据访问实现严格的隔离,分布式SQL数据库将可序列化性(Serializability,作为最严格的隔离级别,并且通过快照(Snapshot)之类的其他方式来支持较弱的隔离级别。
业务应用的优势
分布式SQL的四个关键优势,如下图所示。
1.让SQL和事务类的开发更具敏捷性
如今,由于SQL仍然是一种轻松实现建模关系和多行操作的数据建模语言,因此为了满足应用开发人员持续对于SQL数据库的操作习惯与需求,即便是Amazon DynamoDB、MongoDB和FaunaDB之类的NoSQL数据库,也开始具备了事务性的操作能力。例如:SQL通过显式(使用BEGIN和END TRANSACTION的语法)和隐式(使用外键和JOIN查询之类的二级索引),来允许多行事务,这比传统的键-值(key-value)型NoSQL要方便得多。
此外,开发人员往往喜欢通过一次性轻松地使用SQL,来对数据(和存储)进行建模。而在业务需求发生变化时,他们只需修改JOIN,便可反映到查询之中。
2.具有本地故障转移与修复的超强弹性
在分布式SQL数据库中,我们使用基于分片(per-shard)的分布式共识复制(consensus replication)等技术,来确保每个分片(而不是每个实例)在出现故障时,仍可保持高可用性。
如此,基础架构一旦出现故障,它始终只会影响到目标数据的某个子集(也就是那些被leader分割开的碎片),而不会影响到整个集群。并且,由于剩余的分片副本能够在几秒钟之内自动地选出新的leader,因此,集群会在出现故障时表现出一定的自我修复能力。
此外,这些发生在后台群集配置上的更改对于应用程序来说是完全透明的,它们可以照常运行,而不会出现任何中断或是性能的骤降。
3.具有按需进行水平写入的可扩展性
《如何在分布式SQL数据库中进行数据分片》一文(,说明了开发人员通常是如何在分布式SQL数据库中实现自动化数据分片的。无论有新节点的加入,还是现有节点的删除,分片都将会在所有可用节点之间保持自动的平衡状态。
目前,那些需要处理事务的应用程序都具有可扩展能力的微服务。它们在不需要新增基础架构的基础上,完全可以直接依赖于内存中的缓存(无需从数据库中读取请求,而保留对于写入请求的处理)或NoSQL数据库(虽然能够扩展写入操作,但是无法保证ACID)。
4.针对地域分布式数据的低延迟性
正如《构建具有低延迟的云原生、以及地域分布式SQL应用的9种技术》一文(所强调的那样:分布式SQL数据库可以提供多种技术,来构建地域分布式的应用程序。这些技术不仅有助于对于区域性故障实现自动化容灾,而且还能够在一定程度上通过让数据更接近来自本区域的最终用户,以实现更低的数据延迟性。
oracle数据库sql命令怎么改
oracle中修改数据用update语句。语法:UPDATE 表名 SET 字段=XXX WHERE 条件;如,数据库中,test表数据如下:现在要将王五的名字改成王九,可用如下语句:update test set where;commit;执行后结果:
下列软件中属于应用软件的是( ) A. 操作系统 B. 编译程序 C. 数据库管理系统 D. 财务管理系统
选D、财务管理系统。 A、操作系统 B、编译程序 C、数据库管理系统三个选项都是指系统软件。 系统软件为计算机使用提供最基本的功能,使得计算机使用者和其他软件将计算机当作一个整体而不需要顾及到底层每个硬件是如何工作的。 扩展资料:应用软件的用途分类:1、办公室软件:文书试算表程式投影片报告数学程式创建编辑器绘图程式基础数据库档案管理系统文本编辑器。 2、互联网软件:即时通讯软件电子邮件客户端网页浏览器客户端下载工具。 3、商务软件:会计软件企业工作流程分析客户关系管理Backoffice企业资源规划供应链管理产品生命周期管理4、分析软件:计算机代数系统统计软件数字计算计算机辅助工程设计5、多媒体软件:媒体播放器图像编辑软件音讯编辑软件视讯编辑软件计算机辅助设计计算机游戏桌面排版参考资料来源:网络百科-软件参考资料来源:网络百科-应用软件
如何成为一名合格的程序员?

程序员可以分为很多种,像Unix程序员、Windows程序员,或是C++程序员、Delphi程序员,等等。 今天我想谈的是Web程序员,一名真正的Web程序员应该懂得那些方面的知识,应该注意学习哪些东西。 也许有些朋友会说,我知道Asp、Jsp,会做网站、会做bbs,这应该叫Web程序员了吧。 确实,我承认,这些技术是一名Web程序员应该具备的;但是,你如果仅懂得这些,却只能叫做Asp程序员、Jsp程序员,而不是真正意义上的Web程序员。 现在的世界是属于Internet的,大部分的应用基于Internet,大家可以想想,像Yahoo、Microsoft、Amazon那样的网站,其访问量之大、应用之复杂,需要什么样的技术才可以支撑,难道仅仅是硬件的功劳么。 我想在Windows平台下来谈谈Web程序员应该掌握的技术1. 首先,就是上面提到的各种脚本,asp、jsp、php等等,这些东西大同小异,基本可以举一反三。 2. 数据库,相信做Web的人肯定用过,像Access、Sql Server、Oracle。 很多人会用各种数据库,但是仅限于写一些sql,select、update、insert,用ADO来操作,如果这样,就算会用100种数据库又有什么用呢?你应该考虑用户量、访问速度、内存消耗,这些东西和你的sql密切相关,我经常见到很多分页程序根本不去考虑数据库中有多少条数据,统统select出来,很明显,当你从数据库中查出1万条数据和100条数据,占用的内存是不同的。 另外,数据库连接池和事务机制是非常重要的,应该知道数据库用什么来保证事务,连接池如何实现,这些都是商务应用的关键。 譬如,目前很多的应用服务,像weblogic、MTS,都包含事务处理,可以说好的事务处理决定了他们的竞争力。 3. 组件技术我想是现在的Web应用推动了组件技术的发展。 以前,从老式的静态库、动态库(dll),到现在的COM/DCOM,再到正在兴起中的Web Service;从单机调用,到基于内部网的分布式调用,到现在基于Internet的分布式计算。 现在的应用都是基于组件的n层结构,最明显的就是COM和JavaBean。 这些东西体现了软件架构的发展,以前是基于单机的应用,然后是C/S结构,到现在的B/S结构。 我记得李维曾经说过,程序员一定要注意软件技术的发展趋势,只有这样,才不至于被淹没在技术的洪流中。 我想,作为Web程序员,一定要明白COM的原理,如何实现这种调用、如何进行分布式调用。 说实话,我觉得COM还是比较复杂的,否则微软为什么要提供ATL和VB呢,要搞明白,应该学学C++,因为VC中提供的ATL库可以很明显的说明COM的内部运行机制。 4. 网络技术这可以说是Web程序员最应该懂得东西。 起码,应该知道Web服务器的机制,要明白Http协议。 就拿IIS来说,要懂得web应用程序运行的进程安全和IIS的关系,懂得ISApi的作用。 如果有时间,就看看TCP/IP,看看winsock,这些都是底层的网络的东西。 我所说的这些都是基于微软技术下的东西,其他的像Java方面的东西都可以对照参考,就不多说了,这也是我这几年来的一些心得。 总之,学海无涯,每当接触一些新的东西,就会发现自己的不足,同时也就觉得基础知识的重要。 说实话,像我们做应用开发,用别人的东西,在现在这种情况下,新的技术层出不穷,稍不注意就会被甩开,这也是没有办法的事情。
发表评论