欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-09 19:48:00
MyCAT实现MySQL的读写分离(2)——配置MyCAT(一)一、MyCAT 概述Mycat 是一个开源的分布式数据库系统,是一个实现了 MySQL 协议的Server,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用MySQL 原生协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里。Mycat后端可以支持 MyS...

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实现MySQL的读写分离(2)——配置MyCAT(一)

当 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 是一个数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服务。对数据进行分片处理以后,原有的一个库被切分为多个分片数据库,所有的分片数据库集群构成了完整的数据库存储。如下图所示:

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

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

2、逻辑库(schema)

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

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

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 区分租户的数据。是共享程度最高、隔离级别最低的模式。
优点:维护和购置成本最低,允讲每个数据库支持的租户数量最多。
缺点:格式级别最低,安全性最低,需要在设计开发时加大对安全的开发量;数据备份和恢复最困难,需要逐表逐条备份和还原。

本文地址:https://blog.csdn.net/weixin_44377973/article/details/108202317