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

news2024/10/6 14:25:36

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搭建,读写分离,分库分表等,敬请期待。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第六届浙江省大学生网络与信息安全竞赛 2023年 初赛/决赛 WEB方向 Writeup

-------------------【初赛】------------------- easy php 简单反序列化 __debuginfo()魔术方法打印所需调试信息&#xff0c;反序列化时候执行&#xff01; 链子如下&#xff1a; BBB::__debuginfo()->CCC::__toString()->AAA::__call()EXP&#xff1a; <?php…

汽配零件发FBA美国专线

随着电商的迅速发展&#xff0c;跨境电商平台如亚马逊的FBA(Fulfillment by Amazon)服务成为了许多商家选择的销售渠道。对于汽配零件行业来说&#xff0c;发FBA美国专线可以打开更广阔的市场&#xff0c;并且有望获得可观的发展前景。下面将从市场分析和前景两个方面来探讨汽配…

多目标跟踪指标

Avg rank This is the rank of each tracker averaged over all present evaluaion measures 这是每个跟踪器在所有现有评估指标上的平均排名。 MOTA Multiple Object Tracking Accuracy This measure combines three error sources &#xff1a;false positives&#xf…

报错缺少class(org.apache.hadoop.hdfs.DistributedFileSystem)

平台报错缺少 java.lang.RuntimeException:java.lang.ClassNotFoundException: Class org.apache.hadoop.hdfs.DistributedFileSystem not found 实则是缺少jar包 hadoop-hdfs-client-3.1.1.3.1.0.0-78.jar 找到对应的jar放到程序的lib中即可

2023 年是无代码的一年,还要程序员吗?

从 Code 到 No Code&#xff0c;IT 界对简化代码开发的需求由来已久&#xff1a;过去数十年的发展历程中&#xff0c;在企业应用程序开发上&#xff0c;我们研发出工作流、智能业务流程管理系统、低代码/无代码、还有高生产力应用程序平台等应用开发形式。 有一句话在 IT 界流…

海康设备、LiveNVR等通过GB35114国密协议对接到LiveGBS GB28181/GB35114平台的详细操作说明

一、LiveNVR通过GB35114接入LiveGBS 1.1 开启LiveGBS 35114功能 信令服务livecms.ini配置文件中[sip]增加一行gm1 启动LiveCMS 1.2 生成设备端证书 我们用LiveNVR做为设备端向LiveGBS注册&#xff0c;这里先生成LiveNVR的设备证书&#xff0c;并将LiveNVR的设备证书给LiveGB…

人工智能基础_机器学习036_多项式回归升维实战3_使用线性回归模型_对天猫双十一销量数据进行预测_拟合---人工智能工作笔记0076

首先我们拿到双十一从2009年到2018年的数据 可以看到上面是代码,我们自己去写一下 首先导包,和准备数据 from sklearn.linear_model import SGDRegressor import numpy as np import matplotlib.pyplot as plt X=np.arange(2009.2020)#左闭右开,2009到2019 获取从2009到202…

中国人民大学与加拿大女王大学金融硕士——人生下半场,用实力为自己“撑腰”

人生如同一场漫长的旅程&#xff0c;每个人都在不断地前行&#xff0c;经历着种种的人生阶段。当我们迈入人生的下半场&#xff0c;我们不再是无知少年&#xff0c;而是逐渐成为社会的中坚力量。在这个阶段&#xff0c;我们不仅要面对更多的挑战和压力&#xff0c;还需要用实力…

等保到底在“保”什么?

在信息时代&#xff0c;等保评级成为衡量企业信息安全水平的重要标准。那么&#xff0c;什么是等保评级呢&#xff1f;等保合规到底保的是什么呢&#xff1f;一起来看看吧。 编辑搜图 请点击输入图片描述&#xff08;最多18字&#xff09; 等保评级&#xff0c;会从七个维度进…

总结 MyBatis 的XML实现方法(使用XML使用实现数据的增删改查操作)

MyBatis是一个优秀的持久层框架&#xff0c;它的XML配置文件是实现数据库操作的关键之一。通过XML文件&#xff0c;可以定义SQL语句、映射关系和一些高级功能。下面将探讨下如何使用MyBatis的XML配置文件实现数据的增、删、改、查操作。 1.配置文件 首先要确保 mybatis-confi…

基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制(11.15)

1.任务所需实现基本功能 关机状态时白灯亮蓝灯灭&#xff0c;此时长按按键无反应&#xff0c;白灯亮度降低的状态&#xff0c;蓝灯保持灭的状态。点按按键一次&#xff0c;白灯熄灭&#xff0c;蓝灯亮此时W引脚控制的灯亮。继续点按按键。蓝灯亮&#xff0c;此时W引脚控制的灯…

OSPF常用配置例子

拓朴图如下&#xff1a; 配置步骤&#xff1a; 1.配置IP 2.ospf多区域配置 *Tips&#xff1a;undo info-center enable 关闭信息回显 3.出口设备注入默认路由&#xff08;完成标志是各路由器学习到默认路由&#xff0c;下发默认路由&#xff09; R1]default-route-adve…

HTTP代理与SOCKS5代理,有什么区别?

在数字通信领域&#xff0c;数据安全和匿名性都是非常重要的指标。互联网的不断发展催生了几种协议&#xff0c;每种协议都有独特的优势和挑战。其中&#xff0c;SOCKS5 代理、HTTP代理最为广泛使用&#xff0c;下面给大家一起讨论&#xff0c;HTTP代理与SOCKS5代理&#xff0c…

《洛谷深入浅出进阶篇》 P1496火烧赤壁——初识离散化

上链接&#xff1a; P1496 火烧赤壁 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1496上题干&#xff1a; 有一组序列&#xff0c;[-2^31,2^31] &#xff0c; 现在给你n次操作&#xff0c;每一次操作给出两个整数l&#xff0c;r&#xff…

设计测试用例的6种基本原则

设计测试用例的基本原则&#xff0c;对于软件测试非常重要&#xff0c;这些原则有助于设计出高质量、全面、有效的测试用例&#xff0c;从而提高软件测试的效率和准确性&#xff0c;维护软件的质量和稳定。如果在设计用例时没有遵循基本原则&#xff0c;这会影响用例的全面性、…

openGauss学习笔记-124 openGauss 数据库管理-设置账本数据库-查看账本历史操作记录

文章目录 openGauss学习笔记-124 openGauss 数据库管理-设置账本数据库-查看账本历史操作记录124.1 前提条件124.2 背景信息124.3 操作步骤 openGauss学习笔记-124 openGauss 数据库管理-设置账本数据库-查看账本历史操作记录 124.1 前提条件 系统中需要有审计管理员或者具有…

DevEco studio配置自己的虚拟环境

开始使用DevEco studio时使用的时华为预置的手机&#xff0c;通过网络访问&#xff0c;但是近期发现有两点问题 网络不稳定的时候机器很卡现在资源很难使用 DevEco提供了自定义环境的搭建&#xff0c;从而解决上面的问题 这里有几点问题需要硬盘至少10G空闲&#xff08;应该问题…

06 robotFrameWork+selenium2Library KiLL清理进程

1、新建bat文件&#xff1a;kill.bat 2、文件中添加&#xff1a; taskkill /F /IM IEDriverServer.exe taskkill /F /IM iexplore.exe taskkill /F /IM chrome.exe taskkill /F /IM chromedriver.exe 3、新建的关键字中&#xff0c;调用kill.bat OperatingSystem.Run ${CU…

调研了一下java常用的几个图片处理工具对Tiff文件的支持

ImageMagick 官网 https://imagemagick.org/&#xff0c; 支持多种格式。命令行工具很适合调试。功能很强大. 还有一款工具GraphicsMagick 是从ImageMagick的基础上研发出来的。 OpenCV 官网 https://opencv.org/ &#xff0c; github地址https://github.com/opencv/opencv&…

iOS WKWebView H5微信、支付宝支付跳转

iOS客户端实现嵌入H5进行支付跳转到客户端&#xff0c;支付完成后再跳转回自己的App时,解决WKWebView无法跳转回APP的BUG. 一、支付宝 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void…