【Mycat2实战】三、Mycat实现读写分离

1. 无聊的理论知识

image-20231114093853568

什么是读写分离

读写分离,基本的原理是让主数据库处理事务性增、改、删操作, 而从数据库处理查询操作。

为什么使用读写分离

从集中到分布,最基本的一个需求不是数据存储的瓶颈,而是在于计算的瓶颈,即 SQL 查询的瓶颈,我们知道,正常情况下,Insert SQL 就是几十个毫秒的时间内写入完成,而系 统中的大多数 Select SQL 则要几秒到几分钟才能有结果,很多复杂的 SQL,其消耗服器 CPU 的能力超强,不亚于死循环的威力。

读写分离方案

MyCat的读写分离是建立在MySQL主从复制基础之上实现的,所以必须先搭建MySQL的主从复制。数据库读写分离对于⼤型系统或者 访问量很⾼的互联网应用来说,是必不可少的⼀个重要功能。

image-20231114094002230

注意: Mycat实现的读写分离和自动切换机制,需要MySQL的主从复制机制配合。

读写分离存在的问题

主从数据延迟,导致业务数据无法保证强一致性

Mysql 主从复制的常用拓扑结构

一主一从 最基础的复制结构,用来分担之前单台数据库服务器的压力, 可以进行读写分离。

一主多从 一台 Slave 承受不住读请求压力时,可以添加多台,进行负载均衡,分散读压力。

双主复制 双主结构就是用来解决这个问题的,互相将对方作为自己的 Master,自己作为对方的 Slave 来进行复制,但对外来讲,还是一个主和一个从。

级联复制 级联结构就是通过减少直接从属于 Master 的 Slave 数量,减轻 Master 的压力,分散复制请求,从而提高整体的复制效率。

双主级联 Mysql 的复制结构有很多种方式,复制的最大问题是数据延时,选择复制结构时需要根据自己的具体情况,并评估好目标结构的延时对系统的影响。

2. Mycat搭建读写分离

本文以一主一从的读写分离方案搭建进行演示。

mycat是直接接管我们的请求,然后分发到不同的数据库中,我们程序也是直接连接mycat,而不是数据库了。

2.1 准备工作

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

Mysql主从同步同步搭建过程参考文章包教包会:Mysql主从复制搭建,这里就不再赘述了。

因为已经主从同步,创建语句只需要在master库执行即可

创建测试数据库语句:

CREATE DATABASE IF NOT EXISTS `test-xxf`;

创建测试表语句,当然这里也可以不创建,利用Mycat也可以进行创建表的操作。

CREATE TABLE `xxf_user` (
	`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
	`user_name` VARCHAR(30) NULL DEFAULT NULL COMMENT '用户姓名',
	`email` VARCHAR(50) NULL DEFAULT NULL COMMENT '用户邮箱',
	`phone` VARCHAR(11) NULL DEFAULT NULL COMMENT '手机号码',
	`sex` CHAR(1) NULL DEFAULT NULL COMMENT '用户性别',
	PRIMARY KEY (`id`) USING BTREE
) COMMENT='笑小枫-用户信息表' COLLATE='utf8_general_ci' ENGINE=InnoDB;

image-20231114100624317

创建Mycat的账号,如果开启了全部操作的主从库同步,在主库创建则自动会同步到从库。

CREATE USER 'mycat'@'%' IDENTIFIED BY '123456'; 
-- 必须要有的权限 mysql8才有的
GRANT XA_RECOVER_ADMIN ON *.* TO 'mycat'@'%';
-- 权限根据需求来给,这里直接给的全部权限
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%' ;
flush PRIVILEGES;

2.2 Mycat配置

在Mycat安装部署一文中已经配置了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/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
        "user":"mycat",
        "weight":0
}

3.3 添加主数据源

进入mycat目录下的conf/datasources目录,复制 prototypeDs.datasource.json 并将名称设为master.datasource.json

cp prototypeDs.datasource.json master.datasource.json

操作完后,如下图所示:

image-20231114103840720

修改master.datasource.json

vim master.datasource.json

主要修改数据源成jdbc:mysql://localhost:3306/test-xxf、name属性为master,如果用户名密码发生变化,则需要一并修改,然后保存退出。

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

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

3.4 添加从数据源

同主数据源配置一样,复制master.datasource.json设置为slave.datasource.json,然后进行编辑

cp master.datasource.json slave.datasource.json

vim slave.datasource.json

主要修改数据源成从库连接jdbc:mysql://localhost:3307/test-xxf、name属性为slave读写模式instanceType改成只读模式READ,如果用户名密码发生变化,则需要一并修改,然后保存退出。

{
        "dbType":"mysql",
        "idleTimeout":60000,
        "initSqls":[],
        "initSqlsGetConnection":true,
        "instanceType":"READ",
        "maxCon":1000,
        "maxConnectTimeout":3000,
        "maxRetryCount":5,
        "minCon":1,
        "name":"slave",
        "password":"123456",
        "type":"JDBC",
        "url":"jdbc:mysql://localhost:3307/test-xxf?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
        "user":"mycat",
        "weight":0
}

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

3.5 配置数据源集群

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

cp prototype.cluster.json master-slave.cluster.json

vim master-slave.cluster.json

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

修改name为(*.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"
}

3.6 配置物理库 schemas和mycat数据源/集群的关联关系

上边的集群和数据源都配置好了,那么就差跟mycat关联起来了,让mycat知道我们配置好的目标库应该指向哪个物理库,创建一个新的master_slave.schema.json文件。

cd conf/schemas

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

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

3. 测试Mycat读写分离

在mycat上执行命令,可以查看到Mycat的数据源

/*+ mycat:showDataSources{} */

image-20231114150717407

连接mycat,在mycat里面执行sql。准备下面的sql语句,插入一条数据。

INSERT INTO `xxf_user` VALUES (1, '张三', 'zhangsan@xiaoxiaofeng.com', '18300000000', '1');

然后可以在master和slave里面都看到了插入的数据。

因为我们数据设置的是,主数据库向从数据库同步,所以写操作发生在master数据源,然后同步到slave数据库。

image-20231114141050107

执行查询语句,可以看到刚刚插入的数据。

SELECT * FROM xxf_user;

image-20231114142355747

为了更好的判断数据库读的是主库还是从库,我们手动修改从库的user_name为张三slave,修改从库数据,不会往主库同步,日常使用中不要修改从库数据,不然会导致数据不一致。

image-20231114142740576

可以看到,一会查询的是张三,一会是张三slave,证明两个库都会查询,权重的话,可以在datasources下的master和slave数据源文件下修改weight属性。

image-20231114145745559

4. 总结一下吧

本文主要讲解了如何使用Mycat实现一主一从的读写分离。一主多从、双主复制、多主多从,文章也是简单的提了一下,小伙伴门感兴趣可以自己去尝试,就是配置多个主从的数据源。

如果在搭建的过程中有任何疑问,可以评论区留言或者关注微信公众号留言,博主看到会及时的给予解答。

5. 本系列文章

本系列文章持续更新中,包括Mycat搭建,读写分离,分库分表等,敬请期待。

后续更新完成统一维护链接,占个坑先…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/149103.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从CentOS向KeyarchOS操作系统的wordpress应用迁移实战

文章目录 从CentOS向KeyarchOS操作系统的wordpress应用迁移实战一、使用浪潮信息X2Keyarch迁移工具完成操作系统的迁移1.1 迁移前的验证1.2 执行迁移评估1.3 开始迁移1.4 验证迁移结果1.5 迁移后的验证 二、总结 从CentOS向KeyarchOS操作系统的wordpress应用迁移实战 CentOS是一…

顶点着色器

顶点着色器(vertex shader)是-一段运行在图形卡GPU中的程序,它可取代固定功能流水线中的变换和光照环节(当然,这也不是绝对的,因为在硬件不支持顶点着色器的情况下,Dict3D运行时就会用软件运算方式来模拟顶点着色器) 可以看出&…

day22_mysql

今日内容 零、 复习昨日 一、MySQL 一、约束 1.1 约束 是什么? 约束,即限制,就是通过设置约束,可以限制对数据表数据的插入,删除,更新 怎么做? 约束设置的语法,大部分是 create table 表名( 字段 数据类型(长度) 约束, 字段 数据类型(长度) 约束 );1.1 数据类型 其实数据类型…

门店如何设置多个联系电话和营业时间

​小程序中门店信息是非常重要的,通常需要有门店地址、门店电话和营业时间等。采云小程序支持设置多个门店联系电话,避免客户无法联系到门店。而且,也支持设置多个营业时间时段。例如周一到周五早08:00 - 18:00 。客户在周末下单的时候&#…

基于ssm流浪动物救助管理系统

基于ssm流浪动物救助管理系统 摘要 随着城市化的不断发展,流浪动物问题逐渐凸显,而对流浪动物的救助和管理成为社会关注的焦点。本文基于SSM(SpringSpringMVCMyBatis)框架,设计并实现了一套流浪动物救助管理系统。该系…

初识VBA代码及应用VBA代码第四节:如何录制宏

《VBA之Excel应用》(10178983)是非常经典的,是我推出的第七套教程,定位于初级,目前是第一版修订。这套教程从简单的录制宏开始讲解,一直到窗体的搭建,内容丰富,实例众多。大家可以非…

uniapp——项目day05

购物车页面 结算区域 把结算区域封装为组件 1. 在 components 目录中&#xff0c;新建 my-settle 结算组件&#xff1a; 2. 初始化 my-settle 组件的基本结构和样式&#xff1a; <template><view class"my-settle-container">结算组件</view> …

Oneid 图计算思路

一、前文 oneid 是用户画像的核心&#xff0c;此文提供图计算的具体方案。 二、方案 注意事项&#xff1a; 1. 业务存在解绑信息&#xff0c;当不与其他业务系统产生关联时&#xff0c;沿用旧oneid。 2. oneid 需要自增&#xff0c;下游系统会用到bitmap等数据类型&#xff0…

2023.11.15使用bootstrap做一个简洁的注册页面

2023.11.15使用bootstrap做一个简洁的注册页面 设置密码必须大于等于6位&#xff0c;并且包含大写字母、小写字母、特殊字符或者数字中的三种。 关注&#xff1a;type"button"和type"submit"之间的区别&#xff1a; type"button"用于普通按钮&…

C# Socket通信从入门到精通(9)——如何设置本机Ip地址

前言&#xff1a; 我们开发好Socket通信程序以后&#xff0c;上机调试的时候&#xff0c;首先要做的就是先设置好电脑的IP&#xff0c;这样才能实现不同的电脑之间的通信&#xff0c;并且电脑1的ip地址和电脑2的Ip地址要同处于一个网段&#xff0c;比如电脑1的Ip地址为192.168…

亚马逊收到CPSC查验通知后卖家需要怎么弄?ASTM F963标准测试 ,CPC认证

收到CPSC查验亚马逊卖家需要怎么做&#xff1f; 。CPSC消费品安全协会&#xff0c;成立于1972年&#xff0c;它的责任是保护广大消费者的利益&#xff0c;通过减少消费品存在的伤害及死亡的危险来维护人身及家庭安全。CPSC现在负责对超过15000种消费品的安全监控&#xff0c;具…

【动态规划】买卖股票的最佳时期含冷冻期

文章目录 一、买卖股票的最佳时期含冷冻期动态规划五部曲 一、买卖股票的最佳时期含冷冻期 题目: 买卖股票的最佳时期含冷冻期 动态规划五部曲 1.确定dp的含义 由题意可知&#xff0c;这里有三种状态 1.买入状态&#xff1a;dp[i][0]:表示第i天处于买入状态时的最大利润为dp[…

新一轮SocialFi浪潮来袭,Atem Network 再次打响注意力争夺战

火爆如潮的 Atem Network 再次从 CyberConnect 以及 Friend.tech 手中接过 SocialFi 赛道的热度大棒&#xff0c;同时这也表明&#xff0c;协议层仍将是 Web3 社交领域的主要叙事。 前不久&#xff0c;Web3社交协议Atem Network 在白皮书中披露了ATEM的代币经济模型&#xff0c…

Linux权限管理

目录 前言 1. Linux权限的概念 2. Linux权限管理 2.1 修改权限 拓展 2.2 修改拥有者 2.3 修改所属组 3. 文件类型 3.1 file指令 4. 权限掩码 umask指令 5.目录权限 6. 粘滞位 总结 前言 Linux作为一款开源操作系统&#xff0c;其权限管理机制是非常重要的一部分。熟练掌…

excel中vlookup用法

excel中vlookup用法 用法示例 参数说明 参数1&#xff1a;E1用于匹配的字段 参数2&#xff1a;E1:F4&#xff0c;匹配表格范围 参数3&#xff1a;要取的字段属于匹配表格范围的第几列 数据4&#xff1a;精确匹配

RequestContextHolder详解

最近遇到的问题是在service获取request和response,正常来说在service层是没有request的,然而直接从controlller传过来的话解决方法太粗暴,后来发现了SpringMVC提供的RequestContextHolder遂去分析一番,并借此对SpringMVC的结构深入了解一下,后面会再发文章详细分析源码 1.Reque…

守护 C 盘,Python 相关库设置

前言 pip 安装依赖和 conda 创建环境有多方便&#xff0c;那 C 盘就塞得就有多满。以前我不管使用什么工具&#xff0c;最多就设置个安装位置&#xff0c;其他都是默认。直到最近 C 盘飙红了&#xff0c;我去盘符里的 AppData 里一看&#xff0c;pip 的缓存和 conda 以前创建的…

物联网AI MicroPython学习之语法 GPIO输入输出模块

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; GPIO 介绍 模块功能: GPIO通用输入输出。 接口说明 GPIO - 构建GPIO对象 函数原型&#xff1a;Pin(port, dir , pull)参数说明&#xff1a; 参数类型必选参数&#xff1f;说明portintY对应开发板的引脚号…

Debezium-Embedded 实时监控MySQL数据变更

1.Debezium-Embedded 简介 Debezium连接器的操作通常是将它们部署到Kafka Connect服务&#xff0c;并配置一个或多个连接器来监控上游数据库&#xff0c;并为它们在上游数据库中看到的所有更改生成数据更改事件。这些数据更改事件被写入Kafka&#xff0c;在那里它们可以被许多不…

JavaEE进阶学习:Spring 的创建和使用

Spring 就是⼀个包含了众多工具方法的 IoC 容器。既然是容器那么它就具备两个最基本的功能&#xff1a; 将对象存储到容器&#xff08;Spring&#xff09;中从容器中将对象取出来 接下来使用 Maven 方式来创建一个 Spring 项目&#xff0c;创建 Spring 项目和 Servlet 类似&a…