学习读写分离/分库分表

主库从库

主从数据库的建立一般基于以下三个方面考虑:
1、容灾:备库在异地,主库不存在了,备库可以立即接管,无须恢复时间
2、负载均衡:主库做增删改,备库做查询,这样很多查询业务不占用主库资源
3、数据集中和分发:此种模式主要用于数据从分公司集中到总公司,或从总公司分发到分公司,前提是公司需要同步的数据很少,另外各公司间业务系统不是同一家公司开发的
同步功能主要通过数据库同步软件实现的

读写分离

比如:主服务器提供写的操作 , 从服务器提供读的操作
优点
1.增加冗余
2.增加了机器的处理能力
3.对于读操作为主的应用,使用读写分离是最好的场景,因为可以确保写的服务器压力更小,而读又可以接受点时间上的延迟。

第一种是在应用层做

方案就是根据我们的不同的sql语句来选择不同的数据源来操作,优点是对性能的损耗比较小,缺点是强依赖程序员。
在这里插入图片描述
从上边的四个方案中选,我们要选的是红色的。原因是无侵入,原有代码不需要做任何改变。

来看一下工作原理:
在这里插入图片描述
在dao层之后,数据库之前,添加了红色框的插件,用来拦截数据库操作的请求,来判断选择数据源。绿色框标出来的是数据源,不同的数据源。拦截层用来根据sql 的类型来选择不同的数据源。这对前边的程序员的操作是无感的。之前不管是业务层还是dao层,就是无感的,因为我不需要关心读写分离。

第二种是使用中间件

优点是不再强依赖程序员。缺点是既然是中间件,一层过滤,自然消耗了性能。另外强依赖的其他资源。出问题的可能性就会变大。
开源数据库中间件方案中,MySQL官方先是提供了mysql-proxy,后又推出MySQL router。 MySQL Router主要功能有读写分离、故障自动切换、负载均衡、连接池等。
原理:

Java web app:是客户端请求,会对数据库发起读写操作请求,具体是发送SQL指令
Mysql Proxy:对读写操作请求的SQL指令进行路由,使得读写分离
direct:一个负载分发引擎,对Mysql Proxy分发得读操作,按照一定得算法进行分发至后端得从服务器
master:主服务器,主要接受用户的写操作,并且负责将二进制日志同步给从服务器
slave-n:从服务器,主要负责用户的读操作(分担主服务器的读写压力),并且负责重放master的写操作,还能实现容灾能力,保证高可用(如果主服务器挂掉,slave顶上去)

要实现数据库的读写分离,我们就需要在客户端与mysql服务端之间使用一个中间件(mysql-proxy),对用户的操作进行分析,对读写操作进行分离,而且由于从服务器(提供读服务)不止一个,又要提供一个负载均衡器来进行连接分发。
在这里插入图片描述

分库分表

垂直拆分

1、每个库(表)的结构都不一样
2、每个库(表)的数据都(至少有一列)一样
3、每个库(表)的并集是全量数据
优点∶
1、拆分后业务清晰(专库专用按业务拆分)
2、数据维护简单、按业务不同业务放到不同机器上
缺点∶
1、如果单表的数据量大、写读压力大
2、受某种业务来决定、或者被限制。也就是说一个业务往往会影响到数据库的瓶颈(性能问题)(双十一时候总库受订单库的限制,订单量太大)
3、部分业务无法关联 join、只能通过java程序接口去调用,提供了开发复杂度。(商品、订单信息、会员信息)(比如找订单的时候,用户信息要通过接口去获取,拿到用户信息去订单库中找,不能直接通过join关联)

垂直分库
在这里插入图片描述

垂直分表
在这里插入图片描述

水平拆分

水平∶
1、每个库(表)的结构都一样
2、每个库(表)的数据都不一样
3、每个库(表)的并集是全量数据

优点∶
1、单库(表)的数据保持在一定的量(减少),有助于性能提高
2、提高了系统的稳定性和负载能力。
3、切分的表的结构相同、程序改造较少

缺点∶
1、数据的扩容很有难度维护量大(分库的时候是根据一定的公式来计算的,如果要添加一个库,那么计算公式就可能需要改变,计算公式改变那么原来的数据就需要从新分库)
2、拆分规则很难抽象出来
3、分片事务的一致性的问题部分业务无法关联 join、只能通过java程序接口去调用(可能会涉及到不同的数据库)

水平拆库
在这里插入图片描述
水平拆表
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值