数据库部署
1.数据库服务器采⽤集⽅式部署(⽐如Oracle的⼀个数据库多个实例的情况)
数据库集⽅式能承担的负载是⽐较⼤的,数据库物理介质为⼀个磁盘阵列,多个数据库实例以虚拟IP⽅式向外部应⽤服务器提供数据库连接服务。这种部署⽅式基本上可以满⾜绝⼤多数的常见WEB应⽤,但是还是不能满⾜⼤⽤户量、⾼负载、数据库读写访问⾮常频繁的应⽤。
oracle数据库自动备份方法2、数据库采⽤主从部署⽅式
在⾯向⼤众⽤户的博客、论谈、交友、CMS等系统中,有上百万的⽤户,有上千万的数据量,存在众多的数据库查询操作,也有较多的数据库写操作,并且在多数情况下都是读操作远⼤于写操作的。在这个时候,假如能将数据库的读写操作分离的话,对于系统来讲是⼀个很⼤的提⾼啦。数据库的主从部署⽅式就⾛到我们⾯前啦。
主从复制:
⼏乎所有的主流数据库都⽀持复制,这是进⾏数据库简单扩展的基本⼿段。下⾯以Mysql为例来说明,它⽀持主从复制,配置也并不复杂,只需要开启主服务器上的⼆进制⽇志以及在主服务器和从服务器上分别进⾏简单的配置和授权。Mysql的主从复制是⼀句主服务器的⼆进制⽇志⽂件进⾏的,主服务器⽇志中记
录的操作会在从服务器上重放,从⽽实现复制,所以主服务器必须开启⼆进制⽇志,⾃动记录所有对于主数据库的更新操作,从服务器再定时到主服务器取得⼆进制⽇志⽂件进⾏重放则完成了数据的复制。主从复制也⽤于⾃动备份。
读写分离:
为保证数据库数据的⼀致性,我们要求所有对于数据库的更新操作都是针对主数据库的,但是读操作是可以针对从数据库来进⾏。⼤多数站点的数据库读操作⽐写操作更加密集,⽽且查询条件相对复杂,数据库的⼤部分性能消耗在查询操作上了。
主从复制数据是异步完成的,这就导致主从数据库中的数据有⼀定的延迟,在读写分离的设计中必须要考虑这⼀点。以博客为例,⽤户登录后发表了⼀篇⽂章,他需要马上看到⾃⼰的⽂章,但是对于其它⽤户来讲可以允许延迟⼀段时间(1分钟/5分钟/30分钟),不会造成什么问题。这时对于当前⽤户就需要读主数据库,对于其他访问量更⼤的外部⽤户就可以读从数据库。
数据库反向代理:
在读写分离的⽅式使⽤主从部署⽅式的数据库的时候,会遇到⼀个问题,⼀个主数据库对应多台从服务器,对于写操作是针对主数据库的,数据库个数是唯⼀的,但是对于从服务器的读操作就需要使⽤适当的算法来分配请求啦,尤其对于多个从服务器的配置不⼀样的时候甚⾄需要读操作按照权重来分配。
对于上述问题可以使⽤数据库⽅向代理来实现。就像WEB⽅向代理服务器⼀样,MYsql Proxy同样可以在SQL语句转发到后端的Mysql服务器之前对它进⾏修改。
3、数据库垂直分割
主从部署数据库中,当写操作占了主数据库的CPU消耗的50%以上的时候,我们再增加从服务器的意义就不是很⼤了,因为所有的从服务器的写操作也将占到CPU消耗的50%以上,⼀台从服务器提供出来查询的资源⾮常有限。数据库就需要重新架构了,我们需要采⽤数据库垂直分区技术啦。
最简单的垂直分区⽅式是将原来的数据库中独⽴的业务进⾏分拆(被分拆出来的部分与其它部分不需要进⾏Join连接查询操作),⽐如WEB站点的BLOG和论坛,是相对独⽴的,与其它的数据的关联性不是很强,这时可以将原来的的数据库拆分为⼀个BLog库,⼀个论坛库,以及剩余的表所组成的库。这三个库再各⾃进⾏主从数据库⽅式部署,这样整个数据库的压⼒就分担啦。
另外查询扩展性也是采⽤数据库分区最主要的原因之⼀。将⼀个⼤的数据库分成多个⼩的数据库可以提⾼查询的性能,因为每个数据库分区拥有⾃⼰的⼀⼩部分数据。假设您想扫描1亿条记录,对⼀个单⼀分区的数据库来讲,该扫描操作需要数据库管理器独⽴扫描⼀亿条记录,如果您将数据库系统做成50个分区,并将这1亿条记录平均分配到这50个分区上,那么每个数据库分区的数据库管理器将只扫描200万记录。
4、数据库⽔平分割
在数据库的垂直分区之后,假如我们的BLOG库⼜再次⽆法承担写操作的时候,我们⼜该怎么办呢?数据库垂直分区这种扩展⽅式⼜⽆能为⼒了,我们需要的是⽔平分区。
⽔平分区意味着我们可以将同⼀个数据库表中的记录通过特定的算法进⾏分离,分别保存在不同的数据库表中,从⽽可以部署在不同的数据库服务器上。很多的⼤规模的站点基本上都是主从复制+垂直分区+⽔平分区这样的架构。⽔平分区并不依赖什么特定的技术,完全是逻辑村⾯的规划,需要的是经验和业务的细分。
如何分区呢?对于⼤型的WEB站点来说,必须分区,并且对于分区我们没有选择的余地,对于那些频繁访问导致站点接近崩溃的热点数据,我们必须分区。
在对数据分区的时候,我们必须要存在⼀个分区索引字段,⽐如USER_ID,它必须和所有的记录都存在关系,是分区数据库中的核⼼表的主键,在其它表中作为外键,并且在使⽤主键的时候,该主键不能是⾃增长的,必须是业务主键才可以。
余数分区:
我们可以将User_ID%10后的值为依据存⼊到不同的分区数据库中,该算法简单⾼效,但是在分区数据
库个数有变动的时候,整个系统的数据需要重新分布。
范围分区:
我们可以将User_ID的范围进⾏分区,⽐如1-100000范围为⼀个分区数据库,100001-200000范围为⼀个分区数据库,该算法在分区数据库个数有变动的时候,系统⾮常有利于扩展,但是容易导致不同分区之间的压⼒不同,⽐如⽼⽤户所在的分区数据库的压⼒很⼤,但是新⽤户的分区数据库的压⼒偏⼩。
映射关系分区:
将对分区索引字段的每个可能的结果创建⼀个分区映射关系,这个映射关系⾮常庞⼤,需要将它们写⼊数据库中。⽐如当应⽤程序需要知道User_id为10的⽤户的BLOG内容在那个分区时,它必须查询数据库获取答案,当然,我们可以使⽤缓存来提⾼性能。
这种⽅式详细保存了每⼀个记录的分区对应关系,所以各个分区有⾮常强的可伸缩性,可以灵活的控制,并且将数据库从⼀个分区迁移到另⼀个分区也很简单,也可以使各个分区通过灵活的动态调节来保持压⼒的分布平衡。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论