参考:
- mycat官网: http://mycat.org.cn/
- 本文使用的是mycat:1.6.7.6
- mycat安装前必须已经部署好数据库集群。
- 下文的
$PATH
请修改为自己的问卷目录,我的目录为/Users/yw/workspace
下载mycat安装包
# 新建目录
mkdir $PATH/mycatdock
# 切换目录
cd $PATH/mycatdock
# 下载mycat release1.6.7.6到当前目录
wget http://dl.mycat.org.cn/1.6.7.6/20201126013625/Mycat-server-1.6.7.6-release-20201126013625-linux.tar.gz
# 修改压缩包文件名
mv Mycat-server-1.6.7.6-release-20201126013625-linux.tar.gz mycat1.6.7.6.tar.gz
# 解压conf目录到当前目录,因为使用docker直接挂载conf目录会报错,mycat启动时需要依赖conf目录中的文件。
tar -zxvf mycat1.6.7.6.tar.gz
编辑配置文件
调整/root/data/mycat/conf
目录中的配置文件。
配置文件 | 说明 | 参考 |
---|---|---|
server.xml | MyCat 的配置文件,设置账号、参数等 | 请参考这里 |
schema.xml | MyCat 对应的物理数据库和数据库表的配置 | 请参考这里 |
rule.xml | MyCat 分片(分库分表)规则 |
- server.xml 关键节点介绍
root
ebook
ps:
注释掉的privileges 表示root用户的操作权限:
dml 权限顺序为:insert(新增),update(修改),select(查询),delete(删除),0000–> 1111, 0 为禁止权限,1 为开启权限
- schema.xml 关键节点介绍
select user()
select user()
ps:这里没有使用ip,用的域名,需要配置下本地host
- rule.xml
3
下载dockerfile
由于mycat官方并没有提供docker镜像,我们需要自己编写dockerfile文件打包镜像。
# 下载dockerfile文件到当前目录
wget https://raw.githubusercontent.com/AlphaYu/Adnc/master/doc/mycat/Dockerfile
# 如果下载失败,请手动下载并上传到/root/data/mycat目录,文件地址如下
#https://github.com/AlphaYu/Adnc/blob/master/doc/mycat/Dockerfile
# 下载失败可以尝试下代理大法,或者修改host
#wget https://ghproxy.com/https://raw.githubusercontent.com/AlphaYu/Adnc/master/doc/mycat/Dockerfile
当前目录结构:
$PATH
|-mycatdock
|-conf/
|-Dockerfile
|-mycat1.6.7.6.tar.gz
创建mycat镜像与容器
创建镜像文件
docker build -t mycat:1.6.7.6 .
#运行容器并挂载配置文件目录与日志目录
# -v $PATH/mycatdock/conf:/usr/local/mycat/conf 挂载配置文件目录
# -v $PATH/mycatdock/logs:/usr/local/mycat/logs 挂载日志目录
# --network=mycat_network --ip 172.20.0.16 mycat_network是自建的bridge网络,如果使用docker默认网络,不需要这段
#手动创建网络: docker network create mycat_network
docker run --privileged=true -p 8066:8066 -p 9066:9066 --name mycat -v $PATH/mycatdock/conf:/usr/local/mycat/conf -v $PATH/mycatdock/logs:/usr/local/mycat/logs --network=mycat_network --ip 172.20.0.16 -d mycat:1.6.7.6
# docker run --privileged=true -p 8066:8066 -p 9066:9066 --name mycat -v /Users/yw/workspace/mycatdock/conf:/usr/local/mycat/conf -v /Users/yw/workspace/mycatdock/logs:/usr/local/mycat/logs --network=mycat_network -d mycat:1.6.7.6
分库分表分片规则
以上读写分离主从同步都ok,接下来配置分库分表
- 分库分表
rule.xml
文件中定义了各种myCat支持的分片规则
1.取模mod-long
2.自然月分片 sharding-by-month
3.按日期(天)分片sharding-by-date
4.按单月小时拆分sharding-by-hour
5.范围约定,提前规划好分片字段某个范围属于哪个分片,auto-sharding-long
6.范围求模分片
7.取模范围约束sharding-by-pattern
8.分片枚举sharding-by-intfile
9.固定分片hash算法
10.截取数字hash解析sharding-by-stringhash
11.一致性hash
12.日期范围hash分片rangeDateHash
13.截取数字做hash求模范围约束sharding-by-prefixpattern
14.应用指定,在运行阶段有应用自主决定路由到那个分片。sharding-by-substring
15.冷热数据分片 sharding-by-date
16.有状态分片算法
17.crc32slot分片算法
ps:
1、所有的 tableRule 只能使用一次。如果需要为多个表配置相同的分片规则,那么需要在此重新定义该规则。
2、在 crc32Slot 算法中的分片数量一旦给定,MyCat 会将该分片数量和 slor 的取值范围保存到文件中。在次修改分片数量时是不会生效的,需要将该文件删除。文件位置位于 conf目录中的 ruledata 目录中。
验证
通过 navicat 连接 mycat 地址验证也是一样的
# 进入mycat容器
docker exec -it mycat /bin/bash
# 使用ifconfig查询mycat容器ip
# 没有的话安装一下:apt-get update && apt-get install -y net tools
# 我这里mycat容器ip是172.23.0.4
# 登录mysql容器, 是指mycat容器的Ip地址
mysql -uroot -palpha.mycat -P8066 -h172.23.0.4
# 显示所有数据库
show databases;
# 多次执行下面的sql,观察hostname的变化。
select @@hostname;
可能的问题
1、 INFO | jvm 1 | ----/--/-- --:--:-- | Caused by: io.mycat.config.util.ConfigException: schema TEST didn't config tables,so you must set dataNode property!
原因:schema 标签中的dataNode 属性与可嵌套的table 标签有依赖关系 。如果不设置table标签,就必须设置dataNode属性。
2、INFO | jvm 1 | ----/--/-- --:--:-- | Caused by: io.mycat.config.util.ConfigException: SelfCheck### schema TEST refered by user root is not exist!
原因1:server.xml 中TEST 中的schema 的值不要用小写。
原因2:因mycat的conf目录下schema.xml中schema name="TESTDB"对于server.xml数据库用户user不存在,可以注释掉name="user" 实际不存在该用户
原因3:mysql8.0更新了加密方式,修改一下登录账户的加密方式:ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
原因4:使用docker容器启动,schema.xml应该填写容器内部ip:3306端口,或者宿主机+映射到容器外的端口
3、ERROR 3009 (HY000): java.lang.IllegalArgumentException: Invalid DataSource:0
登录数据库后,执行 show tables; 命令执行1分钟(感觉上)。1. schema.xml 中用户名、密码与数据库中保持大小写一致。
4、laravel执行sql:SQLSTATE[HY000]: General error: 1231 Variable 'sql_mode' cant be set to the value of 'NO_AUTO_CREATE_USER'
将'config/database.php'中的strict设置为false
5、手动再master节点上创建的新库,通过mycat访问 SQLSTATE[HY000] [1044] Access denied for user 'root' to database
不要只配置'schema.xml','server.xml'需要配置两个库的访问权限'ebook,ebook2 '
总的体验上来说,感觉mycat就像一个半成品,体验的过程中处理了一个问题又发现一堆问题,还发现了bug,感觉基本无法用于开发,这也和社区活跃度不高的有一定的关系把,建议还是使用 sharding-proxy