MyCAT实现MySQL的读写分离(2)——配置MyCAT(一)

MyCAT实现MySQL的读写分离(2)——配置MyCAT(一)

一、MyCAT 概述

Mycat 是一个开源的分布式数据库系统,是一个实现了 MySQL 协议的Server,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用MySQL 原生协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里。Mycat后端可以支持 MySQL、SQL Server、Oracle、DB2、PostgreSQL 等主流数据库,也支持 MongoDB 这种新型 NoSQL 方式的存储。在最终用户看来,无论是哪种存储方式,在 Mycat 里,都是一个传统的数据库表,支持标准的 SQL 语句进行数据库操作。

1、对于 DBA 来说,可以这么理解 Mycat:Mycat 就是 MySQL Server,而 Mycat 后面连接的 MySQL Server,就好象是 MySQL 的存储引擎,如 InnoDB,MyISAM 等。因此,Mycat 本身并不存储数据,数据是在后端的 MySQL 上存储的,因此数据可靠性以及事务等都是 MySQL 保证的,简单的说,Mycat 就是 MySQL 最佳伴侣,它在一定程度上让 MySQL 拥有了能跟 Oracle PK 的能力。

2、对于软件工程师来说,可以这么理解 Mycat:Mycat 就是一个近似等亍 MySQL 的数据库服务器,你可以用连接 MySQL 的方式去连接 Mycat(除了端口不同,默认的 Mycat 端口是 8066 而非 MySQL 的 3306,因此需要在连接字符串上增加端口信息),大多数情况下,可以用你熟悉的对象映射框架使用 Mycat,但建议对于分片表,尽量使用基础的 SQL 语句,因为这样能达到最佳性能,特别是几千万甚至几百亿条记录的情况下。

3、对于架极师来说,可以这么理解 Mycat:Mycat 是一个强大的数据库中间件,不仅可以用作读写分离、以及分表分库、容灾备份,而且可以用于多租户应用开发、云平台基础设施、让你的架构具备很强的适应性和灵活性,借助于 Mycat 智能优化模块,系统的数据访问瓶颈和热点一目了然,根据返些统计分析数据,你可以自动或手工调整后端存储,将不同的表映射到不同存储引擎上,而整个应用的代码一行也不用改变。

二、Mycat 基本原理

Mycat 的原理并不复杂,Mycat 原理中最重要的一个词是“拦截”,它拦截用户发送过来的 SQL 语句,首先对 SQL 语句做特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做适适当的处理,最终再返回给用户。

比如,把 Orders 表分为三个分片 datanode(简称 dn),这三个分片分布在两台 MySQL Server(DataHost)上,datanode = database@datahost,可以用一台到 N 台服务器来分片,分片规则(sharding rule)为字符串枚举分片规则,一个规则的定义是分片字段(sharding column)+分片函数(rule function),这里,分片字段为 prov,分片函数为字符串枚举方式。如下图所示:

在这里插入图片描述

当 Mycat 收到一个 SQL 时,会先解析这个 SQL,查找涉及到的表,然后看此表的定义,如果有分片规则,则获取到 SQL 里分片字段的值,并匹配分片函数,得到该 SQL 对应的分片列表,然后将 SQL 发往这些分片去执行,最后收集和处理所有分片返回的结果数据,并输出到客户端。
比如 SQL 语句:select * from orders where prov=‘Beijing’;
按照分片函数,Beijing 返回 dn1,于是 SQL 就发给 MySQL1,去取 DB1 上的查询结果,并返回给用户。
比如 SQL 语句:select * from orders where prov in (‘Beijing’,‘Shanghai’);
那么,SQL 就会发给 MySQL1 与 MySQL2 去执行,然后结果集合并后输出给用户。但通常我们的 SQL 会有 Order By 以及 Limit 子句,此时就涉及到结果集在 Mycat 端的二次处理。

三、Mycat 中的基本概念

1、数据库中间件

Mycat 是一个开源的分布式数据库系统,但由于 Mycat 并没有存储引擎,所以 Mycat 并不是完全意义上的分布式数据库系统。Mycat 是一个数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服务。对数据进行分片处理以后,原有的一个库被切分为多个分片数据库,所有的分片数据库集群构成了完整的数据库存储。如下图所示:

在这里插入图片描述

数据被分到多个分片数据库后,应用如果需要读取数据,就需要处理多个数据源的数据。如果没有数据库中间件,应用将直接面对分片集群,数据源切换、事务处理、数据聚合等,将花费大量的工作来处理分片的问题。有了数据库中间件,多量的通用的数据聚合,数据源切换都由中间件来处理,应用只需要集中于业务处理。

2、逻辑库(schema)

对实际应用来讲,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以看作是一个或多个数据库集群构成的逻辑库。如下图所示:

在这里插入图片描述

3、逻辑表(table)

(1)逻辑表

对应用来说,读取数据的就是逻辑表。逻辑表可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分、不分片,只有一个表构成。

(2)分片表

分片表是指一些数据量很大的表,需要切分到多数据库的表,这样,每个分片都有一部分数据,所有分片构成了完整的数据。例如:以下代码, t_node 表中的数据按照规则被分到 dn1,dn2 两个分片节点(dataNode)上。

<table name="t_node" primaryKey="vid" autoIncrement="true" dataNode="dn1,dn2" rule="rule1" />

(3)非分片表

如果一个表中的数据量不是很大,是不需要进行切分的,非分片表是相对分片表而言的,就是那些不需要进行数据切分的表。比如以下代码,把 t_node 表保存在分片节点 dn1 上。

<table name="t_node" primaryKey="vid" autoIncrement="true" dataNode="dn1" />

(4)ER 表

Mycat 提出了基于 E-R 关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上,即子表依赖于父表,途过表分组(Table Group)保证数据 Join 不会跨库操作。表分组是解决跨分片数据 join 的一种很好的思路,也是数据切分规划的重要规则。

(5)全局表

一个真实的业务系统中,往往存在大量的类似字典表的表,这些表基本上很少变动,字典表具有以下特点:变动不频繁;数据总体变化不大;数据规模不大。
对于这类表,在分片的情况,当业务表因为规模而进行分片以后,业务表与这些字典表之间的关联就成了比较棘手的问题,Mycat 通过数据冗余来解决这类表的 join,即所有的分片都有一份数据的拷贝,将字典表或符合字典表特征的一些表定义为全局表。

4、分片节点(dataNode)

数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点。

5、节点主机(dataHost)

数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库,返样一个或多个分片节点(dataNode)所在的机器就是节点主机(dataHost),为了规避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost)。

6、分片规则(rule)

进行数据切分时需要一定的规则,按照某种业务规则把数据分到某个分片的规则就是分片规则。数据切分时选择合适的分片规则非常重要。

7、全局序列号(sequence)

数据切分后,原有的关系数据库中的主键约束在分布式条件下将无法使用,需要引入外部机制保证数据唯一性标识,这种保证全局性的数据唯一标识的机制就是全局序列号。

8、多租户

多租户技术或称多重租赁技术,是一种软件架构技术。是实现如何在多用户环境下共用相同的系统或程序组件,并且可确保各用户间数据的隔离性。多租户在数据存储上存在三种主要方案:

(1)独立数据库

一个租户一个数据库,这种方案的用户数据隔离级别最高,安全性最好,但成本也高。返种方案与传统的一个客户一套数据一套部署类似,区别在于软件统一部署在运营商那里。银行、医院等需要非常高数据隔离级别的租户可以选择这种模式。
优点:为不同的租户提供独立的数据库,有助于简化数据模型的扩展设计,满足不同租户的独特需求;如果出现故障,恢复数据比较简单。
缺点:增大了数据库的安装数量,维护成本和购置成本较高。

(2)共享数据库,隔离数据架构

即多个或所有租户共享 Database,但是每个租户一个 Schema。
优点:为安全性要求较高的租户提供了一定程度的逻辑数据隔离,并不是完全隔离;每个数据库可以支持更多的租户数量。
缺点:如果出现故障,数据恢复比较困难,因为恢复数据库将牵扯到其他租户的数据,如果需要跨租户统计数据,存在一定困难。

(3)共享数据库,共享数据架构

即租户共享同一个 Database、同一个 Schema,但在表中通过 TenantID 区分租户的数据。是共享程度最高、隔离级别最低的模式。
优点:维护和购置成本最低,允讲每个数据库支持的租户数量最多。
缺点:格式级别最低,安全性最低,需要在设计开发时加大对安全的开发量;数据备份和恢复最困难,需要逐表逐条备份和还原。

猜你喜欢

转载自blog.csdn.net/weixin_44377973/article/details/108202317