从单块架构到分布式架构之数据库集群(三)

数据库集群主要有主备、主从、分库、分表等方案。

 、主备

主要用来做高可用架构,当主库挂了之后可以利用备库来代替主库,备库不提供任何的访问能力。

问题所在:主备数据同步是有延时的,数据量非常大的情况下可能会达到一分钟以上。如果这个时候主库所在服务器宕机,可能会造成备库数据不一致的情况。当主库恢复正常运行之后,是把主库设置成新的备库来使用,还是仍然当成主库来使用呢。

二、主从

读写分离,主库负责写入数据,从库负责读取。可以是一主一从,也可以是一主多从。主要用来分散高并发时的访问压力,并且主库挂掉之后,不会影响读取相关业务。

             问题所在:由于主库只有一个,所以不用担心数据丢失的问题。但是跟主备一样, 数据同步是需要时间的,当用户在主库新增一条数据之后,立马做了查询操作, 这个时候数据可能还没有同步到从库中,导致了数据不一致。比如用户注册系统之后,登陆的时候却提示账号不存在。

              解决方法:1、对于刚新增/编辑过的数据,仍然访问主库;对代码侵入比较大。

                                2、从库未查询到的情况下再次查询主库;当大量访问不存在的资源会造成主库压力山大。

                                3、重要业务读写都在主库, 非重要业务采用读写分离。

              也可以针对不同的业务数据采取不同的方式处理。

三、分库

将数据库按一定的方式拆分成多个数据库。这些数据库可以分开部署在不同的服务器或者实例上面。

虽然读写分离可以分散访问压力,但是所有的数据都要存放在每一个节点上,不能解决存储压力。

问题所在:1、连接查询;如果一个查询所需数据分散在不同的库中,需要多次查询组装起来后才能得到结果

                              2、分布式事务;单库的情况下可以使用数据库自带的ACID保证数据的完整。可以了解一下CAP、BASE、两阶段提交、三阶段提交、事务补偿机制、重试机制、人工干预等解决方式。

                              3、开发成本增加;

四、分表

拆分方式有垂直拆分和水平拆分

4.1 垂直拆分

将一个表的拆分成多个表。以主外键的方式关联。数据库在查询的时候会将整行数据都加载至内存中,拆分成多个表可以减少IO和内存的使用。例如:将商品基本信息和商品详情拆分开。如果拆分后的两个表在大部分的业务。

4.2 水平拆分

将表的数据拆分到多个表中,拆分方式有:范围拆分、hash拆分等;例如:ID范围在1-9999999的数据放在table1中,ID范围在10000000-19999999的数据放在table2中。

猜你喜欢

转载自blog.csdn.net/qq_26900081/article/details/88528903