分库分表

一个大型的互联网应用必然会经过一个从单一DB server, 到Master/salve, 再到垂直分区(分库),然后再到水平分区(分表即sharding)的过程 !!!在这个过程中,Master/salve 以及垂直分区相对比较容易,对应用的影响也不是很大,但是分表会引起一些棘手的问题,比如不能跨越多个分区join查询数据,如何平衡各个shards的负载等等,这个时候就需要一个通用的DAL框架来屏蔽底层数据存储对应用逻辑的影响,使得底层数据的访问对应用透明化。
分库分表个人理解分两个层面:数据库层面的集群和应用层的路由。数据库层面的集群一般是由DB自己实现,比如 master-slaver模式,数据自动同步等。而应用层的路由主要是根据业务来对数据库表进行拆分,再根据一系列规则在访问数据库时动态地路由到相应的数据库。相对来说,应用层的路由要复杂一些。
在应用层的框架有: hibernate shards,ibatis shards , guzz  等。
分库分表产生的问题,及注意事项

1.   分库分表维度的问题

假如用户购买了商品,需要将交易记录保存取来,如果按照用户的纬度分表,则每个用户的交易记录都保存在同一表中,所以很快很方便的查找到某用户的购买情况,但是某商品被购买的情况则很有可能分布在多张表中,查找起来比较麻烦。反之,按照商品维度分表,可以很方便的查找到此商品的购买情况,但要查找到买人的交易记录比较麻烦。

 所以常见的解决方式有:

     a.通过扫表的方式解决,此方法基本不可能,效率太低了。

     b.记录两份数据,一份按照用户纬度分表,一份按照商品维度分表。

     c.通过搜索引擎解决,但如果实时性要求很高,又得关系到实时搜索。

 2.   联合查询的问题

联合查询基本不可能,因为关联的表有可能不在同一数据库中。

 3.   避免跨库事务

避免在一个事务中修改db0中的表的时候同时修改db1中的表,一个是操作起来更复杂,效率也会有一定影响。

 4.   尽量把同一组数据放到同一DB服务器上

例如将卖家a的商品和交易信息都放到db0中,当db1挂了的时候,卖家a相关的东西可以正常使用。也就是说避免数据库中的数据依赖另一数据库中的数据。

一主多备

在实际的应用中,绝大部分情况都是读远大于写。Mysql提供了读写分离的机制,所有的写操作都必须对应到Master,读操作可以在Master和Slave机器上进行,Slave与Master的结构完全一样,一个Master可以有多个Slave,甚至Slave下还可以挂Slave,通过此方式可以有效的提高DB集群的QPS.                                                       

所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。


NoSQL(NoSQL = Not Only SQL ),意即反SQL运动,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于目前铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。它们可以处理超大量的数据它们运行在便宜的PC服务器集群上 它们是以key-value的形式存储。常见的框架有:Hadoop、Membase、MongoDB、Hypertable等。

访问网络上另一台机器上的内存比访问本机的硬盘快???!!!!!


针对有ID的数据,有几类处理的方法:
1.在ID字段中包含分库信息,这样我们就可以通过这个ID里面的某些位就可以直接获取分库信息了。(新系统可以采取这类方式,TDDL提供了生成这种ID的便捷方法。)
2.通过TDDL的ID=>分库映射cache来完成映射关系(这只针对老系统,目前的优先级还不高,将在以后的版本提供)。也可以查看成功实践中的总结信息


注意TDDL对分页的处理 


MYSQL集群:

图片

MYSQL支持复制和集群两种模式:
复制是指单向异步复制,以一台机器为主机,其他机器为从机。主机一般负责更新数据,而从机只读数据。对于更新比较少的应用来说,用这种方式实现读写分享是个不错的选择。
MYSQL集群是同步复制数据
集群MySQL中名称概念.(如上图)
1)Sql结点(SQL node--上图对应为MySQLd):分布式数据库。包括自身数据和查询中心结点数据.
2)数据结点(Data node -- ndbd):集群共享数据(内存中).
3)管理服务器(Management Server – ndb_mgmd):集群管理SQL node,Data node.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值