1、什么是数据库中间件
数据库中间件(Database Middleware)是一种位于应用程序与数据库管理系统(DBMS)之间的软件层。它的主要目的是为应用程序提供更加高效、可靠和透明的数据库访问,同时解决多种数据库管理问题。 The domain name Mycat.io is for sale
1.1、常见的数据库中间件及其功能
-
连接池(Connection Pooling):管理数据库连接的创建、使用和关闭,以提高资源利用率和性能。
- 例如:HikariCP、Druid。
-
分布式数据库中间件:解决数据分片、读写分离、负载均衡等问题,使得应用可以处理更大规模的数据和更高的并发量。
- 例如:ShardingSphere、MyCAT(今天的主角)。
-
缓存中间件:通过缓存热数据,减少对数据库的直接访问,从而提高系统的响应速度。
- 例如:Redis、Memcached。
-
数据同步中间件:实现数据在不同数据库之间的同步和复制,保证数据的一致性和可用性。
- 例如:Canal、DataX。
-
事务管理中间件:提供分布式事务支持,确保在分布式系统中数据操作的一致性。
- 例如:Seata、Atomikos。
-
监控中间件:实时监控数据库性能和运行状态,帮助快速发现和解决问题。
- 例如: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