本周研究了一下数据库中间件 MyCat ,并验证了 MyCat 单机+MySQL 主从复制
的部署方案,本文来记录一下部署过程中遇到的问题。
为什么要选 MyCat 呢?主要是看中它的分布式部署方案,以及不用更改客户端代码,可以跟 MySQL 无缝整合的能力。
笔者在部署过程中,碰到了几个问题,汇总如下:
MySQL 的从服务器默认处理 SQL 同步 errors 的行为, 给人感觉不太合理,就是一旦出现 SQL 语句同步失败,对应的 SQL 同步线程就会关闭:
这样很容易出现因数据不一致导致从节点同步失败问题,本例在从节点上执行了一个数据库的 drop 操作 drop database db3
,然后去主节点上执行相同操作,就导致同步失败,同步线程终结。
默认从节点一旦遭遇同步操作异常,同步线程就是终结,需要人工干预才能保证主从同步能够继续,怎么想都不合理,有没有解决办法呢?
答案是设置 slave-skip-errors=all
,忽略所有的异常就可以了,在 mysqld
配置下面添加该配置,彻底忽略算了。
主从节点部署成功后,根据主从节点信息,配置好 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 作为一个数据库中间件,连接命令还是 mysql ,所以需要在一个安裝了 MySQL 客户端的服务器上,执行连接命令,端口和服务器 IP 指向 MyCat 所在的主机。
在从节点 192.168.8.117 上,执行连接命令,端口为 8066:
mysql -u root -p12345 -P 8066 -h 192.168.8.182
执行结果:
该异常产生的原因是 MyCat 所在的服务器防火墙未关闭,关闭防火墙后继续访问:
异常信息变成密码错误,对比 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 的 Schema ,就跟 MySQL 一样,验证一下,用逻辑数据库来创建两张新表:
切换到 MySQL 主节点,查看该表所在的分片库 db1 的信息:
登陆 MySQL 从节点,查看该表所在的分片库 db1 的信息:
主从节点,通过 MyCat 中间件后,自动同步,完美!