前言
Mycat 是一个数据库的分区分表中间件,支持多种数据库,也支持读写分离,本文主要描述一下对 MySQL 进行读写分离的基本配置。
环境说明
CentOS 7(Minimal Install)
$cat /etc/system-release
CentOS Linux release 7.7.1908 (Core)
本例使用用户 admin 进行安装,请参考 CentOS 7 安装后的系统初始化
PXC 的配置如下
Node
Host
IP Addr
Descprition
Node1
pxc1
10.11.0.81/24
集群节点1
Node2
pxc2
10.11.0.82/24
集群节点2
Node3
pxc3
10.11.0.83/24
集群节点3
PXC 中新建数据库和表如下
Schema
Table
Description
percona
example
示例表
安装
Mycat 依赖 Java,所以需要安装 Java。
安装 Java
安装软件包
$sudoyum installjava-1.8.0-openjdk
配置 JAVA_HOME 环境变量
$sudovi /etc/profile
在 profile 配置的最后,追加 java 的目录
export JAVA_HOME=/usr
:wq 保存并退出。
刷新配置,使环境变量生效
$source /etc/profile
最后查看一下 JAVA_HOME 的环境配置
$echo $JAVA_HOME
/usr
也可以再查看一下 Java 的版本
$java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
安装 Mycat
下载 Mycat 安装包到本地
$cd ~
$curl -O http://dl.mycat.io/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
解压 Mycat
$tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
解压的文件夹是 mycat , 接下来,将 mycat 文件夹剪切到 /usr/local 目录中
$sudo mvmycat/ /usr/local/
配置 Mycat 的环境变量
$sudovi /etc/profile
在 profile 的最后,追加 MYCAT_HOME 环境变量
export JAVA_HOME=/usr
export MYCAT_HOME=/usr/local/mycat
刷新配置,使环境变量生效
$source /etc/profile
查看一下 MYCAT_HOME 环境变量
$echo $MYCAT_HOME
/usr/local/mycat
至此, Mycat 安装完毕,接下来我们需要进行配置。
读写分离配置
Mycat 的配置文件在 $MYCAT_HOME/conf 文件夹内,对于读写分离,主要配置以下文件
schema.xml 配置逻辑库表和数据节点
server.xml 配置服务器权限
配置 schema.xml
schema.xml 主要是配置 mycat 与后端数据库的对应关系
$cd $MYCAT_HOME/conf
$cpschema.xml schema.xml.orgi
$vi schema.xml
配置文件例子如下
select user()
这里的 writeHost 和 readHost 是代表后端真实的 MySQL 数据库的连接参数
说明
本例配置了两个 writeHost ;
如果第一个 writeHost 连接不上(或者宕机),会继续用第二个 writeHost 作为写节点;
事务内部的一切操作都会走写节点;
配置 server.xml
$cd $MYCAT_HOME/conf
$cpserver.xml server.xml.orgi
$vi server.xml
主要配置如下
3306
9066
secret
percona
percona
说明:
本例修改了默认的 serverPort 由原来的 8066 改为默认的 3306,您可以根据自己的需要更改。
本例新建了连接 mycat 的 root 用户(用户名可以修改)
启动 mycat
$cd $MYCAT_HOME
$bin/mycat start
Starting Mycat-server...
可以看到 Mycat-server 启动了
查看启动日志
$cd $MYCAT_HOME
$taillogs/wrapper.log
...
...INFO | jvm 1 | 2020/02/17 10:57:33 | MyCAT Server startup successfully. see logs in logs/mycat.log
最后日志写的 MyCAT Server startup successfully 表示启动成功
关闭 mycat
$cd $MYCAT_HOME
$bin/mycat stop
Stopping Mycat-server...
Stopped Mycat-server.
可以看到 Mycat-server 停止了
查看一下日志
$cd $MYCAT_HOME
$taillogs/wrapper.log
...
...STATUS | wrapper | 2020/02/17 11:00:27 | TERM trapped. Shutting down.
STATUS | wrapper | 2020/02/17 11:00:28 |
连接 mycat
本例使用 MySQL 5.7 客户端连接
首先安装 MySQL 的 yum 源
$sudoyum installhttps://repo.percona.com/yum/percona-release-latest.noarch.rpm
之后安装 MySQL client
$sudoyum installPercona-XtraDB-Cluster-client-57
安装完 mysql 客户端,可以本机登录 mycat
注意
连接 mycat 的 mysql 的命令行参数不能缺少 -h 参数,即使是连接本机
$mysql -h 127.0.0.1 -u root -p
Enter password:Welcome to the MySQL monitor. Commands end with ;or \g.
...
...Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>show databases;
+----------+
| DATABASE |
+----------+
| percona |
+----------+
1 row in set (0.00 sec)mysql>exit
Bye
连接 mycat 管理口
管理口默认为 9066,为 server.xml 中 managerPort 属性的值
$mysql -h 127.0.0.1 -P 9066 -u root -p
连接成功之后,可以通过 show @@help; 命令,查看支持的管理命令
mysql>show @@help;
+------------------------------------------+----------------------------------+
| STATEMENT | DESCRIPTION |
+------------------------------------------+----------------------------------+
| show @@time.current | Report current timestamp |
| ... | ... |
| ... | ... |
| ... | ... |
| clear @@slow where datanode = ? | Clear slow sql by datanode |
+------------------------------------------+----------------------------------+
59 rows in set (0.01 sec)
读写分离测试
修改日志级别
主要是使用查日志来查看效果,需要先将 mycat 的 log4j2.xml 的日志级别修改为 debug 级别。
$cd $MYCAT_HOME
$bin/mycat stop
$vi conf/log4j2.xml
找到如下的节点并修改
添加 这个节点,表示对 io.mycat 包的日志级别为 debug.
:wq 保存修改之后,重新启动一下 Mycat
$cd $MYCAT_HOME
$bin/mycat start
Starting Mycat-server...
测试
连接到 mycat,并使用测试数据库执行一个查询语句。
$mysql -h 127.0.0.1 -u root -p
mysql>use percona;
mysql>select * from example;
之后查询日志
$grep 'select * from example' $MYCAT_HOME/logs/mycat.log
...
...2020-02-17 15:56:41.058 DEBUG ...
attachment=node1{select * from example}, respHandler=SingleNodeHandler
[node=node1{select * from example}, packetId=4], host=10.11.0.82, port=3306,
statusSync=...]
可以看到,host=10.11.0.82 说明 SQL 语句是读节点进行查询
再添加一条插入语句,测试写入节点
mysql>insert into example(node_id, node_name) values (2, 'percona2');
之后查询日志
$grep 'insert into example' $MYCAT/logs/mycat.log
...
...2020-02-17 15:58:41.486 DEBUG ...
[node=node1{insert into example(node_id, node_name) values (2, 'percona2')},
packetId=1], host=10.11.0.81, port=3306, statusSync=...]
可以看到,host=10.11.0.81 说明 SQL 语句是在写节点执行的,读写分离没有问题。
总结
Mycat 还有很多特性,本例只示例了 MySQL 的读写分离。
参考资料