mycat2实现读写分离

mycat2版本讲解

前言

下载安装可参考上一篇文章 centos/linux下载安装mycat2
下边我将演示一主一从的读写分离。
在这里插入图片描述
由上图可以看出,mycat是直接接管我们的请求,然后分发到不同的数据库中,我们程序也是直接连接mycat,而不是数据库了。

准备工作

在配置之前,我们需要准备两个数据库,一主一从,并且已经完成了主从同步的配置,测试用的数据库、表确保都已经存在,同时创建好mycat要用的账户(主库、从库都需要配置)。

  • 创建所需库表
    这里为了省事,把 Mycat 服务用的 mycat 库和后面主从同步的test_data 库都放在了主节点上。
    在这里插入图片描述在这里插入图片描述

  • 配置主从同步
    mysql读写分离配置可以参考:
    mysql主从复制,主主同步-传统方法
    mysql基于GTID主从复制

  • 创建账号

    CREATE USER 'mycat'@'%' IDENTIFIED BY '123456'; 
    GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%' ;
    flush PRIVILEGES;
    

    注意:主从都需要创建

配置

  • 增加数据源

    增加数据源:主数据源和从数据源;
    cd /mycat/conf/datasources

    1、配置mycat原型库(连接库)

    mycat只要连接上mysql就会自动创建库名为mycat的数据库和表。

    在这里插入图片描述

    什么原型库参考:原型库是什么?
    总结:某个mysql或者默认存储数据的mysql就是原型库

    vim prototypeDs.datasource.json
    
    {
            "dbType":"mysql",
            "idleTimeout":60000,
            "initSqls":[],
            "initSqlsGetConnection":true,
            "instanceType":"READ_WRITE",
            "maxCon":1000,
            "maxConnectTimeout":3000,
            "maxRetryCount":5,
            "minCon":1,
            "name":"prototypeDs",
            "password":"123456",
            "type":"JDBC",
            "url":"jdbc:mysql://localhost:3306?useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
            "user":"mycat",
            "weight":0
    }
    

    配置中的url你可以写mysql中任何一个存在的库,也可以不写,也可以直接默认,反正这里只是用来让mycat连接上mysql就行了,只要ip、端口、账号、密码正确就行,正式配置读写分离你可以直接再定义数据源配置文件,当然你也可以把这个自带的配置文件当作主或者从配置文件,都不影响,我这里没有用,重新定义了两个主从配置,方便讲解区分吧。

    2、添加主数据源:

    cp prototypeDs.datasource.json master.datasource.json
    
    vim master.datasource.json
    

    在这里插入图片描述
    主要修改数据源成test_data、name属性为master

    如果有多个主节点就再配置一份叫mater02.datasource.json

    3、增加从数据源:
    在这里插入图片描述

    主要修改数据源成test_data、name属性为slave、读写模式instanceType改成只读模式READ

    如果有多个从节点就再配置一份叫slave02.datasource.json

  • 配置数据源集群
    由于配置读写分离涉及到多个数据库,所以就要配置数据源集群。
    cd /mycat/conf/clusters

    cp prototype.cluster.json master-slave.cluster.json
    
    vim master-slave.cluster.json
    
    {
        // 集群类型:SINGLE_NODE(单节点)、MASTER_SLAVE(普通主从)、GARELA_CLUSTER(garela cluster/PXC集群)等
        "clusterType":"MASTER_SLAVE",
        "heartbeat":{
            "heartbeatTimeout":1000,
            "maxRetry":3,
            "minSwitchTimeInterval":300,
            "slaveThreshold":0
        },
        "masters":[
            // 主节点数据源名称
            "master"
           // "master02"
        ],
        "replicas":[
            // 从节点数据源名称
            "slave"
           // "slave02"
        ],
        "maxCon":200,
        // 集群名称。在后面配置物理库(schema)时会用到
        "name":"master-slave",
        "readBalanceType":"BALANCE_ALL",
        // NOT_SWITCH(不进行主从切换)、SWITCH(进行主从切换)
        "switchType":"NOT_SWITCH"
    }
    

    主要配置主从数据源的名称,name就对应前边配置数据源(*.datasource.json)中所定义的name的值

  • 配置物理库 schemas和mycat数据源/集群的关联关系
    上边的集群和数据源都配置好了,那么就差跟mycat关联起来了,让mycat知道我们配置好的目标库应该指向哪个物理库。
    cd /mycat/conf/schemas

    vim master_slave.schema.json
    
    {
        // 物理库
        "schemaName": "test_data",
        // 指向集群,或者数据源
        "targetName": "master-slave"
        // 这里可以配置数据表相关的信息,在物理表已存在或需要启动时自动创建物理表时配置此项
        "normalTables": {}
    }
    

至此读写分离配置完成,下边开始测试。

测试

  • 测试准备
    开启日志,方便查看每个数据库的sql执行情况(用的navicat连接工具),这里主要用来查询插入数据的日志。

    --查看是否开启
    show variables like 'log%';
    show variables like 'general%';
    -- 开启日志
    SET GLOBAL log_output = 'TABLE'; SET GLOBAL general_log = 'ON';
    -- 清空日志
    TRUNCATE TABLE mysql.general_log;
    

    准备插入和查询的sql语句

    -- 插入一条数据
    INSERT INTO user VALUES(1, '张三',24,12.45,'备注一下');
    -- 查询
    SELECT * FROM user;
    
  • 测试
    mycat中插入一条数据

    INSERT INTO user VALUES(1, '张三',24,12.45,'备注一下');
    

    执行完sql语句之后,查看日志详情

    -- 查询日志详情
    	SELECT event_time,
    	       user_host,
    	       thread_id,
    	       server_id,
    	       command_type,
    	       CAST(argument AS CHAR(500) CHARACTER SET utf8mb4) argument
    	FROM mysql.general_log
    	ORDER BY event_time DESC;
    

    在这里插入图片描述
    可以看到在主数据库的日志中有插入的记录,而在从数据源的日志中并没有。
    在这里插入图片描述
    再测试查询是否会查询两个库。
    先将从库的数据改一下,张三改成李四,等会查询的时候就能知道查的是哪个库,改从库不会同步到主库。
    在这里插入图片描述

    SELECT * FROM user;
    

    测试查询结果:
    在这里插入图片描述
    在这里插入图片描述
    可以看到,一会查询的是张三,一会是李四,证明两个库都会查询,权重的话,可以在datasources下的master和slave数据源文件下修改weight属性。
    在这里插入图片描述
    最后关闭日志

    	-- 测试完成记得关一下
    	SET GLOBAL log_output = 'FILE'; SET GLOBAL general_log = 'OFF';
    

    其实也不用开启日志,查看日志那么麻烦,直接mycat插入,如果真的添加到从库了,那主库里肯定没有数据,因为从库不会同步主库,如果插入信息之后两个库都有,那么一定是插入到主库里了。

至此,mycat读写分离就完成了,在配置过程中遇到了很多的小麻烦,如果没遇到就跳过这个段内容,造成的原因大概有一下几个方面:
1、文件夹或文件的权限太低,导致软件启动无法读取配置,建议配置全部完成后,统一给mycat路径赋权限。
2、主从数据源配置问题,地址、数据库、命名name忘记改对,因为是复制的,总是少改。
3、还有就是启动不起来,一直报错Duplicate key LogicSchemaConfig,这个原因就是在自己测试的时候创建了重复的schema,比如,在配置读写分离之前利用mycat创建了test_data库,然后配置好读写分离,再次启动就会有这个问题,另外,就是没有配置读写分离,就是简单的使用mycat,但是在datasources下存在多个datasource.json文件,也是会出这个问题。

数据分片的配置和用法参考:mycat2实现数据分片

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值