数据库中间件 -- MyCat

1、什么是数据库中间件  

        数据库中间件(Database Middleware)是一种位于应用程序与数据库管理系统(DBMS)之间的软件层。它的主要目的为应用程序提供更加高效、可靠和透明的数据库访问,同时解决多种数据库管理问题。  The domain name Mycat.io is for sale

 1.1、常见的数据库中间件及其功能

  1. 连接池(Connection Pooling):管理数据库连接的创建、使用和关闭,以提高资源利用率和性能。

    • 例如:HikariCP、Druid。
  2. 分布式数据库中间件:解决数据分片、读写分离、负载均衡等问题,使得应用可以处理更大规模的数据和更高的并发量。

    • 例如:ShardingSphere、MyCAT(今天的主角)。
  3. 缓存中间件:通过缓存热数据,减少对数据库的直接访问,从而提高系统的响应速度。

    • 例如:Redis、Memcached。
  4. 数据同步中间件:实现数据在不同数据库之间的同步和复制,保证数据的一致性和可用性。

    • 例如:Canal、DataX。
  5. 事务管理中间件:提供分布式事务支持,确保在分布式系统中数据操作的一致性。

    • 例如:Seata、Atomikos。
  6. 监控中间件:实时监控数据库性能和运行状态,帮助快速发现和解决问题。

    • 例如:Prometheus、Grafana。

1.2、常见数据库中间件对比

中间件 开发团队 状态/备注 优点 缺点
Cobar 阿里团队 停止维护更新

解决了单点性能瓶颈问题

提供数据分片和高可用性支持

不再维护和更新

功能相对落后

 社区支持少,文档不全

MyCAT 开源社区 基于Cobar二次开发开源社区维护

活跃的开源社区,持续更新

支持数据分片、读写分离、分布式事务  配置灵活

社区驱动,功能和稳定性参差不齐

配置和使用复杂度较高

OneProxy 商业团队 不开源的商业中间件

商业支持,提供专业服务

设计稳定,适用于企业级应用

非开源,成本较高

灵活性相对较低

kingshard 开源社区 用Go语言开发,在不断完善

性能高效,支持并发

社区活跃,持续改进

支持基本的分片和读写分离

功能相对基础,不支持复杂分布式事务

需要更多社区支持

Vitess YouTube YouTube生产环境使用,不支持MySQL原生协议

可靠性和可扩展性高

支持自动分片、分布式事务和故障切换

适用于云原生应用

不支持MySQL原生协议

配置和管理复杂度高

Atlas 360团队 基于mysqlproxy改写,高并发下不稳定 简单易用,适用于中小型应用支持基本读写分离和负载均衡

高并发场景下性能不稳定

功能相对简单,缺乏高级特性

MaxScale MariaDB MaxScale是MariaDB研发的中间件

MariaDB官方开发,兼容性和稳定性高

支持多种功能

插件机制丰富

配置和管理可能复杂商业支持需要额外费用
MySQLRoute Oracle MySQL官方中间件

MySQL官方产品,兼容性和稳定性有保证

企业级支持和服务

功能全面

成本较高

依赖Oracle的技术支持,灵活性较低

1.3、为什么使用MyCat?

1. 解决单机数据库性能瓶颈

在处理大规模数据和高并发访问时,单机数据库可能会遇到性能瓶颈。MyCAT通过数据分片和负载均衡,将数据分布到多个数据库实例中,从而提高系统的并发处理能力和整体性能。

2. 提供数据分片功能

MyCAT支持将数据水平切分到多个数据库中,每个分片只存储部分数据,这样可以大大减小单个数据库的压力。同时,通过自定义分片规则,可以灵活地根据业务需求进行数据分布。

3. 实现读写分离

MyCAT可以将写操作(如INSERT、UPDATE、DELETE)路由到主数据库,将读操作(如SELECT)路由到从数据库。这种读写分离的方式,可以提高读操作的响应速度,并降低主数据库的压力。

4. 提供分布式事务支持

MyCAT支持分布式事务管理,确保在多个数据库实例之间的数据一致性。通过两阶段提交协议(2PC),MyCAT可以在分布式环境中实现事务的原子性和一致性。

5. 支持多租户架构

对于SaaS应用,MyCAT支持多租户架构,可以根据租户ID将数据分片存储到不同的数据库实例中,提供租户级别的隔离和管理。

6. 高可用性和故障恢复

MyCAT支持数据库实例的自动故障切换和恢复,保证系统的高可用性。配合主从复制、双主等架构,MyCAT可以在数据库故障时自动切换到备份节点,减少故障时间。

7. 社区活跃,持续更新

作为一个开源项目,MyCAT有一个活跃的社区支持,持续进行功能更新和优化。用户可以从社区获取帮助和资源,也可以参与到项目的开发和改进中。

使用MyCAT的典型场景

  • 电商平台:需要处理大量订单和商品数据,MyCAT可以通过数据分片和读写分离,提高系统的并发处理能力和响应速度。
  • 金融系统:需要保证数据的一致性和高可用性,MyCAT的分布式事务和故障恢复功能可以满足这些需求。
  • SaaS应用:需要支持多租户架构,MyCAT可以通过数据分片和租户隔离,实现对不同租户数据的高效管理。

简言之:

        ① java与数据库紧耦合
        ② 高访问量高并发对数据库的压力。
        ③ 读写请求数据不一致

1.4、功能介绍 --  能干吗

 1. 读写分离

 2. 数据分片

                垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表)

3. 多数据源整合

1.5、怎么实现的? 原理是什么?

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

1. 数据分片(Sharding)

        MyCAT 通过水平分片(Horizontal Partitioning)将数据分布在多个数据库实例上。每个数据库实例存储部分数据,这样可以减轻单个数据库的压力,提升系统的扩展性和性能。

2. 路由(Routing)

        MyCAT 根据预先定义的分片规则将 SQL 请求路由到对应的数据库实例。分片规则可以基于表的某个字段(如用户 ID),也可以是更复杂的自定义规则。

3. 读写分离(Read/Write Splitting)

        MyCAT 支持读写分离,通过配置主从复制(Master-Slave Replication),将写操作发送到主库,读操作发送到从库,从而提高读写性能。

4. 全局事务(Global Transactions)

        为了保证分布式环境中的数据一致性,MyCAT 支持分布式事务管理。它通过两阶段提交协议(Two-Phase Commit Protocol)来确保事务的原子性和一致性。

5. 数据聚合(Data Aggregation)

        对于分片的数据,MyCAT 可以在不同的数据库实例上执行部分查询,然后将结果汇总返回给客户端。这对于复杂的查询操作尤为重要,如聚合函数、排序等。

6. 分布式索引(Distributed Index)

        MyCAT 支持分布式索引,通过在不同的数据库实例上创建索引,提高查询效率。分布式索引可以是全局唯一索引,也可以是局部分片索引。

7. 缓存(Caching)

        为了进一步提升性能,MyCAT 支持缓存机制,将常用查询结果缓存到内存中,减少数据库查询次数。

8. 高可用性(High Availability)

        MyCAT 提供高可用性支持,通过主从复制和自动故障转移(Failover)机制,确保系统在部分数据库实例失效时仍能正常运行。

9. 监控与管理(Monitoring and Management)

        MyCAT 提供丰富的监控和管理工具,帮助管理员实时监控系统状态、性能指标,并进行必要的优化和调整。

示例

假设有一张用户表 users,使用用户 ID 进行分片。分片规则如下:

  • 用户 ID 1-1000 存储在数据库实例 A
  • 用户 ID 1001-2000 存储在数据库实例 B

        当收到查询 SELECT * FROM users WHERE id = 1500 时,MyCAT 根据路由规则将查询请求转发到数据库实例 B,并返回结果给客户端。

        通过这些机制,MyCAT 可以有效地管理和优化分布式数据库系统,提供高性能和高可用性的解决方案。

2、怎么安装和启动?

1、安装

1、官网下载后解压即可使用

2、较为重要的配置文件

①schema.xml:定义逻辑库,表、分片节点等内容
②rule.xml:定义分片规则
③server.xml:定义用户以及系统相关变量,如端口等

2、启动 

1、修改 server.xml配置文件

        修改用户信息,与MySQL区分,如下:

…
<user name="mycat">
 <property name="password">123456</property>
 <property name="schemas">TESTDB</property>
</user>
...

2、修改schema.xml配置文件

        删除<achema>标签间的表信息,<dataNode>标签只留一个,<dataHost>标签只留一个,<writeHost> <readHost>只留一对

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
 <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
 </schema>
 <dataNode name="dn1" dataHost="host1" database="testdb" />
 <dataHost name="host1" maxCon="1000" minCon="10" balance="0"
 writeType="0" dbType="mysql" dbDriver="native" switchType="1" 
slaveThreshold="100">
 <heartbeat>select user()</heartbeat>
 <!-- can have multi write hosts -->
 <writeHost host="hostM1" url="192.168.140.128:3306" user="root"
 password="123123">
 <!-- can have multi read hosts -->
 <readHost host="hostS1" url="192.168.140.127:3306" user="root" 
password="123123" />
 </writeHost>
 </dataHost>
</mycat:schema>

3、验证数据库访问情况

        Mycat 作为数据库中间件要和数据库部署在不同机器上,所以要验证远程访问情况。

mysql -uroot -p123123 -h 192.168.140.128 -P 3306
mysql -uroot -p123123 -h 192.168.140.127 -P 3306
#如远程访问报错,请建对应用户
grant all privileges on *.* to root@'缺少的host' identified by '123123';

4、启动程序

①控制台启动 :去 mycat/bin 目录下执行 ./mycat console
②后台启动 :去 mycat/bin 目录下 ./mycat start
        为了能第一时间看到启动日志,方便定位问题,我们选择①控制台启动。

5、 启动时可能出现报错

        如果操作系统是 CentOS6.8,可能会出现域名解析失败错误,如下图

可以按照以下安装步骤解决:

① 用 vim 修改 /etc/hosts 文件,在 127.0.0.1 后面增加你的机器名

 ② 修改后重新启动网络服务

3、登录

1、登录后台管理窗口

         此登录方式用于管理维护Mycat

mysql -umycat -p123456 -P 9066 -h 192.168.140.128
#常用命令如下:
show database

 

show @@help

 

2、登录数据窗口

         此登录方式用于通过 Mycat 查询数据,我们选择这种方式访问 Mycat

mysql -umycat -p123456 -P 8066 -h 192.168.140.128

3、怎么实现读写分离

        通过 Mycat 和 MySQL 的主从复制配合搭建数据库的读写分离,实现 MySQL 的高可用性。

搭建:一主一从、双主双从两种读写分离模式。

1、搭建一主一从

        一个主机应用于处理所有请求,一台从机负责所有读请求,架构图如下:

 1. 搭建MySQL数据库主从复制

① MySQL 主从复制原理

② 主机配置(host79)

修改配置文件:vim /etc/my.cnf
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT

binlog 日志三种格式

 ③ 从机配置(host80)

修改配置文件:vim /etc/my.cnf
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay

④ 主机、从机重启 MySQL 服务
⑤ 主机从机都关闭防火墙
⑥ 在主机上建立帐户并授权 slave

#在主机MySQL里执行授权命令
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123123';
#查询master的状态
show master status;

#记录下File和Po
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-Z_Nuyoah

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值