年关将至,工作上也没什么大的安排。闲暇时间从一个PHP工程师的角度去学习一下微服务架构,毕竟谁都想进步嘛,哇哈哈
为什么要分库分表
一般接口出现性能问题的话,大多是因为数据库出现了瓶颈造成的。比如当一个表数据很大的时候,查询效率就会变得很慢,即使增加了索引也不能解决这个问题。或者当并发量比较大的时候,也会有大量的数据库请求,数据库请求会占用IO资源,也会造成性能问题。在出现这些问题的时候要怎么办呢?就用到了分库分表。
分库分表有哪些应用场景呢
分库和分表是不同的两个概念,它们解决的问题也不同。比如当并发量很大但是数据量很小的时候,这个时候单个服务器的IO操作就会增大,从而出现瓶颈。然后我们可以分库,把数据分到两个或者多个服务器上,这样就解决了单个服务器IO很大的问题,只需要分库不需要分表就可以解决。将库放到不同的服务器上,减少单台服务器的IO操作。当并发量不大但是数据很多的时候,虽然表有锁冲突,但是可能也是很缓慢的,这个时候就要把数据分布到不同的表中,减少单个表的压力,这时只需要分表不需要分库就可以解决。最后是当并发量很大且数据量也很大的时候,这个时候就要结合操作,既要分库又要分表才能起到优化的作用。
在确定了是分库还是分表之后,就要考虑如何拆分了。分库分表有两个方向,一个是垂直,一个是水平。在选择是垂直拆分还是水平拆分的时候,一般是先垂直拆分再水平拆分,因为垂直拆分更符合实际的业务需求。 为什么符合实际业务呢?下面让我们来看一下。先垂直分库,垂直分库就是针对一个系统中不同的业务进行拆分,比如把用户拆到user库,把订单拆到order库。拆分后放到不同的服务器上独立部署,让它们互相不影响。这样在高并发的情况下,一定程度上能解决IO连接数、硬件资源等瓶颈。
上面这张图,刚一开始是一个DB,下边的这些用户、订单和商品相关表都放在这一个DB上。垂直拆分之后,就是把用户单独放在服务器一上,订单放在服务器二上,商品放在服务器三上。这样就减少了一台服务器的压力。
再来看上边更直观的图,查询从user表中获取数据,刚一开始都是全从这一个服务器上来获取的。垂直拆分之后,user就在这个服务器上,order就在那个服务器上获取,这样就把压力给拆分了。
垂直分表,也就是大表拆小表,基于表中的字段拆分。将不常用的数据、比较大的数据拆分到扩展表。一般针对几百列的大表进行拆分。
看一下上面这个表,拆分前,用户ID、姓名、密码、性别、年龄、手机号等等,这一堆都保存在一个大表中。实际上,只有用户名和密码用得比较频繁,比如登录和注册的时候,经常用这两个字段,其余的像地址、微信、注册时间都很少用。当登录的时候,把这些都获取一下就会造成浪费。这个时候,我们来给它垂直拆分,把常用的用户名和密码单独拆分出来,放到userbase表中,把剩下的不常用的都放到userinfo表中。这样当用户登录时,就直接访问userbase表就可以满足了,只有当进入用户中心访问基本信息的时候,才会访问到userinfo表。但是做这种请求的行为就会少很多,这样就达到了优化的目的。