在计算机发展的早期,一直都是集中式计算,计算能力依赖大型计算机。随着互联网的发展,繁重的业务需要巨大的计算能力才能完成,而集中式计算无法满足要求,大型计算机的价格也非常昂贵。分布式计算将任务分解成更小的部分,分配给多台计算机处理,这样可以节约整体计算时间,大大提高计算效率。
互联网大型网站往往面临高并发访问、海量数据处理等问题,必须保证系统高可用、易伸缩等等。分布式架构采用多台机器协同工作,动态伸缩容量,使用冗余节点来消除单点故障,提高系统可用性。
软件开发没有银弹,任何系统结构都有利有弊,分布式系统的挑战有三点:
分布式系统的三个特性Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性),最多只能同时满足其中两个,三者不可兼得。
大型互联网应用的集群节点非常多,发生节点或者网络故障是常态。系统必须要满足分区容错性,最终只能在C和A之间取舍。
传统行业项目有所不同,以金融系统为例,涉及到金钱的操作,必须要满足数据一致性。出现网络故障宁可停止服务,也要保证C,最终只能在A和P之间取舍。
CAP理论并不能很好的指导现实的系统架构。比如Availability (可用性),如果接口长时间才返回结果,固然可用,但是业务上不能接受。大部分情况下,系统分区都是平稳运行的,系统设计要权衡延迟与数据一致性的问题。为了保证数据一致性,读写的延迟必然升高。
在分区错误的情况下,在C和A中取舍,缩写为 PAC。分区正确的情况下,取 Latency(延迟)与 Consistency(一致性),缩写为LC。PACELC 中的 E 代表 Else,连起来就是PACELC。
很多存储软件实现了 PACELC 的策略,用户根据不同业务场景使用不同的配置。以MySQL主从复制为例,提供了三种模式:
BASE模型全称是Basically Available(基本可用)、Soft-state(软状态/柔性事务)、Eventually Consistent(最终一致性)。绝大部分分布式系统,实现分区容忍性是基本要求,因此要平衡一致性和可用性。BASE强调牺牲高一致性,获得可用性。允许数据在一段时间内不一致,只要保证最终一致就可以了。
分布式系统中的数据一致性问题,是系统设计中最关键、最有难度的领域,业界提出了很多成熟的一致性共识算法。
1998年,莱斯利·兰伯特(Leslie Lamport)在《The Part-Time Parliament》论文中首次公开Paxos协议。他使用希腊的小岛Paxos作为比喻,描述了Paxos小岛中通过决议的流程。2001年,Lamport重新发表了朴实的算法描述版本《Paxos Made Simple》。
由于Paxos算法太难以理解和实现,斯坦福大学的 Diego Ongaro 和 John Ousterhout 提出了更容易理解的 Raft 算法。相比传统的 Paxos 算法,Raft 将大量的计算问题分解成简单的相对独立的子问题,并且和 Multi-Paxos 有同样的性能,
有兴趣的朋友,可以看看Raft算法的动画演示。
ZAB协议全称 Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。分布式协调服务ZooKeeper设计了支持崩溃恢复的一致性协议。基于该协议,ZooKeeper 实现了一种主从模式的系统架构来保持集群中各个副本之间的数据一致性。从设计上看,ZAB 协议和 Raft 很相似。

数据库是一个悠久历史的行业,从诞生到现在也有接近五十年的历史了。数据库一直在技术、业务以及应用场景等方面不停地演进和发展。上世纪九十年代,针对个人办公、个人娱乐以及企业信息化的场景,基于X86服务器诞生了像MySQL、MS SQL Server这些著名的关系型数据库。
NoSQL数据库是由于互联网业务的诞生而产生的。2006年,谷歌引入了BigTable,后续出现了HBase、Cassandra、MongoDB和Redis,这些数据库都是由不同的底层数据组织形式去解决不同的问题。在2010年前后,谷歌又引入了以Spanner为代表的新产品,出现了F1、SequoiaDB、TiDB等NewSQL数据库,使用SQL解决应用性问题,也保留了NoSQL的可扩展性问题。
NoSQL数据库是为了解决传统关系型数据库的弊端,它有四个特点:
从业务场景来看,数据处理可以分为OLTP和OLAP。这两种场景采用何种数据库,取决于开发人员的技术水平和经验。通常来说,OLTP采用强一致性的关系型数据库,OLAP采用NoSQL或者列式数据库。
OLTP为联机事务处理,主要用来记录业务事件的发生。当行为产生后,系统记录事件是谁在什么时候什么地方做了什么事,在数据库中进行数据的增删改查,要求高实时性、强稳定性、数据一致性。
OLAP为联机分析处理,侧重大数据量查询。当业务发展到一定程度,要利用离线数据做分析,为决策提供支持。
MongoDB是一个面向文档的数据库,以JSON格式存储数据。它主要用于网站的数据存储、内容管理与缓存应用。MongoDB支持全文检索,查询方式非常丰富,在数据处理与聚合等方面具有很强的灵活性,同时具备极高的扩展性和可用性。
Cassandra是一套开源分布式数据库系统。最初由Facebook开发,用于储存收件箱等简单格式数据,集Google BigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身。由于Cassandra良好的可扩展性,被Digg、Twitter等知名Web 2.0网站所采纳,成为了一种流行的分布式结构化数据存储方案。
CouchDB是一个面向文档的数据库,以JSON格式存储数据。CouchDB可以用于存储网站的数据与内容,以及提供缓存等。支持通过JavaScript在CouchDB上运行MapReduce查询。CouchDB还提供了一个非常方便的基于Web的管理控制台。
Redis是一个内存中的键值数据库。Redis具备存储和操作高级数据类型的能力。这些数据类型是大多数开发人员熟悉的基本数据结构(列表、映射、集合)。Redis的读写数据的效率极高,远远超过常规数据库,常常用于大型项目的缓存层。
HBase 是一个面向列式存储的分布式数据库,其设计思想来源于 Google 的 BigTable 论文。HBase 底层存储基于 HDFS 实现,集群的管理基于 ZooKeeper 实现。HBase 良好的分布式架构设计为海量数据的快速存储、随机访问提供了可能,基于数据副本机制和分区机制可以轻松实现在线扩容、缩容和数据容灾,是大数据领域中 Key-Value 数据结构存储最常用的数据库方案。
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它提供了一个多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。
ClickHouse 是俄罗斯的Yandex(类似百度)开源的列式存储数据库,主要用于在线分析处理查询,能够使用SQL查询实时生成分析数据报告。使用场景与Elasticsearch类似,甚至有更高的性能。
Oracle是全球最大的信息管理软件及服务供应商,总部位于美国加州Redwoodshore。Oracle数据库产品为财富排行榜上的前1000家公司采用,是最知名、使用最广泛的企业数据库。
DB2是IBM公司开发的关系数据库管理系统,主要用于大型应用系统,具有较好的可伸缩性 。DB2是IBM推出的第二个关系型数据库,所以称为DB2。它提供了高层次的数据利用性、完整性、安全性、并行性、可恢复性,以及小规模到大规模应用程序的执行能力,具有与平台无关的基本功能和SQL命令运行环境。可以同时在不同操作系统使用,包括Linux、UNIX 和 Windows。
Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理。Microsoft SQL Server数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序。
MySQL是使用最广泛的开源关系型数据库,由瑞典MySQL AB公司开发,现在已被 Oracle收购。MySQL与常用的主流数据库Oracle、SQL Server相比,特点就是免费,并且在任何平台上都能使用,占用的资源较小,受个人用户以及中小企业青睐。对于大型项目来说,MySQL的承载能力和安全性就略逊于Oracle数据库。
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB来代替MySQL的InnoDB。MariaDB名称来自创始人Michael Widenius的女儿Maria的名字。
PostgreSQL 是一个强大的开源对象关系数据库系统,它使用并扩展了SQL语言,并结合了许多安全存储和扩展最复杂数据工作负载的功能。PostgreSQL的起源可以追溯到 1986 年作为加州大学伯克利分校POSTGRES项目的一部分。PostgreSQL的架构、可靠性、数据完整性、功能集、可扩展性得到充分的验证,开源社区也非常活跃。它是最接近工业标准SQL92的查询语言,至少实现了SQL:2011标准中要求的179项主要功能中的160项(注:目前没有哪个数据库管理系统能完全实现SQL:2011标准中的所有主要功能)。
TiDB是PingCAP公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing,HTAP)的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 协议和MySQL生态等重要特性,为用户提供一站式 OLTP (Online Transactional Processing)、OLAP (Online Analytical Processing)、HTAP 解决方案。TiDB适合高可用、强一致要求较高、数据规模较大等各种应用场景。
TiDB是腾讯在Postgres-XC基础上开发的数据库。Postgres-XC(eXtensible Cluster)是一个提供写可扩展、同步、对称的和透明的PostgreSQL群集解决方案的开源项目。相较于Postgres-XC,TBase的稳定性得到了较大提高,通过在内核中引入GROUP概念,提出了双Key分布策略,有效地解决了数据倾斜的问题。它根据数据的时间戳,将数据分为冷数据和热数据,分别存储于不同的存储设备中,有效地解决了存储成本的问题。
OceanBase是由蚂蚁集团自主研发的企业级分布式关系数据库,始创于2010年。OceanBase在TPC-C和TPC-H测试上都刷新了世界纪录的国产原生分布式数据库。OceanBase具有数据强一致、高可用、高性能、在线扩展、高度兼容SQL标准和主流关系数据库、低成本等特点。
SequoiaDB巨杉数据库是一款金融级分布式关系型数据库,主要面对高并发联机交易型场景提供高性能、可靠稳定以及无限水平扩展的数据库服务。用户可以在 SequoiaDB 巨杉数据库中创建多种类型的数据库实例,以满足上层不同应用程序各自的需求。SequoiaDB 巨杉数据库支持 MySQL、MariaDB、PostgreSQL 和 SparkSQL四种关系型数据库实例、JSON文档类数据库实例、以及 S3对象存储的非结构化数据实例。
https://www.yisu.com/zixun/323416.html
https://blog.csdn.net/qq_16933229/article/details/109729522
https://www.jianshu.com/p/794ba6b42dcc
https://www.cnblogs.com/lidabo/p/15822815.html
https://blog.csdn.net/qq_31960623/article/details/116308332
https://www.cnblogs.com/lidabo/p/15822815.html
https://blog.csdn.net/qq_43413788/article/details/119171555
https://blog.csdn.net/yuhaiyang_1/article/details/80862914
https://blog.csdn.net/TJtulong/article/details/106510970
https://blog.51cto.com/u_14637492/5260036
我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实
在Ruby中,以毫秒为单位获取自纪元(1970)以来的当前系统时间的正确方法是什么?我试过了Time.now.to_i,好像不是我想要的结果。我需要结果显示毫秒并且使用long类型,而不是float或double。 最佳答案 (Time.now.to_f*1000).to_iTime.now.to_f显示包含十进制数字的时间。要获得毫秒数,只需将时间乘以1000。 关于ruby-以毫秒为单位获取当前系统时间,我们在StackOverflow上找到一个类似的问题:
我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails
关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和
我正在尝试找出一种方法来显示来自不在RAILS_ROOT下(在RedHat或Ubuntu环境中)的已安装文件系统的图像。我不想使用符号链接(symboliclink),因为这个应用程序实际上是通过Tomcat部署的,而当我关闭Tomcat时,Tomcat会尝试跟随符号链接(symboliclink)并删除挂载中的所有图像。由于这些文件的数量和大小,将图像放在public/images下也不是一种选择。我查看了send_file,但它只会显示一张图片。我需要在一个格式良好的页面中显示6个请求的图像。由于膨胀,我宁愿不使用Base64编码,但我不知道如何将图像数据与呈现的页面一起传递下去。
当您在Ruby脚本中使用系统调用时,您可以像这样获得该命令的输出:output=`ls`putsoutput这就是thisquestion是关于。但是有没有办法显示系统调用的连续输出?例如,如果您运行此安全复制命令,以通过SSH从服务器获取文件:scpuser@someserver:remoteFile/some/local/folder/...它显示随着下载进度的连续输出。但是这个:output=`scpuser@someserver:remoteFile/some/local/folder/`putsoutput...不捕获该输出。如何从我的Ruby脚本中显示正在进行的下载进度?