文章目录

    • 18.1 MySQL 读写分离概述
      • 18.1.1 工作原理
      • 18.1.2 为什么要读写分离
      • 18.1.3 实现方式
    • 18.2 什么是 MyCat
    • 18.3 MyCat 安装与配置
      • 1. 下载与解压
      • 2. 创建用户并修改权限
      • 3. 目录说明
      • 4. Java 环境要求
    • 18.4 MyCat 启动与配置
      • 1. 配置环境变量
      • 2. 配置 hosts(多节点集群)
      • 3. 配置 Mycat
        • 3.1 配置 server
        • 3.2 schema 配置
          • 3.2.1 首先 备份
          • 3.2.2 更改配置
      • 4. 启动 MyCat
    • 在这里插入图片描述
    • 18.5 配置 MySQL 主从
      • 1. 安装 MySQL 5.7
      • 2. 配置主库(master)
      • 3. 配置从库(slave)
      • 4. 测试读写分离
  • 总结


18.1 MySQL 读写分离概述

18.1.1 工作原理

  • 主库负责写操作:INSERTUPDATEDELETE
  • 从库负责读操作:SELECT
  • 主从复制保证从库数据与主库同步
  • 数据内部交换过程:主库写入 → 二进制日志 → 从库同步

18.1.2 为什么要读写分离

  1. 单台服务器性能瓶颈,需分担负载
  2. 主从分工,缓解锁争用(X锁和S锁)
  3. 从库可使用 MyISAM,提高查询性能
  4. 增加冗余,提高可用性

18.1.3 实现方式

  1. 应用程序层实现
    • 优点:易部署,对访问压力中等的系统性能良好
    • 缺点:代码耦合、难以支持高级功能、大型系统不适用
  2. 中间件层实现
    • 优点:架构灵活、透明化分库分表、可做 failover 和监控
    • 常用中间件:
      • Cobar:阿里B2B的分布式系统,已停更
      • MyCat:Cobar二次开发,社区活跃
      • OneProxy:商业收费,高并发稳定
      • Vitess:YouTube使用,架构复杂
      • KingshardAtlasMaxScaleMySQL Router

18.2 什么是 MyCat

  • 开源企业级数据库中间件
  • 支持事务、ACID
  • 替代 MySQL 集群或 Oracle 集群
  • 融合内存缓存、NoSQL、大数据技术(HDFS)
  • 可视为企业级数据库中间件,实现分库分表、读写分离

18.3 MyCat 安装与配置

1. 下载与解压

#官方网站
http://www.mycat.org.cn/ 
#github
https://github.com/MyCATApache/Mycat-download下载地址
wget https://github.com/MyCATApache/Mycat-download/blob/master/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gztar -xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
cd /usr/local/mycat

2. 创建用户并修改权限

useradd mycat
passwd mycat
chown -R mycat.mycat /usr/local/mycat

3. 目录说明

  • bin/:可执行文件和 shell 脚本
  • conf/:配置文件
    • server.xml:服务器参数、用户授权
    • schema.xml:逻辑库和数据分片配置
    • rule.xml:分片规则
  • lib/:依赖 JAR 文件
  • logs/:日志文件(配置在 log4j.xml

4. Java 环境要求

  • JDK 1.7 及以上(可做可不做)
tar xf jdk-8u191-linux-x64.tar.gz -C /usr/java/
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_191
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
source /etc/profile.d/java.sh
java -version

18.4 MyCat 启动与配置

1. 配置环境变量

vim /etc/profile.d/mycat.sh
#!/bin/bash
export MYCAT_HOME=/usr/local/mycat
export PATH=$MYCAT_HOME/bin:$PATH
source /etc/profile.d/mycat.sh

2. 配置 hosts(多节点集群)

这里使用的是上一篇博文的主从mysql

192.168.10.14 slave1
192.168.10.15 slave2
192.168.10.16 master

3. 配置 Mycat

cp /usr/local/mycat/conf/server.xml /usr/local/mycat/conf/server.xml.bakvim   /usr/local/mycat/conf/server.xml
3.1 配置 server

后边标1的都是需要重点关注需要更改,ha为自己的逻辑库,可以自拟

<user name="mycat"> 1<property name="password">123456</property> 1<property name="schemas">ha</property> 1<!-- 表级 DML 权限设置 --><!--            <privileges check="false"><schema name="TESTDB" dml="0110" ><table name="tb01" dml="0000"></table><table name="tb02" dml="1111"></table></schema></privileges>           --></user><user name="user"><property name="password">user</property><property name="schemas">ha</property>      1<property name="readOnly">true</property></user>
3.2 schema 配置
3.2.1 首先 备份
cp /usr/local/mycat/conf/schema.xml  /usr/local/mycat/conf/schema.xml.bak
3.2.2 更改配置
#直接复制
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema    xmlns:mycat="http://org.opencloudb/">
<schema name="ha" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'>
</schema>
<dataNode name="dn1" dataHost="dthost" database="ha"/>
<dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType=" -1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="master" url="192.168.10.16:3306" user="mycat" password="123456">
</writeHost>
<writeHost host="slave1" url="192.168.10.14:3306" user="mycat" password="123456" />
</dataHost>
</mycat:schema>==============================================================================
使用这个即可,直接删除复制粘贴<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><!-- 定义逻辑库 schema --><schema name="ha" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema><!-- 数据节点 --><dataNode name="dn1" dataHost="dthost" database="ha"/><!-- 数据主机组 --><dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100"><!-- 心跳语句 --><heartbeat>select 1</heartbeat><!-- 主库 (写) --><writeHost host="master" url="192.168.10.16:3306" user="mycat" password="123456"><!-- 从库 (读) --><readHost host="slave1" url="192.168.10.14:3306" user="mycat" password="123456"/><readHost host="slave2" url="192.168.10.15:3306" user="mycat" password="123456"/></writeHost></dataHost>
</mycat:schema>

① 重要参数说明
上文中的两个ha不是一个东西,第一个ha是自己拟定的逻辑库名,后面那个才是mysql数据库集群中的真实数据库名。

  • balance:读负载均衡方式(0-3)

    负载均衡类型,目前的取值有 4 种:
    1.balance="0",    不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上;2.balance="1",全部的 readHost 与stand by writeHost 参与 select 语句的负载均衡,简单的说,当
    双主双从模式(M1->S1,M2->S2,并且 M1 与    M2 互为主备),正常情况下,M2、S1、S2 都参与 select 语句的负载均衡;3.balance="2",所有读操作都随机的在   writeHost、readhost   上分发;4.balance="3",所有读请求随机的分发到 wiriterHost 对应的readhost 执行,writerHost 不负担读压力。注意:writerHost 不负担读压writeType
    
  • switchType:写节点切换策略(-1表示不自动切换)

    switchType 指的是切换的模式,目前的取值也有 4 种:1.switchType='-1' 表示不自动切换;2.switchType='1' 默认值,表示自动切换;3.switchType='2' 基于MySQL 主从同步的状态决定是否切换,心跳语句为 show slave status;4.switchType='3'基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1),心跳语句为  show status like 'wsrep%'。
    
  • writeType:写节点策略(0表示主写,挂了切换到备)

    1、writeType=”0”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties . 2、writeType=”1”,所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。默认 0 就好了!
    

② 参数说明

  • Mycat schema 配置的 XML 根节点

    <mycat:schema xmlns:mycat="http://org.opencloudb/">
    
  • schema 节点

    <schema name="ha" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'>
    </schema># name="ha":定义 schema 名称为 ha,客户端通过 use ha 来访问。
    ## checkSQLschema="false":关闭 SQL schema 检查,加快解析。
    ### sqlMaxLimit="100":单条 SQL 返回最大 100 行。
    #### dataNode='dn1':指定使用的数据节点为 dn1。
    
  • dataNode 节点

    <dataNode name="dn1" dataHost="dthost" database="ha"/>#name="dn1":定义数据节点的名字,这个名字需要是唯一的。##dataHost="dthost":绑定到名为 dthost 的 dataHost。 (该属性用于定义该分片属于哪个数据库实例)###database="ha":访问的物理数据库名为 ha。 (该属性用于定义该分片属性哪个具体数据库实例上的具体库)
    
  • dataHost 节点

    <dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">maxCon / minCon:连接池最大/最小连接数。balance="1":负载均衡策略,1 表示轮询。writeType="0":写策略,只写到第一个可用节点。dbType="mysql":数据库类型 MySQL。dbDriver="native":使用原生驱动。switchType="-1":切换策略,-1 表示自动。slaveThreshold="100":从库延迟阈值(行数或毫秒,取决于版本)
    
  • 心跳检测

    <heartbeat>select user()</heartbeat>   #用来检测数据库连接是否活跃
    
  • writeHost 节点

    <writeHost host="slave1" url="192.168.10.14:3306" user="mycat" password="123456"/>
    <writeHost host="slave2" url="192.168.10.15:3306" user="mycat" password="123456"/>配置两个写节点(主库)。writeType="0" 表示只写第一个 writeHost(slave1)。第二个 writeHost 在此配置下不会被写入使用。
    

数据流向 schema → dataNode → dataHost → writeHost 的结构

4. 启动 MyCat

cd /usr/local/mycat/bin
./mycat start
cat /usr/local/mycat/logs/wrapper.log

在这里插入图片描述

18.5 配置 MySQL 主从

1. 安装 MySQL 5.7

mysql -umycat -p123456 -h127.0.0.1 -P8066

2. 配置主库(master)

# /etc/my.cnf
validate-password=OFF
server-id=1
log-bin=mysql-bin-master
binlog-do-db=ha
binlog-ignore-db=mysql
配完要重启数据库,但是重启会导致主从数据有问题
mysql> create database ha;
mysql> use ha;
mysql> create table test(id int, name varchar(20));
mysql> insert into test values(1,'man');
mysql> grant all privileges on *.* to 'mycat'@'%' identified by '123456';
mysql> flush privileges;================================================
简易版 可直接使用这个mysql> grant all privileges on *.* to 'mycat'@'%' identified by '123456';
mysql> flush privileges;
mysql> create database ha;
mysql> use ha;
mysql> create table test(id int, name varchar(20));

3. 配置从库(slave)

# /etc/my.cnf
server-id=2
validate-password=OFF
mysql> grant all on *.* to mycat@'%' identified by '123456';
mysql> stop slave;
mysql> change master to master_host='192.168.10.14', master_user='slave', master_password='123456';
mysql> start slave;
mysql> show slave status\G# /etc/my.cnf
server-id=3
validate-password=OFF
mysql> grant all on *.* to mycat@'%' identified by '123456';
mysql> stop slave;
mysql> change master to master_host='192.168.10.15', master_user='slave', master_password='123456';
mysql> start slave;
mysql> show slave status\G之前配了主从就不用配主从了!只需要grant加权限就行了!!!只需要
mysql> grant all privileges on *.* to 'mycat'@'%' identified by '123456';
mysql> flush privileges;

4. 测试读写分离

#先安装数据库
yum install -y mariadb-server mariadb
systemctl start mariadb.service
在客户端服务器上测试
mysql -u mycat -p123456 -h 192.168.10.80 -P8066		
//通过mycat服务器代理访问mysql ,在通过客户端连接mysql后写入的数据只有主服务会记录,然后同步给从--从服务器在主服务器上:
create database ha;
use ha;
create table test (id int(10),name varchar(10),address varchar(20));在两台从服务器上:
stop slave;											#关闭同步
use ha;
//在slave1上:
insert into test values('1','zhangsan','this_is_slave1');//在slave2上:
insert into test values('2','lisi','this_is_slave2');//在主服务器上:
insert into test values('3','wangwu','this_is_master');//在客户端服务器上:
use ha;(这里是逻辑库,然后逻辑库区调用的真实库ha)
select * from test;		//客户端会分别向slave1和slave2读取数据,显示的只有在两个从服务器上添加的数据,没有在主服务器上添加的数据
重复两遍查询可以看到slave1和slave2进行轮询查询,没有master出现,符合读写分离
insert into test values('4','qianqi','this_is_client');		//只有主服务器上有此数据//在两个从服务器上执行 start slave; 即可实现同步在主服务器上添加的数据
start slave;
select * from test;	然后再进行查询,发现是134,234进行轮询,实验成功
如果只能查到134或者234,检查四个虚拟机的防火墙和selinux

这里按理说应该使用第五台虚拟机当客户端进行测试,但是这里用的是mycat服务端兼客户端,所以ip直接写的80即本机ip,本质上就是客户端—》mycat-----》mysql集群,mycat之所以可以使用mysql命令是因为兼容协议,可以吧自己伪装成mysql,然后查询进入mycat,由mycat进行调度。

总结

mycat配置的核心就是server.xml和schema.xml,server中是配置的mycat这个服务的全局配置,也就是说客户端使用登陆的mycat用户名和密码(不是数据库中的用户名和密码!),schema中的是对逻辑库和物理库的映射等配置,在那里面是真实对应的数据库用户和密码。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Spring Boot 搭建和部署 Kafka 消息队列系统

使用 Spring Boot 搭建和部署 Kafka 消息队列系统 摘要 本文将引导您在 Kafka 上搭建一个消息队列系统&#xff0c;并整合到您的 Spring Boot 项目中。我们将逐步实现这一方案&#xff0c;探讨其中的关键原理&#xff0c;避开可能遇到的坑&#xff0c;并最终将其部署到 Kuberne…

daily notes[45]

文章目录basic knowledgereferencesbasic knowledge the variable in Rust is not changed. let x5; x6;Rust language promotes the concept that immutable variables are safer than variables in other programming language such as python and and are in favour of th…

技术奇点爆发周:2025 年 9 月科技突破全景扫描

技术奇点爆发周&#xff1a;2025 年 9 月科技突破全景扫描当中国 "祖冲之三号" 量子计算机在特定任务上超越经典超级计算机一千万亿倍的算力新闻&#xff0c;与 OpenAI 宣布 100 亿美元定制芯片量产协议的消息在同一周密集爆发时&#xff0c;我们真切感受到了技术革命…

分布式专题——10.3 ShardingSphere实现原理以及内核解析

1 ShardingSphere-JDBC 内核工作原理当往 ShardingSphere 提交一个逻辑SQL后&#xff0c;ShardingSphere 到底做了哪些事情呢&#xff1f;首先要从 ShardingSphere 官方提供的这张整体架构图说起&#xff1a;1.1 配置管控在 SQL 进入 ShardingSphere 内核处理&#xff08;如解析…

移动语义的里里外外:从 std::move 的幻象到性能的现实

我们都已经听过这样的建议&#xff1a;“使用 std::move 来避免昂贵的拷贝&#xff0c;提升性能。” 这没错&#xff0c;但如果你对它的理解仅止于此&#xff0c;那么你可能正在黑暗中挥舞着一把利剑&#xff0c;既可能披荆斩棘&#xff0c;也可能伤及自身。 移动语义是 C11 带…

selenium完整版一览

selenium 库驱动浏览器selenium库是一种用于Web应用程序测试的工具,它可以驱动浏览器执行特定操作,自动按照脚本代码做出单击、输入、打开、验证等操作,支持的浏览器包括IE、Firefox、Safari、Chrome、Opera等。而在办公领域中如果经常需要使用浏览器操作某些内容,就可以使用se…

[Linux]学习笔记系列 -- lib/kfifo.c 内核FIFO实现(Kernel FIFO Implementation) 高效的无锁字节流缓冲区

文章目录lib/kfifo.c 内核FIFO实现(Kernel FIFO Implementation) 高效的无锁字节流缓冲区历史与背景这项技术是为了解决什么特定问题而诞生的&#xff1f;它的发展经历了哪些重要的里程碑或版本迭代&#xff1f;目前该技术的社区活跃度和主流应用情况如何&#xff1f;核心原理与…

MFC_Install_Create

1. 安装MFC 编写MFC窗口应用程序需要用到Visual Studiohttps://visualstudio.microsoft.com/zh-hans/&#xff0c;然后安装&#xff0c;要选择使用C的桌面开发&#xff0c;再点击右边安装详细信息中的使用C的桌面开发&#xff0c;往下滑&#xff0c;有一个适用于最新的v143生成…

Langchain4j开发之AI Service

学习基于Langchain4j的大模型开发需要学习其中Ai Service的开发模式。里面对大模型做了一层封装&#xff0c;提供一些可以方便调用的api。其中有两种使用Ai Service的方式。一.编程式开发1.首先引入Langchain4的依赖。<dependency><groupId>dev.langchain4j</gr…

认识神经网络和深度学习

什么是神经网络&#xff1f;什么又是深度学习&#xff1f;二者有什么关系&#xff1f;……带着这些疑问&#xff0c;进入本文的学习。什么是神经网络神经网络&#xff08;Neural Network&#xff09;是一种模仿生物神经系统&#xff08;如大脑神经元连接方式&#xff09;设计的…

医疗行业安全合规数据管理平台:构建高效协作与集中化知识沉淀的一体化解决方案

在医疗行业中&#xff0c;数据不仅是日常运营的基础&#xff0c;更是患者安全、服务质量和合规管理的核心载体。随着医疗业务的复杂化和服务模式的多元化&#xff0c;各类机构——从大型医院到科研中心——都面临着海量文档、报告、影像资料和政策文件的管理需求。这些资料往往…

Day25_【深度学习(3)—PyTorch使用(5)—张量形状操作】

reshape() squeeze()unsqueeze()transpose()permute()view() reshape() contiguous() reshape() 一、reshape() 函数保证张量数据不变的前提下改变数据的维度&#xff0c;将其转换成指定的形状。def reshape_tensor():data torch.tensor([[1, 2, 3], [4, 5, 6]])print(data…

第十八篇 开发网页教学:实现画布、绘画、简易 PS 方案

在网页开发领域&#xff0c;画布功能是实现交互创作的重要基础&#xff0c;无论是简单的绘画工具&#xff0c;还是具备基础修图能力的简易 PS 方案&#xff0c;都能为用户带来丰富的视觉交互体验。本篇教学将围绕 “学习 - 实践 - 实操” 的核心思路&#xff0c;从技术原理讲解…

封装形成用助焊剂:电子制造“隐形桥梁”的技术突围与全球产业重构

在5G通信、人工智能、新能源汽车等新兴技术驱动下&#xff0c;全球电子制造业正以年均6.8%的增速重构产业链。作为电子元件焊接的核心辅料&#xff0c;封装形成用助焊剂&#xff08;又称电子封装用助焊剂&#xff09;凭借其“优化焊接质量、提升可靠性、降低制造成本”的核心价…

【完整源码+数据集+部署教程】零件实例分割系统源码和数据集:改进yolo11-GhostHGNetV2

背景意义 研究背景与意义 随着工业自动化和智能制造的迅速发展&#xff0c;零件的高效识别与分割在生产线上的重要性日益凸显。传统的图像处理方法在处理复杂场景时往往面临着准确性不足和实时性差的问题&#xff0c;而深度学习技术的引入为这一领域带来了新的机遇。特别是基于…

墨色规则与血色节点:C++红黑树设计与实现探秘

前言​ 前几天攻克了AVL树&#xff0c;我们已然是平衡二叉树的强者。但旅程还未结束&#xff0c;下一个等待我们的&#xff0c;是更强大、也更传奇的**终极BOSS**——红黑树。它不仅是map和set的强大心脏&#xff0c;更是C STL皇冠上的明珠。准备好了吗&#xff1f;让我们一…

大数据时代时序数据库选型指南:为何 Apache IoTDB 成优选(含实操步骤)

在数字经济加速渗透的今天&#xff0c;工业物联网&#xff08;IIoT&#xff09;、智慧能源、金融交易、城市运维等领域每天产生海量 “带时间戳” 的数据 —— 从工业设备的实时温度、电压&#xff0c;到电网的负荷波动&#xff0c;再到金融市场的每秒行情&#xff0c;这类 “时…

MAZANOKE+cpolar让照片存储无上限

文章目录前言1. 关于MAZANOKE2. Docker部署3. 简单使用MAZANOKE4. 安装cpolar内网穿透5. 配置公网地址6. 配置固定公网地址总结当工具开始理解用户的需求痛点时&#xff0c;MAZANOKE与cpolar这对搭档给出了“轻量化”的解决方案。它不追求浮夸的功能堆砌&#xff0c;却用扎实的…

正则表达式 - 元字符

正则表达式中的元字符是具有特殊含义的字符&#xff0c;它们不表示字面意义&#xff0c;而是用于控制匹配模式。基本元字符. (点号)匹配除换行符(\n)外的任意单个字符示例&#xff1a;a.b 匹配 "aab", "a1b", "a b" 等^ (脱字符)匹配字符串的开始…

suricata源码解读-事务日志

注册事务日志线程模块 void TmModuleTxLoggerRegister (void) {tmm_modules[TMM_TXLOGGER].name "__tx_logger__";tmm_modules[TMM_TXLOGGER].ThreadInit OutputTxLogThreadInit;tmm_modules[TMM_TXLOGGER].Func OutputTxLog;tmm_modules[TMM_TXLOGGER].ThreadExi…