Mycat2读写分离安装部署
概述
Mycat是完全独立的社区,不依附于任何企业,遵循着完全开放、免费、开源的原则,相关特性请阅读官方文档。本文重点介绍Mycat2
的安装及配置及与.Net Core
后端的整合。该方法适合后端采用Db First
的开发模式使用的,且项目开发阶段可采用直连Mysql开发,生产环境无需代码即可切换到Mycat
。
环境说明
IP | 服务 | 操作系统 | 备注 |
---|---|---|---|
192.168.1.100 | Mycat2-1.22 | Centos7.9 | 读写分离 |
192.168.1.101 | Mysql8.0.27 | Centos7.9 | 主库 |
192.168.1.102 | Mysql8.0.27 | Centos7.9 | 从库 |
读写分离的前提,需要Mysql已实现主从复制,关于Mysql主从复制的配置请阅读Mysql8.x主从复制离线部署
Mycat2安装配置
Mysql安装后涉及多项配置,以下只介绍关键的配置含义,其他配置含义请查阅官方配置指导
- Java环境
Mycat2需要JDK版本为1.8.0及以上
# 查看jdk版本
java -version
# 显示以下信息表示已安装,如未安装则执行下一步骤
openjdk version "1.8.0_352"
OpenJDK Runtime Environment (build 1.8.0_352-b08)
OpenJDK 64-Bit Server VM (build 25.352-b08, mixed mode)
# 安装openjdk,如果没有相应的镜像源,百度找下,也很简单
yum install java-1.8.0-openjdk && java-1.8.0-openjdk-devel
#配置JAVA环境变量
#查看JDK的安装路径
which java #显示:/usr/bin/java
ls -lrt /usr/bin/java #显示:/usr/bin/java -> /etc/alternatives/java
ls -lrt /etc/alternatives/java #显示:/etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64/jre/bin/java
#记住/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64,环境变量需要指定
#编辑环境变量
vim /etc/profile
# 在最后添加以下内容
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
# 使环境变量生效
source /etc/profile
- 下载Mycat2安装包
两个包的版本可以不一致,更新版本只需要升级依赖包即可
下载地址2022年12月23日亲测有效
# 定位到指定的下载目录
cd /data
# 下载依赖包
wget http://dl.mycat.io/2.0/1.22-release/mycat2-1.22-release-jar-with-dependencies-2022-10-13.jar
# 下载主程序包
wget http://dl.mycat.io/2.0/install-template/mycat2-install-template-1.21.zip
# 解压主程序包
unzip mycat2-install-template-1.21.zip #会生成一个mycat目录
# 将依赖包拷贝至 /data/mycat/lib下
cp mycat2-1.22-release-jar-with-dependencies-2022-10-13.jar /data/mycat/lib
# 授予/data/mycat/bin 文件夹里边可执行权限:
chmod +x /data/mycata
- 用户配置
设置Mycat登录的用户名密码,与Mysql无关
# 修改用户配置
vi /data/mycat/conf/users/root.user.json
# 完整内容如下
{
"dialect":"mysql",
"ip":null,
"password":"123456", //密码
"transactionType":"proxy",
"username":"root" //用户名
}
- 主从配置
安装程序在/data/mycat/conf/datasources/
目录下默认生成了prototypeDs.datasource.json
,以此为模板分别创建master.datasource.json
、slave.datasource.json
- 复制生成配置文件
cd /data/mycat/conf/datasources/
cp prototypeDs.datasource.json master.datasource.json #主库配置
cp prototypeDs.datasource.json slave.datasource.json #从库配置
rm -rf prototypeDs.datasource.json #删除原型文件
- 主库
vi master.datasource.json
> Mysql的连接参数最好是创建Mycat专用的用户名密码,这里演示直接用的root
#完整内容如下
{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
//数据库读写类型:READ、WRITE、READ_WRITE,主库访问为只写
"instanceType":"WRITE",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"master",
//Mysal主库密码
"password":"123456",
"type":"JDBC",
//Mysql主库连接参数
"url":"jdbc:mysql://192.168.1.101:3308/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
//Mysql主库用户名
"user":"root",
"weight":0
}
- 从库
Mysql的连接参数最好是创建Mycat专用的用户名密码,这里演示直接用的root
vi master.datasource.json
>
#完整内容如下
{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
//数据库读写类型:READ、WRITE、READ_WRITE,从库访问为只读
"instanceType":"READ",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"master",
//Mysal从库密码
"password":"123456",
"type":"JDBC",
//Mysql从库连接参数
"url":"jdbc:mysql://192.168.1.102:3308/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
//Mysql从库用户名
"user":"root",
"weight":0
}
- 开放端口启动服务
Mycat默认端口为
8066
# 开发端口
firewall-cmd --permanent --zone=public --add-port=8066/tcp
firewall-cmd --reload
# 启动服务
cd /data/mycat
./bin/mycat start
# 其他命令
./bin/mycat status # 查看状态
./bin/mycat stop # 停止
./bin/mycat pause # 暂停
./bin/mycat restart # 重启
./bin/mycat console # 前台运行
tail -f /home/papis/mycat2/mycat/logs/wrapper.log # 查看日志文件
至此读写分离配置已完成
测试读写分离
- 使用navicat登录mycat
- 再Mycat中创建test数据库,并在test数据库中创建一张person表,再查看master和slave数据库是否存在test数据库和person表,如果存在说明Mysql主从复制时OK的
// Mycat中Person表创建语句
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for Person
-- ----------------------------
DROP TABLE IF EXISTS `Person`;
CREATE TABLE `Person` (
`Id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '主键',
`Name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '名称',
`Age` int NOT NULL COMMENT '年龄',
`Remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`Id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
- 添加一条带系统变量的数据
hostname
- Mycat上执行添加数据脚本
//注意:person开头为大写
INSERT INTO person (Id,`Name`,Age,Remark) VALUES('56697c47-6666-4650-a5d5-5c0bffc49ff2','张三',18,@@hostname)
Mycat、Mysql-Master、Mysql-Slave,结果均如下图所示
- Mysql-Master上执行添加数据脚本
//注意:Person开头为大写
INSERT INTO Person (Id,`Name`,Age,Remark) VALUES('56697c47-6666-4650-a5d5-5c0bffc49ff4','李四',18,@@hostname)
Mycat、Mysql-Master、Mysql-Slave,结果均如下图所示
- Mysql-Slave上执行添加数据脚本
//注意:Person开头为大写
INSERT INTO person (Id,`Name`,Age,Remark) VALUES('56697c47-6666-4650-a5d5-5c0bffc49ff5','王五',18,@@hostname)
Mycat结果如下图所示
Mysql-Master结果如下图所示
Mysql-Slave结果如下图所示
如上操作结果显示,则说明Mycat部署已实现读写分离操作。
问题
发现一个问题,Mycat无法区分大小写的问题,网上找到的答案都是将Mysql忽略大小写是可以解决的,但是如果想保留大小写,该如何解决,待后续完善…