数码资讯
海量数据的MySQL存储和访问解决方案
第一章绪论 随着互联网应用的广泛普及,海量数据的存储与访问成为系统设计中的一个瓶颈。对于一个大型的互联网应用,光伏数十亿每天无疑是造成相当大的负荷,数据库系统的稳定性和可扩展性都造成了很大的问题。通过数据分割提高网站的性能,数据层的横向扩展的架构已经成为研发人员的首选方法。分割数据库水平,可以降低单
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
第一章绪论
随着互联网应用的广泛普及,海量数据的存储与访问成为系统设计中的一个瓶颈。对于一个大型的互联网应用,光伏数十亿每天无疑是造成相当大的负荷,数据库系统的稳定性和可扩展性都造成了很大的问题。通过数据分割提高网站的性能,数据层的横向扩展的架构已经成为研发人员的首选方法。分割数据库水平,可以降低单台机器的负载,并减少停机时间所造成的损失。负载均衡策略,有效降低单机访问负载,减少停机时间的可能性;通过集群方案,解决了单点数据库无法访问的问题,停机造成的数据库;通过阅读和写作的策略是最大限度的分离应该通过阅读速度的提高(读)和并行数据的数量。目前,大量的数据分割方案在中国大型互联网应用采用。淘宝、阿里巴巴和腾讯主要实现自己的分布式数据访问层(ddal),执行和实施水平是分为两个层次(java应用为例):对JDBC层的封装和ORM框架层的实现,JDBC的直接封装,一个开发项目更好的在中国被称为阿米巴。它是由阿里集团研究所开发的。目前仍在测试阶段(测试版),其运行效率和生产时效性有待于进一步的研究。对ORM框架层的实现,如淘宝的分布式基于iBATIS和Spring数据访问层,它已应用多年,和生产效率已由开发人员和用户的肯定。本文是基于ORM框架层的分布式数据访问层,位于池困难,路由规则和膨胀后,选择如:如何做数据迁移量最少,扩大数据库的容量(添加机节点)来。问题的核心路由规则在数据库表库和负载balancinG策略。
第二章的基本原理和概念
2.1项基本原则:
人类认知问题的过程总是相同的:什么(什么)-为什么(为什么)-为什么(为什么)
接下来,本文将对三个问题进行探讨和研究:
2.1.1数据分割是什么
单词碎片的英文意思是片段分片被称为片。Sharding并不是一个新技术,但是一个相对简单的软件的概念。每个人都知道,MySQL 5之前的分区功能的数据表,在那之前,MySQL的许多潜在用户推广MySQL的担忧,以及他们是否有分区函数衡量一个数据库可扩展与否的关键指标(当然不是唯一的指标)数据库的可扩展性是一个永恒的话题。MySQL的发起人经常会被问到:我们如何处理单个数据库上的应用程序数据和分区等等答案是分片。Sharding不是一个具体的数据库软件的附属功能,但在摘要上面的具体技术细节,是水平扩展(规模,或横向延伸,向外扩展)的解决方案,其主要目的是打破了传统的单节点数据库服务器我 / O数据库解决可扩展性问题的能力。
通过一系列的分割规则,数据被分配到不同的DB或表级别。通过查找对应的数据库表路由或路由规则,我们可以找到具体的数据库或表的查询的查询操作,分片描述这里通常指的是水平分割,这是本文的重点。什么样的分割和路由将具体在这一点上,读者肯定会产生怀疑。下面是一个简单的例子:让我们在blog应用程序中说明一个日志,例如,文章列有以下字段。
article_id(int)、标题(varchar(128))、内容(varchar(1024)),user_id(int)。
面对这样一张桌子,我们该如何分割呢如何在不同数据库中的表中分发这些数据事实上,对博客应用的分析并不难得出这样的结论:在博客的应用中,用户分为两类:浏览器所有者和博客所有者,浏览博客的浏览器实际上是在特定用户的博客下浏览。而博客的主人管理自己的博客,它还经营特定用户博客下(在自己的空间)。所谓特定用户与数据库的字段表示,是user_id.this是user_id的基础,这是我们需要的库和规则为基础的。我们能做到这一点,把所有的文章信息user_id 1 ~ 10000到DB1第表,把user_id 10001 ~ 20000所有物品到DB2第表,等等,直到DBN。因此,本文数据自然分成各种数据库实现数据分割的目的。下一步需要解决的问题如何找到一个特定的数据库事实上,这个问题很简单,因为当我们使用游泳池区分领域user_id,所以数据库路由过程肯定不user_id.consider博客应用我们刚刚提出,无论是在博客或他人管理自己的博客,我知道博客的用户是谁,知道随着博客的user_id,user_id库,利用时间的规则,进而找到特定的数据库,如user_id 234,唯一的规则,它应该位于user_id DB1,如果是12343,唯一的规则,它应该位于DB2。利用图书馆的规则,等等,路线回到具体的数据库,这一过程称为DB路由。
当然,考虑到数据分割的DB设计必然是一种非传统的、非正统的DB设计。那么,什么样的DB设计是一种正统的DB设计
我们通常使用的一般规律。通常我们会自觉按照范式来设计我们的数据库,可以考虑高负荷的复制机制来提高读写的吞吐率和使用性能,这可能已经能够满足多方面的需求,但这一机制本身的缺陷是很明显的(下面提到的)。上述意识是根据范例。考虑数据库设计的数据分割,通常会违反分割的规则和限制,我们必须出现在数据库表中的冗余字段,作为标签领域不同的领域,或者叫池,如在这一领域的第user_id以上例子(当然,这个例子是没有不能很好的反映冗余,user_id user_id因为这场甚至没有图书馆,但也出现了,我们是捡便宜)。当然,不仅是在冗余池现场场的出现,在许多大型应用中,冗余是必要的,这涉及到高效的数据库设计,本文将不重复。
2.1.2为什么数据分割
什么是数据分割的摘要描述和解释,读者可能会问,为什么需要数据分割像Oracle这样的成熟而稳定的数据库足以支持海量数据的存储和查询吗为什么需要数据切片事实上,甲骨文的数据库是真的成熟和稳定,但使用和高端硬件支持成本高,没有一个公司可以负担得起的。想象一下,一年的使用费用和小千万千万小型机作为硬件支持,这是通用公司能付得起吗即使我们能支付得起,如果有更好的解决方案,有一个更便宜更好的能力,更好地扩大性能,我们为什么不选择
但事情总是不尽人意。通常我们会自觉按照范式来设计我们的数据库,可以考虑高负荷的复制机制来提高读写的吞吐率和使用性能,这可能已经能够满足多方面的需求,但这一机制自身的缺陷是很明显的。首先,它有效地在读操作比很依赖,主人往往成为瓶颈,写操作需要排队如果硕士第一不能进行过载,延迟也可能比较大的计算能力和数据同步的奴隶,会大大消耗CPU,因为写操作完成后或在每个奴隶是掌握切分可能运行。鸡肋此时。复制是不确定的,所以可以分片的工作吗真理是简单的,因为它可以延长。我们知道,无论多么好的每台机器的配置有其自身的物理极限,所以当我们有一个应用可以触及或超越单一的机器,我们必须找到其他的机器来帮助或继续升级我们的硬件,但最常见的方案或横向扩展,通过添加更多的机器来承受压力。我们还必须考虑如果我们的业务逻辑越来越多,可我们的机器满足线性增长的需求Sharding can easily distribute computing, storage and I/O to multiple machines, so that we can make full use of all kinds of processing capabilities of multiple machines, while avoiding single point failures, providing system availability and doing very good error isolation.
结合以上因素,数据分割是必要的,我们在这里讨论的数据分割是MySQL的背景,基于成本的考虑,许多公司还选择自由和开放的MySQL,了解MySQL的开发者可能会知道,MySQL 5之前的分区功能的数据表,在那之前,MySQL的许多潜在的用户扩展到MySQL的担忧,以及他们是否有分区函数衡量一个数据库可扩展与否的关键指标(当然不是唯一的指标)。数据库的可扩展性是一个永恒的话题,MySQL的推广常常问:如果在一个单一的数据处理应用和拉伸力治疗需要数据库分区E,怎么回答是分片,也就是我们所说的数据分割方案。
我们利用免费的MySQL和廉价的服务器甚至PC集群,实现了小型机+大型商用DB的效果,减少了大量的资金投入,降低了运营成本。为什么不呢所以,我们选择Sharding和拥抱的碎片。
2.1.3如何实现数据分割
当涉及到数据分割时,我们再次详细地解释和解释数据分割的方法和形式。
数据分割可以是物理的,数据通过一系列的分割规则将分布在DB服务器上的不同数据,通过路由规则访问特定的数据库,这样每次访问的时候脸不是单一的服务器,而是N个服务器,它可以减少单机的负载压力。
数据分割也可以在数据库中,通过一系列的分割规则的数据分布的数据到一个数据库中,不同的表为例,文章分为article_001,article_002等多个子级分逻辑包括一个完整的文章的形式,这样做的目的其实是很简单。例如,例如,文章表现在包含5000w数据,我们需要在这个表中增加(插入)是一种新的数据插入数据库后,将重新索引,根据此表,5000w数据索引的系统开销还是不可忽视的。相反,如果我们把桌子放到100表,从article_001到article_1005000w数据平均,每个子表里面只有50万ROWS的数据,那么我们只有50W的插入数据行的索引表的数据后,时间会降低幅度,大大提高了数据库的运行效率,提高了数据库的并发性。当然,在子表的好处是未知的,以及锁定操作,如写操作,这将带来很多明显的好处。
总之,在单点机的减载下,提高了数据的运算效率,尤其是写的操作效率,在这一点上我们仍然没有关于如何切割的问题,接下来,我们将详细地阐述和解释分词规则。
以上所提到的,为了达到分割数据的水平,有多余的字符在每个表分割阶段和标签领域的基础上,我们user_id通常用来作为基于本领域的区别,它具有以下三个池和规则:(当然还可以有其他的方式)
按数分段:
(1)user_id是有区别的,和1 ~ 1000对应的db11001 2000相应的DB2,等等;
优势:部分迁移
缺点:数据分布不均
(2)哈希模型:
哈希user_id(或者user_id是数字类型如果user_id值也可以直接),然后用一个具体的数字,如数据库应用程序需要被切割成4个数据库,我们使用hash 4和user_id值运算的数量,这是user_id % 4,然后每个操作将有四个可能的结果是:1当2相应的DB1的结果;当结果为3时,相应的DB2;结果是0时,对应DB3;db4,非常均匀地分布数据为4分贝。
优点:数据分布均匀
缺点:数据迁移的麻烦和不可分摊根据机器性能
(3)将数据库配置保存在身份验证库中
它是建立一个数据库。该数据库保持映射关系从user_id DB。每次访问数据库时,我们首先需要查询数据库以获得特定的数据库信息,然后才可以进行我们需要的查询操作。
优势:强弹性,一对一关系
缺点:每次查询前多查询一次,性能大打折扣。
以上是我们在共同开发中所选择的三种方式,一些复杂的项目可能与这三种方式相混合,通过以上的描述,我们对规则的认识也有了简单的理解,当然也会有更好的方法来汇集,我们也需要不断的探索和发现。
第三章研究的基本概况
在whatwhyhow方式,阐述了一些概念和数据库分割的含义,并给出了一些常规的分割规则简介分布式数据层在讨论这个话题不仅是相同的,它是一个完整的数据层解决方案。到底是什么样子接下来,我将阐述本课题的完整思路和实现。
分布式数据方案提供如下功能:
(1)设置规则和路由规则(routerule或RR),上述三个细分规则直接嵌入到系统中,具体的方式嵌入了以下内容的探讨;
(2)引入组的概念,以确保数据的高可用性。
(3)负载均衡策略(简称LoadBalancePolicy)介绍。
(4)引入簇节点可用性检测机制,定期检测单点机器的可用性,保证正确实现LB策略,保证系统的高稳定性。
(5)引入读/写分离,提高数据查询速度。
只是分区表数据层设计不完善,当某个节点在DB服务器上出现故障时,会是什么样的呢是的,我们使用了数据库分割方案,即N台机器来形成一个完整的DB,如果有一台机器停机,它只不过是一个DB数据访问而已,它对我们来说是可以接受的,至少在很多情况下都是好的,不像整个DB那样可以访问。假设我们的系统是一个高度并行的电子商务网站造成单节点机停机的经济损失是非常严重的。也就是说,还有在我们的方案中的一个问题,和容错性能是经不起考验的。当然,总是有一个解决问题的办法。我们引入了集群的概念,我称之为组,即每个节点在一个池我们引进多台机器,每台机器上保存的数据是相同的,在正常情况下,机器的负载共享,停机时,负载平衡器将分配给机器的停机时间的负荷。因此 uff0c
解决了容错的问题,因此我们引入了集群的概念,并将其放在我们的框架内,成为框架的一部分。
如上图所示,整个数据层是由三簇,1,2和3。这三个簇是数据级分割的结果。Of course, the three clusters form a DB containing complete data.Each Group includes 1 Master (of course Master can also be multiple) and N Slave, which is consistent with the Master and Slave data.For example, a slave Group1 in the occurrence of downtime phenomenon, so there are two slave can be used, so the model is always a part of data cannot be accessed without causing problems, unless the entire Group machines all down, but considering the probability of happening is very small (unless it is off, otherwise it is not easy to happen).
在介绍集群,查询过程如下:我们要求数据层之间的转移,和银行领域的必要的区分(通常user_id)数据层根据现场具体区分路线数据库数据操作设定分贝。这是一个集群的缺失。在那时引入一个集群是什么样子的呢正如你可以看到的图片,我们只能路由规则和政策,我们的路由器的特定群体,也就是说,我们只能路由到一个虚拟组,这是不是一个特定的物理服务器。接下来要做的是找到特定的数据,操作一个特定的物理数据库服务器的基础上。这一环节的要求,我们引入了负载均衡器的概念(LB),负载均衡器的任务是找到一个特定的数据库服务器,具体规则如下:负载均衡器将分析当前的SQL的读写特性。如果是写操作或需要实时操作,它将直接加载查询负载给主。如果读操作,通过负载均衡策略分配一个从站,我们的负载均衡器的主要研究方向是负载分配策略。通常,负载均衡包括随机负载均衡和加权负载均衡。随机负载平衡是一个很好的理解从n奴隶奴隶的随机选择。这样的随机负载平衡不考虑机器的性能,和它的默许,每台机器的性能是相同的。如果实际情况是这样,就不可能这样做。如果不是这样的话吗每个奴隶的物理机的性能和配置是不一样的,然后用随机不考虑负载平衡性能,不是很科学,这样的机会给机器的性能差而导致不必要的高负荷,甚至导致宕机的风险,和高性能的数据库服务器不能充分发挥物理性能。基于这样的考虑,我们引入了加权负载均衡,这是我们的内部系统通过接口,你可以权衡每一个数据库服务器,然后运行LB根据集群中的比重,有一定比例的数据库服务器的负载分布。当然,这一概念的引入将无疑增加了系统的复杂性和可维护性,一定会有损失,我们无从逃生。
有一个库,一个集群,一个负载平衡器,不是所有的都会好的。事情远没有我们想象的那么简单。在这些东西之外,基本上可以保证我们的数据层可以承受很大的压力,但不能完全避免伤害,设计数据库的停机时间。如果1 slave2下来,所以LB系统并不知道,这是非常危险的,因为LB不不知道,它会认为slave2是可用的,所以将被分配到slave2负荷。这样,问题就来了,和客户自然容易对数据操作失败的错误或异常,这是非常不友好的!如何解决这样的问题我们介绍了集群节点的可用性检测机制,以及数据推送机制的可用性,这两种机制之间的区别是什么第一个说:检测机制,顾名思义,即使检测是我的数据层、客户端,每个数据库集群尝试原则的可用时间是链接,或试图访问数据库,可以做的,当然,也可以尝试连接JDBC,判断在java异常机制的使用情况,在文本后面具体提到。什么是数据推送机制事实上,这必须放在现实的应用场景来讨论这个问题,使用通用DB数据库停机时间,那么我相信DBA肯定知道,这次DBA手册将数据库的当前状态以编程方式推给客户机,最后是分布式数据层的应用。更新本地数据库状态的列表时,告诉LB,这个数据库节点不使用,请不要将它分配给它。一是主动监测机制,另一种是被动和通知机制。两各有所长,但都具有相同的效果。所以假设的问题不会发生,即使它发生的概率会降到最低。
上面提到的主和奴隶没有做进一步的解释,如图1所示,一个组由1个主和n个奴隶组成,为什么要这样做呢主负责写操作的负载,也就是说所有写在主做,而读操作传到奴隶。这可以大大提高阅读效率。在一般的互联网应用,一些调查数据后,得出了比读/写约为10:1,也就是说,大量的数据业务集中在读取操作,这就是为什么我们有多个奴隶。但你为什么想读和写吗研究人员熟悉DB知道写操作涉及到锁的问题,是否行锁或表锁或块锁都是降低系统的执行效率。我们的分离是集中在节点上的写操作,读操作在其他的N个节点,有效提高阅读效率从另一个方面,并确保系统的高可用性。阅读和写作的分离也会带来新的问题,比如我的主数据对Slave和其他机器集群中保持数据的同步和一致性。我们不需要关注代理MySQL机制的问题,因为代理机制与主体之间的相关性不太强,可以帮助我们做到这一点,
这里没有详细的介绍。
总之,这是本课题研究的分布式数据层的一般功能,以上是对基本原理的讨论和阐述,其次是系统设计层次,深入分析和研究。
第四章系统设计
4.1系统实现层次选择
在导言中,提到系统的实现有两种选择。一种是基于JDBC的选择,另一种是基于现有数据持久层的选择,如Hibernate和iBatis。两水平都有各自的优点和缺点。基于JDBC的系统实现,系统的开发和后期使用困难将大大提高。该系统的开发和维护的成本已大大增加。这个项目的目的是封装的上层在不修改源代码的iBATIS直接模制iBATIS持久层框架的基础上,使系统不会干扰现有的框架,也提高使用的灵活性的原因。R选择iBATIS如下:
(1)ibatis学习成本很低,和熟练的java程序员可以使用iBATIS巧妙地在很短的时间。
(2)是一个轻量级的ORM框架,只是完成了RO,或映射,查询语句是通过配置文件sql-map.xml文件在原始SQL级简单的配置,也就是说我们有了概念,如Hibernate像HQL,这增强了SQL的可控性,优秀的DBA可以从SQL优化SQL的水平很好,数据层的应用具有很强的可控性。虽然Hibernate是非常强大的,但因为Hibernate是一个沉重的包,和HQL的概念进行了介绍,为控制SQL的性能、优化其性能的DBA团队不方便。
基于上述原因,本课题选用易于学习和轻量级的持久层框架,iBATIS ORM产品上的选择。下面的讨论也对iBATIS的基础上讨论。
其他开源框架的4.2种选择
在一些大型的java应用程序,我们通常采用的开源框架,如施普灵河,特别是国际奥委会(DI),有效的帮助开发人员管理水平的依赖对象,减少实体耦合系统的各个层次之间的优点和用途的春天,我相信,是众所周知的开发商并没有不再赘述。本课题的数据层也会使用弹簧作为国际奥委会的框架(DI)。
4.3系统开发技术和工具
开发语言:java jdk1.5
集成开发环境:伊柯丽斯3.3.4
在网络环境下的测试服务器:JBoss 4.2
构建工具:淘宝的自我发展构建工具,Antx(类似于Maven),当然,也可以使用Maven
依赖开源罐:Spring2.0,ibaits,共享配置(读取配置文件),log4j,junit等
随着互联网应用的广泛普及,海量数据的存储与访问成为系统设计中的一个瓶颈。对于一个大型的互联网应用,光伏数十亿每天无疑是造成相当大的负荷,数据库系统的稳定性和可扩展性都造成了很大的问题。通过数据分割提高网站的性能,数据层的横向扩展的架构已经成为研发人员的首选方法。分割数据库水平,可以降低单台机器的负载,并减少停机时间所造成的损失。负载均衡策略,有效降低单机访问负载,减少停机时间的可能性;通过集群方案,解决了单点数据库无法访问的问题,停机造成的数据库;通过阅读和写作的策略是最大限度的分离应该通过阅读速度的提高(读)和并行数据的数量。目前,大量的数据分割方案在中国大型互联网应用采用。淘宝、阿里巴巴和腾讯主要实现自己的分布式数据访问层(ddal),执行和实施水平是分为两个层次(java应用为例):对JDBC层的封装和ORM框架层的实现,JDBC的直接封装,一个开发项目更好的在中国被称为阿米巴。它是由阿里集团研究所开发的。目前仍在测试阶段(测试版),其运行效率和生产时效性有待于进一步的研究。对ORM框架层的实现,如淘宝的分布式基于iBATIS和Spring数据访问层,它已应用多年,和生产效率已由开发人员和用户的肯定。本文是基于ORM框架层的分布式数据访问层,位于池困难,路由规则和膨胀后,选择如:如何做数据迁移量最少,扩大数据库的容量(添加机节点)来。问题的核心路由规则在数据库表库和负载balancinG策略。
第二章的基本原理和概念
2.1项基本原则:
人类认知问题的过程总是相同的:什么(什么)-为什么(为什么)-为什么(为什么)
接下来,本文将对三个问题进行探讨和研究:
2.1.1数据分割是什么
单词碎片的英文意思是片段分片被称为片。Sharding并不是一个新技术,但是一个相对简单的软件的概念。每个人都知道,MySQL 5之前的分区功能的数据表,在那之前,MySQL的许多潜在用户推广MySQL的担忧,以及他们是否有分区函数衡量一个数据库可扩展与否的关键指标(当然不是唯一的指标)数据库的可扩展性是一个永恒的话题。MySQL的发起人经常会被问到:我们如何处理单个数据库上的应用程序数据和分区等等答案是分片。Sharding不是一个具体的数据库软件的附属功能,但在摘要上面的具体技术细节,是水平扩展(规模,或横向延伸,向外扩展)的解决方案,其主要目的是打破了传统的单节点数据库服务器我 / O数据库解决可扩展性问题的能力。
通过一系列的分割规则,数据被分配到不同的DB或表级别。通过查找对应的数据库表路由或路由规则,我们可以找到具体的数据库或表的查询的查询操作,分片描述这里通常指的是水平分割,这是本文的重点。什么样的分割和路由将具体在这一点上,读者肯定会产生怀疑。下面是一个简单的例子:让我们在blog应用程序中说明一个日志,例如,文章列有以下字段。
article_id(int)、标题(varchar(128))、内容(varchar(1024)),user_id(int)。
面对这样一张桌子,我们该如何分割呢如何在不同数据库中的表中分发这些数据事实上,对博客应用的分析并不难得出这样的结论:在博客的应用中,用户分为两类:浏览器所有者和博客所有者,浏览博客的浏览器实际上是在特定用户的博客下浏览。而博客的主人管理自己的博客,它还经营特定用户博客下(在自己的空间)。所谓特定用户与数据库的字段表示,是user_id.this是user_id的基础,这是我们需要的库和规则为基础的。我们能做到这一点,把所有的文章信息user_id 1 ~ 10000到DB1第表,把user_id 10001 ~ 20000所有物品到DB2第表,等等,直到DBN。因此,本文数据自然分成各种数据库实现数据分割的目的。下一步需要解决的问题如何找到一个特定的数据库事实上,这个问题很简单,因为当我们使用游泳池区分领域user_id,所以数据库路由过程肯定不user_id.consider博客应用我们刚刚提出,无论是在博客或他人管理自己的博客,我知道博客的用户是谁,知道随着博客的user_id,user_id库,利用时间的规则,进而找到特定的数据库,如user_id 234,唯一的规则,它应该位于user_id DB1,如果是12343,唯一的规则,它应该位于DB2。利用图书馆的规则,等等,路线回到具体的数据库,这一过程称为DB路由。
当然,考虑到数据分割的DB设计必然是一种非传统的、非正统的DB设计。那么,什么样的DB设计是一种正统的DB设计
我们通常使用的一般规律。通常我们会自觉按照范式来设计我们的数据库,可以考虑高负荷的复制机制来提高读写的吞吐率和使用性能,这可能已经能够满足多方面的需求,但这一机制本身的缺陷是很明显的(下面提到的)。上述意识是根据范例。考虑数据库设计的数据分割,通常会违反分割的规则和限制,我们必须出现在数据库表中的冗余字段,作为标签领域不同的领域,或者叫池,如在这一领域的第user_id以上例子(当然,这个例子是没有不能很好的反映冗余,user_id user_id因为这场甚至没有图书馆,但也出现了,我们是捡便宜)。当然,不仅是在冗余池现场场的出现,在许多大型应用中,冗余是必要的,这涉及到高效的数据库设计,本文将不重复。
2.1.2为什么数据分割
什么是数据分割的摘要描述和解释,读者可能会问,为什么需要数据分割像Oracle这样的成熟而稳定的数据库足以支持海量数据的存储和查询吗为什么需要数据切片事实上,甲骨文的数据库是真的成熟和稳定,但使用和高端硬件支持成本高,没有一个公司可以负担得起的。想象一下,一年的使用费用和小千万千万小型机作为硬件支持,这是通用公司能付得起吗即使我们能支付得起,如果有更好的解决方案,有一个更便宜更好的能力,更好地扩大性能,我们为什么不选择
但事情总是不尽人意。通常我们会自觉按照范式来设计我们的数据库,可以考虑高负荷的复制机制来提高读写的吞吐率和使用性能,这可能已经能够满足多方面的需求,但这一机制自身的缺陷是很明显的。首先,它有效地在读操作比很依赖,主人往往成为瓶颈,写操作需要排队如果硕士第一不能进行过载,延迟也可能比较大的计算能力和数据同步的奴隶,会大大消耗CPU,因为写操作完成后或在每个奴隶是掌握切分可能运行。鸡肋此时。复制是不确定的,所以可以分片的工作吗真理是简单的,因为它可以延长。我们知道,无论多么好的每台机器的配置有其自身的物理极限,所以当我们有一个应用可以触及或超越单一的机器,我们必须找到其他的机器来帮助或继续升级我们的硬件,但最常见的方案或横向扩展,通过添加更多的机器来承受压力。我们还必须考虑如果我们的业务逻辑越来越多,可我们的机器满足线性增长的需求Sharding can easily distribute computing, storage and I/O to multiple machines, so that we can make full use of all kinds of processing capabilities of multiple machines, while avoiding single point failures, providing system availability and doing very good error isolation.
结合以上因素,数据分割是必要的,我们在这里讨论的数据分割是MySQL的背景,基于成本的考虑,许多公司还选择自由和开放的MySQL,了解MySQL的开发者可能会知道,MySQL 5之前的分区功能的数据表,在那之前,MySQL的许多潜在的用户扩展到MySQL的担忧,以及他们是否有分区函数衡量一个数据库可扩展与否的关键指标(当然不是唯一的指标)。数据库的可扩展性是一个永恒的话题,MySQL的推广常常问:如果在一个单一的数据处理应用和拉伸力治疗需要数据库分区E,怎么回答是分片,也就是我们所说的数据分割方案。
我们利用免费的MySQL和廉价的服务器甚至PC集群,实现了小型机+大型商用DB的效果,减少了大量的资金投入,降低了运营成本。为什么不呢所以,我们选择Sharding和拥抱的碎片。
2.1.3如何实现数据分割
当涉及到数据分割时,我们再次详细地解释和解释数据分割的方法和形式。
数据分割可以是物理的,数据通过一系列的分割规则将分布在DB服务器上的不同数据,通过路由规则访问特定的数据库,这样每次访问的时候脸不是单一的服务器,而是N个服务器,它可以减少单机的负载压力。
数据分割也可以在数据库中,通过一系列的分割规则的数据分布的数据到一个数据库中,不同的表为例,文章分为article_001,article_002等多个子级分逻辑包括一个完整的文章的形式,这样做的目的其实是很简单。例如,例如,文章表现在包含5000w数据,我们需要在这个表中增加(插入)是一种新的数据插入数据库后,将重新索引,根据此表,5000w数据索引的系统开销还是不可忽视的。相反,如果我们把桌子放到100表,从article_001到article_1005000w数据平均,每个子表里面只有50万ROWS的数据,那么我们只有50W的插入数据行的索引表的数据后,时间会降低幅度,大大提高了数据库的运行效率,提高了数据库的并发性。当然,在子表的好处是未知的,以及锁定操作,如写操作,这将带来很多明显的好处。
总之,在单点机的减载下,提高了数据的运算效率,尤其是写的操作效率,在这一点上我们仍然没有关于如何切割的问题,接下来,我们将详细地阐述和解释分词规则。
以上所提到的,为了达到分割数据的水平,有多余的字符在每个表分割阶段和标签领域的基础上,我们user_id通常用来作为基于本领域的区别,它具有以下三个池和规则:(当然还可以有其他的方式)
按数分段:
(1)user_id是有区别的,和1 ~ 1000对应的db11001 2000相应的DB2,等等;
优势:部分迁移
缺点:数据分布不均
(2)哈希模型:
哈希user_id(或者user_id是数字类型如果user_id值也可以直接),然后用一个具体的数字,如数据库应用程序需要被切割成4个数据库,我们使用hash 4和user_id值运算的数量,这是user_id % 4,然后每个操作将有四个可能的结果是:1当2相应的DB1的结果;当结果为3时,相应的DB2;结果是0时,对应DB3;db4,非常均匀地分布数据为4分贝。
优点:数据分布均匀
缺点:数据迁移的麻烦和不可分摊根据机器性能
(3)将数据库配置保存在身份验证库中
它是建立一个数据库。该数据库保持映射关系从user_id DB。每次访问数据库时,我们首先需要查询数据库以获得特定的数据库信息,然后才可以进行我们需要的查询操作。
优势:强弹性,一对一关系
缺点:每次查询前多查询一次,性能大打折扣。
以上是我们在共同开发中所选择的三种方式,一些复杂的项目可能与这三种方式相混合,通过以上的描述,我们对规则的认识也有了简单的理解,当然也会有更好的方法来汇集,我们也需要不断的探索和发现。
第三章研究的基本概况
在whatwhyhow方式,阐述了一些概念和数据库分割的含义,并给出了一些常规的分割规则简介分布式数据层在讨论这个话题不仅是相同的,它是一个完整的数据层解决方案。到底是什么样子接下来,我将阐述本课题的完整思路和实现。
分布式数据方案提供如下功能:
(1)设置规则和路由规则(routerule或RR),上述三个细分规则直接嵌入到系统中,具体的方式嵌入了以下内容的探讨;
(2)引入组的概念,以确保数据的高可用性。
(3)负载均衡策略(简称LoadBalancePolicy)介绍。
(4)引入簇节点可用性检测机制,定期检测单点机器的可用性,保证正确实现LB策略,保证系统的高稳定性。
(5)引入读/写分离,提高数据查询速度。
只是分区表数据层设计不完善,当某个节点在DB服务器上出现故障时,会是什么样的呢是的,我们使用了数据库分割方案,即N台机器来形成一个完整的DB,如果有一台机器停机,它只不过是一个DB数据访问而已,它对我们来说是可以接受的,至少在很多情况下都是好的,不像整个DB那样可以访问。假设我们的系统是一个高度并行的电子商务网站造成单节点机停机的经济损失是非常严重的。也就是说,还有在我们的方案中的一个问题,和容错性能是经不起考验的。当然,总是有一个解决问题的办法。我们引入了集群的概念,我称之为组,即每个节点在一个池我们引进多台机器,每台机器上保存的数据是相同的,在正常情况下,机器的负载共享,停机时,负载平衡器将分配给机器的停机时间的负荷。因此 uff0c
解决了容错的问题,因此我们引入了集群的概念,并将其放在我们的框架内,成为框架的一部分。
如上图所示,整个数据层是由三簇,1,2和3。这三个簇是数据级分割的结果。Of course, the three clusters form a DB containing complete data.Each Group includes 1 Master (of course Master can also be multiple) and N Slave, which is consistent with the Master and Slave data.For example, a slave Group1 in the occurrence of downtime phenomenon, so there are two slave can be used, so the model is always a part of data cannot be accessed without causing problems, unless the entire Group machines all down, but considering the probability of happening is very small (unless it is off, otherwise it is not easy to happen).
在介绍集群,查询过程如下:我们要求数据层之间的转移,和银行领域的必要的区分(通常user_id)数据层根据现场具体区分路线数据库数据操作设定分贝。这是一个集群的缺失。在那时引入一个集群是什么样子的呢正如你可以看到的图片,我们只能路由规则和政策,我们的路由器的特定群体,也就是说,我们只能路由到一个虚拟组,这是不是一个特定的物理服务器。接下来要做的是找到特定的数据,操作一个特定的物理数据库服务器的基础上。这一环节的要求,我们引入了负载均衡器的概念(LB),负载均衡器的任务是找到一个特定的数据库服务器,具体规则如下:负载均衡器将分析当前的SQL的读写特性。如果是写操作或需要实时操作,它将直接加载查询负载给主。如果读操作,通过负载均衡策略分配一个从站,我们的负载均衡器的主要研究方向是负载分配策略。通常,负载均衡包括随机负载均衡和加权负载均衡。随机负载平衡是一个很好的理解从n奴隶奴隶的随机选择。这样的随机负载平衡不考虑机器的性能,和它的默许,每台机器的性能是相同的。如果实际情况是这样,就不可能这样做。如果不是这样的话吗每个奴隶的物理机的性能和配置是不一样的,然后用随机不考虑负载平衡性能,不是很科学,这样的机会给机器的性能差而导致不必要的高负荷,甚至导致宕机的风险,和高性能的数据库服务器不能充分发挥物理性能。基于这样的考虑,我们引入了加权负载均衡,这是我们的内部系统通过接口,你可以权衡每一个数据库服务器,然后运行LB根据集群中的比重,有一定比例的数据库服务器的负载分布。当然,这一概念的引入将无疑增加了系统的复杂性和可维护性,一定会有损失,我们无从逃生。
有一个库,一个集群,一个负载平衡器,不是所有的都会好的。事情远没有我们想象的那么简单。在这些东西之外,基本上可以保证我们的数据层可以承受很大的压力,但不能完全避免伤害,设计数据库的停机时间。如果1 slave2下来,所以LB系统并不知道,这是非常危险的,因为LB不不知道,它会认为slave2是可用的,所以将被分配到slave2负荷。这样,问题就来了,和客户自然容易对数据操作失败的错误或异常,这是非常不友好的!如何解决这样的问题我们介绍了集群节点的可用性检测机制,以及数据推送机制的可用性,这两种机制之间的区别是什么第一个说:检测机制,顾名思义,即使检测是我的数据层、客户端,每个数据库集群尝试原则的可用时间是链接,或试图访问数据库,可以做的,当然,也可以尝试连接JDBC,判断在java异常机制的使用情况,在文本后面具体提到。什么是数据推送机制事实上,这必须放在现实的应用场景来讨论这个问题,使用通用DB数据库停机时间,那么我相信DBA肯定知道,这次DBA手册将数据库的当前状态以编程方式推给客户机,最后是分布式数据层的应用。更新本地数据库状态的列表时,告诉LB,这个数据库节点不使用,请不要将它分配给它。一是主动监测机制,另一种是被动和通知机制。两各有所长,但都具有相同的效果。所以假设的问题不会发生,即使它发生的概率会降到最低。
上面提到的主和奴隶没有做进一步的解释,如图1所示,一个组由1个主和n个奴隶组成,为什么要这样做呢主负责写操作的负载,也就是说所有写在主做,而读操作传到奴隶。这可以大大提高阅读效率。在一般的互联网应用,一些调查数据后,得出了比读/写约为10:1,也就是说,大量的数据业务集中在读取操作,这就是为什么我们有多个奴隶。但你为什么想读和写吗研究人员熟悉DB知道写操作涉及到锁的问题,是否行锁或表锁或块锁都是降低系统的执行效率。我们的分离是集中在节点上的写操作,读操作在其他的N个节点,有效提高阅读效率从另一个方面,并确保系统的高可用性。阅读和写作的分离也会带来新的问题,比如我的主数据对Slave和其他机器集群中保持数据的同步和一致性。我们不需要关注代理MySQL机制的问题,因为代理机制与主体之间的相关性不太强,可以帮助我们做到这一点,
这里没有详细的介绍。
总之,这是本课题研究的分布式数据层的一般功能,以上是对基本原理的讨论和阐述,其次是系统设计层次,深入分析和研究。
第四章系统设计
4.1系统实现层次选择
在导言中,提到系统的实现有两种选择。一种是基于JDBC的选择,另一种是基于现有数据持久层的选择,如Hibernate和iBatis。两水平都有各自的优点和缺点。基于JDBC的系统实现,系统的开发和后期使用困难将大大提高。该系统的开发和维护的成本已大大增加。这个项目的目的是封装的上层在不修改源代码的iBATIS直接模制iBATIS持久层框架的基础上,使系统不会干扰现有的框架,也提高使用的灵活性的原因。R选择iBATIS如下:
(1)ibatis学习成本很低,和熟练的java程序员可以使用iBATIS巧妙地在很短的时间。
(2)是一个轻量级的ORM框架,只是完成了RO,或映射,查询语句是通过配置文件sql-map.xml文件在原始SQL级简单的配置,也就是说我们有了概念,如Hibernate像HQL,这增强了SQL的可控性,优秀的DBA可以从SQL优化SQL的水平很好,数据层的应用具有很强的可控性。虽然Hibernate是非常强大的,但因为Hibernate是一个沉重的包,和HQL的概念进行了介绍,为控制SQL的性能、优化其性能的DBA团队不方便。
基于上述原因,本课题选用易于学习和轻量级的持久层框架,iBATIS ORM产品上的选择。下面的讨论也对iBATIS的基础上讨论。
其他开源框架的4.2种选择
在一些大型的java应用程序,我们通常采用的开源框架,如施普灵河,特别是国际奥委会(DI),有效的帮助开发人员管理水平的依赖对象,减少实体耦合系统的各个层次之间的优点和用途的春天,我相信,是众所周知的开发商并没有不再赘述。本课题的数据层也会使用弹簧作为国际奥委会的框架(DI)。
4.3系统开发技术和工具
开发语言:java jdk1.5
集成开发环境:伊柯丽斯3.3.4
在网络环境下的测试服务器:JBoss 4.2
构建工具:淘宝的自我发展构建工具,Antx(类似于Maven),当然,也可以使用Maven
依赖开源罐:Spring2.0,ibaits,共享配置(读取配置文件),log4j,junit等
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。