• 搭建MyCat2一主一从的MySQL读写分离


    搭建MyCat2读写分离

    通过Mycat2与MySQL的主从同步复制配合就可以搭建MySQL数据库的读写分离,这里搭建MyCat2一主一从的MySQL读写分离。

    搭建MySQL主从复制

    搭建MySQL主从复制参考:在Windows环境与Linux环境下搭建MySQL主从同步

    1.做好主从的MySQL中有mydb这个库,且已经存在表和数据

    2.登录主库:mysql -h localhost -P3306 -uroot -p

    mysql> CREATE DATABASE mydb;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> use mydb;
    Database changed
    mysql> CREATE TABLE mytb(id INT,name VARCHAR(30));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> INSERT INTO mytb VALUES(1,'mycat');
    Query OK, 1 row affected (0.01 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.登录从库:mysql -h localhost -P3307 -uroot -p

    mysql> use mydb;
    Database changed
    mysql> select * from mytb;
    +------+---------+
    | id   |  name   |
    +------+---------+
    |    1 |  mycat	 |
    +------+---------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    安装MyCat2

    安装MyCat2参考:MyCat2的介绍与安装以及基本使用

    配置逻辑库

    登录Mycat:mysql -uroot -p123456 -h localhost -P 8066,创建逻辑库

    mysql> create database mydb;
    Query OK, 1 row affected (0.00 sec)
    
    • 1
    • 2

    执行create database mydb;后,将在/mycat/conf/schemas/自动生成mydb.schema.json文件

    {
    	"customTables":{},
    	"globalTables":{},
    	"normalProcedures":{},
    	"normalTables":{},
    	"schemaName":"mydb",
    	"shardingTables":{},
    	"views":{}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    customTables:mycat默认的表的配置
    
    globalTables:全局表的配置
    
    shardingTables:分片表的配置
    
    normalTables:普通表的配置
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    修改schema的配置,指定mydb逻辑库默认的targetName,mycat会自动加载mydb下已经有的物理表或者视图作为单表

    {
    	"customTables":{},
    	"globalTables":{},
    	"normalProcedures":{},
    	"normalTables":{},
    	"schemaName":"mydb",
    	"targetName":"prototype"
    	"shardingTables":{},
    	"views":{}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    查看修改之后的schema的配置,发现已经自动加载了相关信息到normalTables中

    {
    	"customTables":{},
    	"globalTables":{},
    	"normalProcedures":{},
    	"normalTables":{
    		"mytb":{
    			"createTableSQL":"CREATE TABLE `mydb`.`mytb` (\n\t`id` int(11) DEFAULT NULL,\n\t`name` varchar(30) DEFAULT NULL\n) ENGINE = InnoDB CHARSET = utf8",
    			"locality":{
    				"schemaName":"mydb",
    				"tableName":"mytb",
    				"targetName":"prototype"
    			}
    		}
    	},
    	"schemaName":"mydb",
    	"shardingTables":{},
    	"views":{}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    登录Mycat:mysql -uroot -p123456 -h localhost -P 8066,进行查询

    mysql> use mydb;
    Database changed
    mysql> SELECT * FROM mytb;
    +------+-------+
    | id   | name  |
    +------+-------+
    |    1 | mycat |
    +------+-------+
    1 row in set (0.03 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    此时,架构如下:

    应用程序
    mycat
    MySQL

    添加数据源

    登录Mycat:mysql -uroot -p123456 -h localhost -P 8066,使用注解方式添加数据源

    添加主库数据源

    mysql> /*+ mycat:createDataSource{ "name":"write","url":"jdbc:mysql://IP:3306/mydb?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"mycat","password":"123456" } */;
    Query OK, 0 rows affected (0.00 sec)
    
    • 1
    • 2

    添加从库数据源

    mysql> /*+ mycat:createDataSource{ "name":"red","url":"jdbc:mysql://IP:3307/mydb?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root","password":"123456" } */;
    Query OK, 0 rows affected (0.00 sec)
    
    • 1
    • 2

    查询配置数据源结果

    mysql> /*+ mycat:showDataSources{} */;
    Query OK, 0 rows affected (0.00 sec)
    
    • 1
    • 2

    在这里插入图片描述
    通过注释命名添加数据源后,在对应目录会生成相关配置文件,查看数据源配置文件:mycat/conf/datasources

    [root@administrator mycat]# ls conf/datasources
    prototypeDs.datasource.json  red.datasource.json  write.datasource.json
    
    • 1
    • 2

    更新集群配置

    使用mycat自带的默认集群:prototype,对其修改更新即可

    /*! mycat:createCluster{"name":"prototype","masters":["write"],"replicas":["red"]} */;
    
    • 1

    查看配置集群信息

    /*+ mycat:showClusters{} */;
    
    • 1

    在这里插入图片描述
    查看集群配置文件,发现集群配置信息已经更新

    vim /usr/local/mycat/conf/clusters/prototype.cluster.json
    
    • 1
    {
    	"clusterType":"MASTER_SLAVE",
    	"heartbeat":{
    		"heartbeatTimeout":1000,
    		"maxRetryCount":3,
    		"minSwitchTimeInterval":300,
    		"showLog":false,
    		"slaveThreshold":0.0
    	},
    	"masters":[
    		"write"
    	],
    	"maxCon":2000,
    	"name":"prototype",
    	"readBalanceType":"BALANCE_ALL",
    	"replicas":[
    		"red"
    	],
    	"switchType":"SWITCH"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    readBalanceType:查询负载均衡策略

    BALANCE_ALL(默认值):获取集群中所有数据源
    
    BALANCE_ALL_READ:获取集群中允许读的数据源
    
    BALANCE_READ_WRITE:获取集群中允许读写的数据源,但允许读的数据源优先
    
    BALANCE_NONE:获取集群中允许写数据源,即主节点中选择
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    switchType:控制主从切换

    NOT_SWITCH:不进行主从切换
    
    SWITCH:进行主从切换
    
    • 1
    • 2
    • 3

    此时,架构如下

    应用程序
    mycat
    主MySQL
    从MySQL

    验证读写分离

    修改MySQL的配置文件:my.cnf,设置logbin格式binlog_format=STATEMENT,重启MySQL,确保此时主从复制正常

    登录MyCat:mysql -uroot -p123456 -h IP -P 8066,向数据表插入系统变量值,以此造成主从数据不一致,便于验证读写分离。

    mysql> use mydb;
    Database changed
    mysql> INSERT INTO mytb VALUES(2,@@hostname);
    
    • 1
    • 2
    • 3

    登录主库:mysql -uroot -h IP -P 3306 -p查看表数据

    mysql> SELECT * FROM mytb;
    +------+---------------+
    | id   | name          |
    +------+---------------+
    |    1 | mycat         |
    |    2 | administrator |
    +------+---------------+
    2 rows in set (0.01 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    登录从库:mysql -uroot -h IP -P 3307 -p查看表数据

    mysql> use mydb;
    Database changed
    mysql> select * from mytb;
    +------+--------------+
    | id   | name         |
    +------+--------------+
    |    1 | mycat        |
    |    2 | 5990c4387bd9 |
    +------+--------------+
    2 rows
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    登录MyCat:mysql -uroot -p123456 -h IP -P 8066,查询验证

    mysql> SELECT * FROM mytb;
    +------+---------------+
    | id   | name          |
    +------+---------------+
    |    1 | mycat         |
    |    2 | administrator |
    +------+---------------+
    2 rows in set (0.01 sec)
    
    mysql> SELECT * FROM mytb;
    +------+--------------+
    | id   | name         |
    +------+--------------+
    |    1 | mycat        |
    |    2 | 5990c4387bd9 |
    +------+--------------+
    2 rows in set (0.01 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    大模型能力
    C++:栈与队列,优先级队列
    压缩包格式可以转换吗?如何转换?
    华为实习总结xkh
    Java知识体系索引
    Kryo反序列化链分析
    编译 Android历程
    cdh6.2+ 集成flink1.14.4
    阿里二面:有一个 List 对象集合,如何优雅地返回给前端?
    leetcode困难题
  • 原文地址:https://blog.csdn.net/qq_38628046/article/details/125786286