1 海量数据的存储问题

如今随着互联网的发展,数据的量级也是呈指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系型数据库已经无法满足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。

但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关系型数据库。如果使用关系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能将一个数据库的数据分散到不同的数据库中存储。

当数据太多,以至于数据库存不下的时候,我们要做数据库分片。

2 什么是数据库分片

简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。

数据的切分根据其切分规则的类型,可以分为两种切分模式。

(1)一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分。数据量比较大,是因为有几张表中存放的数据量比较大,比如商品表、订单表、商品表等,我把不同的表放到不同的数据库中,订单库、商品库、用户库等。将不同的表放到不同的数据库中,这就是所谓的垂直切割。这种思路是可行的,但是假如我只是单张表数据量特别大,即便是水平切分之后,存这张表的数据库性能也会很低。

(2)另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。大多数的互联网网站采取的是水平切割,因为垂直切割解决不了单表数据量过大的问题。

当数据库分片后(水平切割),数据由一个数据库分散到多个数据库中。此时系统要查询时需要切换不同的数据库进行查询,那么系统如何知道要查询的数据在哪个数据库中?当添加一条记录时要向哪个数据库中插入呢?这些问题处理起来都是非常的麻烦。

这种情况下可以使用一个数据库中间件mycat来解决相关的问题。接下来了解一下什么是mycat。

3 什么是Mycat?

Mycat背后是阿里曾经开源的知名产品——Cobar。Cobar的核心功能和优势是MySQL数据库分片,此产品曾经广为流传,据说最早的发起者对Mysql很精通,后来从阿里跳槽了,阿里随后将Cobar开源,并维持到2013年年初。然后,就没有然后了。

Cobar的思路和实现路径的确不错。基于Java开发的,实现了MySQL公开的二进制传输协议,巧妙地将自己伪装成一个MySQL Server,目前市面上绝大多数MySQL客户端工具和应用都能兼容。比自己实现一个新的数据库协议要明智的多,因为生态环境在那里摆着。

Mycat是基于cobar演变而来,对cobar的代码进行了彻底的重构,使用NIO重构了网络模块,并且优化了Buffer内核,增强了聚合、Join等基本特性,同时兼容绝大多数数据库称为通用的数据库中间件。

简单的说,Mycat就是:一个新颖的数据库中间件产品,支持mysql集群,或者marisdb cluster,提供高可用性数据分片集群。你可以像使用mysql一样使用mycat。对于开发人员来说根本感觉不到mycat的存在。

 

4 Mycat具体是如何进行数据库分片的呢?

答:这一块不是我做的,我并不太清楚内部实现原理。

 

5 Mycat读写分离

数据库读写分离对于大型系统或者访问量很高的互联网应用来说,是必不可少的一个重要功能。对于MySQL来说,标准的读写分离是主从模式,一个写节点Master后面跟着多个读节点,读节点的数量取决于系统的压力,通常是1-3个读节点的配置

 

数据库集群部署SQL server 数据库做集群_数据库

Mycat读写分离和自动切换机制,需要mysql的主从复制机制配合。

 

6 Mysql的主从复制

 

数据库集群部署SQL server 数据库做集群_数据库_02

主从复制需要注意的地方

1、主DB server和从DB server数据库的版本一致

2、主DB server和从DB server数据库数据名称一致

3、主DB server开启二进制日志,主DB server和从DB server的server_id都必须唯一

 

注意:面试的时候经常会问,你是如何解决项目中的分布式事务问题的?

:我们项目中使用Mycat管理数据库集群,Mycat本身支持分布式事务。