MySQL 读写分离,分库分表 mycat (体验)

参考:

  • mycat官网: http://mycat.org.cn/
  1. 本文使用的是mycat:1.6.7.6
  2. mycat安装前必须已经部署好数据库集群。
  3. 下文的$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

你可能感兴趣的:(MySQL 读写分离,分库分表 mycat (体验))