目录
- 一、Mycat产生背景
- 二、Mycat介绍
- 三、Mycat安装
- 四、Mycat搭建读写分离
- 1、 搭建MySQL数据库主从复制
- 2、 基于mysql主从复制搭建MyCat读写分离
- 五、Mycat启动常见错误处理
- 1、Caused by: io.mycat.config.util.ConfigException: SelfCheck### schema TESTDB refered by user user is not exist!
- 2、Navicat连接mycat报错:2003 -Can't connect to MySQL server on'192.168.245.132'(10061 "Unknown error")
- 六、Mycat 监控工具
- 1、Mycat-web 简介
- 2、 Mycat-web 配置使用
- ① ZooKeeper 安装
- ② Mycat-web 安装
- ③ Mycat-web 配置
- ④ Mycat 性能监控指标
一、Mycat产生背景
随着互联网的发展,数据的量级也是成指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系型数据库已经无法满足快速查询与插入数据的需求。尽管NoSQL的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。但是,在有些场合NoSQL是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候NoSQL定是无法满足的,所以还是需要使用关系型数据库。如何使用关系型数据库解决海量存储的问题呢?
MyCat 数据库中间件的出现是为了应对传统单体数据库在高并发、大数据量和复杂业务场景下面临的性能瓶颈和扩展性问题。通过分片、读写分离、事务支持、SQL 优化等技术,MyCat 提供了高性能、高可用和易扩展的数据库解决方案,帮助企业更好地管理和利用数据资源。
Mycat 背后是阿里曾经开源的知名产品——Cobar。Cobar 的核心功能和优势是 MySQL 数据库分片,此产品曾经广为流传,据说最早的发起者对 Mysql 很精通,后来从阿里跳槽了,阿里随后开源的 Cobar,并维持到 2013 年年初。Mycat 基于 cobar 演变而来,对 cobar 的代码进行了彻底的重构,使用 NIO 重构了网络模块,并且优化了 Buffer 内核,增强了聚合,Join 等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。
简单的说,MyCAT就是:一个新颖的数据库中间件产品,支持mysql集群,或者mariadb cluster,提供高可用性数据分片集群。你可以像使用mysql一样使用mycat。对于开发人员来说根本感觉不到mycat的存在。
二、Mycat介绍
Mycat 是一款开源的数据库中间件(逻辑数据库,将真实的数据库包起来),它主要用来解决数据库水平扩展的问题,即如何在不改变或最小化改动应用程序的情况下,让数据库能够处理更多的并发请求和更大的数据量。
原理:
Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL
语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。使用时只需将Mycat暴露给外部应用程序,而无需关心数据请求到哪台服务区
通过以上方式把数据库的分布式从代码中解耦出来,只将Mycat暴露给应用程序访问。
以下是使用 Mycat 的作用及好处:
1、读写分离:
Mycat 可以将读取操作和写入操作分开,将读取请求路由到只读副本上,而写入请求则路由到主数据库,从而提高系统的读取性能。
2、数据分片(垂直/水平拆分):
当单个数据库无法承载大量数据时,Mycat 可以帮助将数据水平切分到多个物理数据库上,将数据分布在多个数据库实例上,从而提高系统的并发处理能力,这样可以分散查询压力,提高查询效率。
3、负载均衡:
通过将请求分发到不同的数据库节点上,Mycat 能够实现数据库层面的负载均衡,避免单一数据库过载。
4、高可用性:
Mycat 支持数据库集群,当某个数据库节点出现故障时,可以自动切换到其他健康的节点,保证服务的连续性。
5、透明性:
对于应用程序而言,Mycat 提供了一个统一的访问入口,应用程序只需要连接到 Mycat,而不需要关心后端数据库的具体结构,这降低了应用程序的复杂度。
6、多数据源整合及跨数据库类型的支持:
无论是数据库集群、关系、非关系型数据库都可以整合通过mycat连接;Mycat 不仅支持多种关系型数据库(如 MySQL、Oracle、SQL Server 等),还支持一些 NoSQL 数据库(如 MongoDB),使得混合数据库环境下的应用集成更加灵活。
7、简化开发:
应用程序可以继续使用标准的 SQL 语句来操作数据,而不需要针对特定的分片策略编写复杂的逻辑,这简化了开发工作并提高了开发效率。
8、易于管理:
Mycat 提供了图形化的管理工具,方便管理员监控和管理数据库集群的状态。总之,Mycat 通过其强大的功能,可以帮助企业构建可扩展、高性能、高可用的数据层,从而支撑大规模应用的需求。
三、Mycat安装
1、解压后即可使用
解压缩文件拷贝到 linux 下 /usr/local/
2、三个配置文件
①schema.xml
:定义逻辑库,表、分片节点等内容
②rule.xml
:定义分片规则
③server.xml
:定义用户以及系统相关变量,如端口等
①控制台启动 :mycat/bin 目录下执行 ./mycat console
②后台启动 : mycat/bin 目录下 ./mycat start
为了能第一时间看到启动日志,方便定位问题,我们选择①控制台启动
!!!启动成功!!!
注意事项:
① mycat是数据库中间件,那么mycat必然要能够访问对应的主从数据库,所以在主、从数据库中我们需要分别创建访问的账号
-- 创建用户
CREATE USER 'mycat'@'%' IDENTIFIED BY '123456';
-- 授予所有权限并允许授予权限
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%' WITH GRANT OPTION;
-- 刷新权限缓存
FLUSH PRIVILEGES;
若创建过程中报错:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
,可临时降低密码策略要求
select @@validate_password.policy;
SHOW VARIABLES LIKE 'validate_password%';
set global validate_password.policy=0;
set global validate_password.length=1
附常用命令
FLUSH HOSTS --清除主机缓存中的所有条目。重置对特定主机的连接限制,允许被阻止的主机重新尝试连接。解决由于主机缓存导致的连接问题,例如某些 IP 地址被暂时禁止连接。
systemctl restart mysqld --修改mysql配置文件后需要重启
systemctl status mysqld --重启后查看mysql运行状态
四、Mycat搭建读写分离
本地基于CentOS 7搭建了三台虚拟机:
在实现 Mycat 和 MySQL 的主从复制配合搭建数据库的读写分离前,先完成mysql的主从复制。此处演示搭建一主一从
1、 搭建MySQL数据库主从复制
在搭建MyCat读写分离前,我们先需要搭建mysql的主从复制
MySQL 主从复制原理
:mysql在做主从复制时,每次只能在接入点复制,主库将内存中的数据写入Binary log
日志,从库先将Binary log日志写入自己的Relay log
(中继)日志,然后再由中继日志进行读取后写入。
redis主从复制原理
:与mysql主从复制不同的是redis在做主从复制时会将主库内存中所有的数据写入rdb持久化文件,从库再替换掉rdb持久化文件存储
① 主机配置
修改配置文件: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
② 从机配置
修改配置文件:vim /etc/my.cnf
#从服务器唯一ID
#启用中继日志
relay-log=mysql-relay
③ 主机、从机重启 MySQL 服务
systemctl restart mysqld
④ 主机从机都关闭防火墙
查看防火墙状态:firewall-cmd --state
关闭防火墙:systemctl stop firewalld.service
⑤ 查看主机运行状态show master status;
#记录下File和Position的值
#执行完此步骤后不要再操作主服务器MySQL,防止主服务器状态值变化
参数解释
File
含义:当前正在使用的二进制日志文件的名称。
示例:mysql-bin.000017
说明:这个文件名表示主服务器当前正在写入的二进制日志文件。从服务器需要知道这个文件名,以便从该文件的指定位置开始读取二进制日志事件。
Position
含义:当前二进制日志文件中的位置(偏移量)。
示例:156
说明:这个位置表示主服务器在当前二进制日志文件中写入的最后一个事件的结束位置。从服务器需要知道这个位置,以便从该位置开始读取二进制日志事件。
搭建主从复制前,主机切记不要进行任何操作(但凡进行操作,接入点会发生变化)
⑥ 在从机上配置需要复制的主机
#复制主机的命令
CHANGE MASTER TO MASTER_HOST='192.168.245.129',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000017',MASTER_LOG_POS=156;
说明:若出现以上错误证明之前连接过主机(搭建过主从),需要进行以下重置操作
stop slave; -- 停止复制
reset master; -- 重置主服务器的二进制日志(binary log),这通常涉及删除所有-- 二进制日志文件并重置二进制日志索引文件。
再次进行连接:
⑦ 启动从服务器复制功能
start slave;
⑧ 查看从服务器状态
show slave status\G;
#下面两个参数都是Yes,则说明主从配置成功!
# Slave_IO_Running: Yes# Slave_SQL_Running: Yes
关键字段解释:
Slave_IO_Running: 应为 Yes,表示 I/O 线程正在运行。
Slave_SQL_Running: 应为 Yes,表示 SQL 线程正在运行。
Last_IO_Error: 如果有错误,会显示在这里。
Last_SQL_Error: 如果有错误,会显示在这里。
Read_Master_Log_Pos: 从服务器读取的主服务器二进制日志位置。
Exec_Master_Log_Pos: 从服务器执行的主服务器二进制日志位置。
Relay_Master_Log_File: 从服务器正在读取的中继日志文件。
Relay_Log_Pos: 从服务器正在执行的中继日志位置。
binlog 日志三种格式:
① Statement
格式
:基于 SQL 语句的记录方式。
记录内容
:记录执行的 SQL 语句。
优点
:【1】日志文件较小:只记录 SQL 语句,通常比行格式的日志文件小;【2】易于审计:日志内容直观,易于理解和审计;【3】复制效率高:对于大量数据操作,复制效率较高。
缺点
:【1】非确定性操作:某些非确定性操作(如 UUID()、NOW())可能导致主从数据不一致。【2】存储过程和函数:存储过程和函数的执行结果可能不一致。【3】外键约束:某些外键约束的操作可能导致主从数据不一致。
② Row
格式
:基于行的记录方式。
记录内容
:记录每一行数据的变化。
优点
:【1】数据一致性:确保主从数据的一致性,避免非确定性操作导致的问题;【2】支持所有操作:支持所有类型的 SQL 操作,包括存储过程和函数;【3】外键约束:支持外键约束的操作。
缺点
:【1】日志文件较大:记录每一行数据的变化,日志文件通常比语句格式的大;【2】审计复杂:日志内容为行变化,不如语句格式直观。
③ Mixed
格式
:混合记录方式。
记录内容
:根据操作类型自动选择记录格式。
工作原理
:默认使用 Statement-Based Logging。在遇到非确定性操作或无法用语句格式准确记录的操作时,自动切换到 Row-Based Logging。
优点
:【1】结合了 SBL 和 RBL 的优点:既保持日志文件较小,又确保数据一致性;【2】灵活性:根据操作类型自动选择最佳记录格式。
缺点
:【1】复杂性:日志格式可能在不同操作之间切换,增加了复杂性;【2】日志文件大小:在某些情况下,日志文件可能比纯 SBL 或纯 RBL 大。
2、 基于mysql主从复制搭建MyCat读写分离
mysql已经搭建读写分离
验证之前的配置已分配了读写主机,是否已实现读写分离?(启动mycat,直接使用Navicat直连Mycat进行验证访问)
验证读写分离
:向表中插入系统变量
(1)在写主机插入:
insert into mytable values (1,@@server_id); -- 构造主从主机数据不一致的场景(@@server_id:每个MySQL实例的唯一标识符,在主从配置中,主库和从库的 server_id 必须不同。)
(2)在Mycat中查询:select * from mytable;
原因:在做读写分离时有一个关键的配置项,因此还需修改<dataHost>的balance属性,通过此属性配置读写分离的类型
(3) 修改 Mycat 的配置文件 schema.xml中的balance(设置值读写分离的配置项)属性,通过此属性配置读写分离的类型
负载均衡类型,目前的取值有4 种:
(1)balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
(2)balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从
模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
(3)balance="2",所有读操作都随机的在 writeHost、readhost 上分发。
(4)balance="3",所有读请求随机的分发到 readhost 执行,writerHost 不负担读压力
为了能看到读写分离的效果,把balance设置成2,会在两个主机间切换查询
<dataHost name="host1" maxCon="1000" minCon="10" balance="2"writeType="0" dbType="mysql" dbDriver="native" switchType="1"
slaveThreshold="100">
此时发现查询数据在两台服务器(主、从)间随机切换!!!
五、Mycat启动常见错误处理
mycat日志文件说明:
mycat.log
:MyCat程序运行日志,即程序启动后运行错误,例如数据库连接异常等。
wrapper.log
:程序启动日志,启动成功/失败打印的日志,例如xml文件加载异常等。
switch.log
:dataNode心跳日志,记录每个节点状态日志。
1、Caused by: io.mycat.config.util.ConfigException: SelfCheck### schema TESTDB refered by user user is not exist!
原因
:因mycat的conf目录下schema.xml中schema name="TESTDB"对于server.xml数据库用户user不存在,可以注释掉name=“user” 实际不存在该用户
!!!成功解决!!!
2、Navicat连接mycat报错:2003 -Can’t connect to MySQL server on’192.168.245.132’(10061 “Unknown error”)
① 查看是否能ping通mycat主机 !!!正常
② 检查三台服务器防火墙是否关闭(均关闭) !!!正常
③ 检查三台服务器防火墙是否关闭(均关闭) ???
最终发现,有的虚拟机不会自动打开8066端口,依次输入以下指令即可
在 INPUT 链的开头插入一条规则,允许目标端口为 8066 的 TCP 数据包进入本机:
/sbin/iptables -I INPUT -p tcp --dport 8066 -j ACCEPT #开启8066端口
与第一个命令功能相同,允许目标端口为 8066 的 TCP 数据包进入本机
iptables -I INPUT -p tcp --dport 8066 -j ACCEPT
将 OUTPUT 链的默认策略设置为接受所有从本机发出的数据包。
iptables -P OUTPUT ACCEPT
以上执行完毕后,重启mycat再此使用Navicat连接Mycat:
至此Mycat连接成功!!!
六、Mycat 监控工具
1、Mycat-web 简介
Mycat-web 是 Mycat 可视化运维的管理和监控平台,弥补了 Mycat 在监控上的空白。帮 Mycat 分
担统计任务和配置管理任务。Mycat-web 引入了 ZooKeeper 作为配置中心,可以管理多个节点。
Mycat-web 主要管理和监控 Mycat 的流量、连接、活动线程和内存等,具备 IP 白名单、邮件告警等模
块,还可以统计 SQL 并分析慢 SQL 和高频 SQL 等。为优化 SQL 提供依据
2、 Mycat-web 配置使用
① ZooKeeper 安装
#1下载安装包http://zookeeper.apache.org/
#2 安装包拷贝到Linux系统/opt目录下,并解压tar -zxvf zookeeper-3.4.11.tar.gz
(此处解压后拷贝到了 /usr/local目录下)
#3 进入ZooKeeper解压后的配置目录(conf),复制配置文件并改名
cp zoo_sample.cfg zoo.cfg
#4 进入ZooKeeper的命令目录(bin),运行启动命令
./zkServer.sh start
#5 ZooKeeper服务端口为2181,查看服务已经启动
netstat -ant | grep 2181
② Mycat-web 安装
#1下载安装包http://www.mycat.io/
#2 安装包拷贝到Linux系统/opt目录下,并解压
tar -zxvf Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz
#3 拷贝mycat-web文件夹到/usr/local目录下
cp -r mycat-web /usr/local
#4 进入mycat-web的目录下运行启动命令
cd /usr/local/mycat-web/
./start.sh &
#5 Mycat-web服务端口为8082,查看服务已经启动
netstat -ant | grep 8082
#6 通过地址访问服务
http://192.168.140.127:8082/mycat/
③ Mycat-web 配置
#1 先在注册中心配置ZooKeeper地址,配置后刷新页面,可见
④ Mycat 性能监控指标
在 Mycat-web 上可以进行 Mycat 性能监控,例如:内存分享、流量分析、连接分析、活动线程分
析等等。