MyCat + MySQL 主从部署问题汇总

背景

本周研究了一下数据库中间件 MyCat ,并验证了 MyCat 单机+MySQL 主从复制 的部署方案,本文来记录一下部署过程中遇到的问题。

什么是 MyCat

  1. 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库;
  2. 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群;
  3. 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server;
  4. 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品 ;
  5. 一个新颖的数据库中间件产品。

为什么要选 MyCat 呢?主要是看中它的分布式部署方案,以及不用更改客户端代码,可以跟 MySQL 无缝整合的能力。

笔者在部署过程中,碰到了几个问题,汇总如下:

  1. MySQL 从节点同步失败导致 Slave_SQL_Running 状态为 No;
  2. MyCat 启动报错,无法连接 Slave 节点;
  3. MyCat 连接失败;
  4. MyCat 连接密码被拒绝。

Slave_SQL_Running 状态为 No

MySQL 的从服务器默认处理 SQL 同步 errors 的行为, 给人感觉不太合理,就是一旦出现 SQL 语句同步失败,对应的 SQL 同步线程就会关闭:
MyCat + MySQL 主从部署问题汇总_第1张图片
这样很容易出现因数据不一致导致从节点同步失败问题,本例在从节点上执行了一个数据库的 drop 操作 drop database db3,然后去主节点上执行相同操作,就导致同步失败,同步线程终结。

默认从节点一旦遭遇同步操作异常,同步线程就是终结,需要人工干预才能保证主从同步能够继续,怎么想都不合理,有没有解决办法呢?

答案是设置 slave-skip-errors=all ,忽略所有的异常就可以了,在 mysqld 配置下面添加该配置,彻底忽略算了。

MyCat 启动报错

主从节点部署成功后,根据主从节点信息,配置好 MyCat 的 schema.xml 和 server.xml 并执行 mycat start 命令,日志报错:

can't connect to mysql server ,errmsg:Host '192.168.8.182' is not 
allowed to connect to this MySQL server MySQLConnection@1259448118 [id=11, 
lastTime=1597997840320, user=root, schema=db3, 
old shema=db3, borrowed=false, fromSlaveDB=true, threadId=0, charset=utf8, 
txIsolation=3, autocommit=true, attachment=null, respHandler=null, 
host=192.168.8.117, port=3306, statusSync=null, writeQueue=0, 
modifiedSQLExecuted=false]

主从两个服务器,异常显示 MyCat 启动时连接从服务器 host=192.168.8.117 时不被允许,所以猜测可能是从节点 root 帐号的 host 是 localhost 导致的。

在从服务器上,使用 mysql 登陆后,查看 root 帐号的 host 的值为 % ,但是没有执行过 flush privileges; 命令。执行后,重启 MyCat ,查看日志文件,没有 ERROR 级别的信息,说明 MyCat 启动成功。

MyCat 连接失败

MyCat 作为一个数据库中间件,连接命令还是 mysql ,所以需要在一个安裝了 MySQL 客户端的服务器上,执行连接命令,端口和服务器 IP 指向 MyCat 所在的主机。

在从节点 192.168.8.117 上,执行连接命令,端口为 8066:

mysql -u root -p12345 -P 8066 -h 192.168.8.182

执行结果:
MyCat + MySQL 主从部署问题汇总_第2张图片
该异常产生的原因是 MyCat 所在的服务器防火墙未关闭,关闭防火墙后继续访问:
MyCat + MySQL 主从部署问题汇总_第3张图片
异常信息变成密码错误,对比 server.xml 的密码,继续登陆成功,终于连上了。
这说明 server.xml 中配置的帐号密码,其实是应用连接 MyCat 需要的认证信息,跟 MySQL 主从数据库的帐号无关。

值得注意的是:schema.xml 中配置 WriteHost 和 ReadHost 中的连接帐号密码是对应的 MySQL 主从节点的帐号密码:


<writeHost host="hostM1" url="192.168.8.116:3306" 
    user="root" password="MasterXXX">
	<readHost host="hostS1" url="192.168.8.117:3306" 
	user="root" password="SlaveXXX!"/>
</writeHost>

它们是 MyCat 用来连接对应的主从节点认证用的,最终我们对数据库的操作,都被分配到了真正的 MySQL 数据库节点上。

MyCat 使用

现在使用 MyCat 的 Schema ,就跟 MySQL 一样,验证一下,用逻辑数据库来创建两张新表:MyCat + MySQL 主从部署问题汇总_第4张图片
切换到 MySQL 主节点,查看该表所在的分片库 db1 的信息:
MyCat + MySQL 主从部署问题汇总_第5张图片
登陆 MySQL 从节点,查看该表所在的分片库 db1 的信息:
MyCat + MySQL 主从部署问题汇总_第6张图片
主从节点,通过 MyCat 中间件后,自动同步,完美!

你可能感兴趣的:(项目开发)