Mycat分布式数据库架构解决方案--Mycat实现读写分离

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Mycat分布式数据库架构解决方案--Mycat实现读写分离
安装完成之后,我们对Mycat的重要配置文件进行了解析,到这里已经对Mycat有了一定的认识,那么我们开始来启动Mycat并连接,做一些简单的配置和使用操作。

Mycat快速入门

Mycat配置所可能使用的命令

  • 进入mycat安装的bin目录,启动命令:./startup_nowrap.sh
  • 进入mycat安装的bin目录,停止命令:./mycat stop
  • 查看是否存在运行mycat的进程: ps -ef
  • 查看mycat时时运行日志,进入logs目录:more mycat.log
  • 配置文件中删除一整行:vi打开配置文件,然后双击d键就会删除光标所在的一行
  • 配置文件中删除一整块:点击v,然后移动左右键,光标移动就会选中移动区域,再点击x即可删除

配置Mycat

使用Mycat实现读写分离其实比较简单,只要关注他的两个配置文件schema.xml/server.xml。

  • schema.xml主要负责数据库的连接配置
  • server.xml主要负责Mycat登录连接配置

schema

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="userDB" checkSQLschema="true" sqlMaxLimit="100">
        <table name="user" primaryKey="id" dataNode="dn1" />
    </schema>

    <dataNode name="dn1" dataHost="host1" database="test" />

    <!-- 读写分离 -->
    <dataHost name="host1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM" url="192.168.222.132:3306" user="root" password="123456">
            <readHost host="hostS1" url="192.168.222.133:3306" user="root" password="123456" />
            <readHost host="hostS2" url="192.168.222.134:3306" user="root" password="123456" />
        </writeHost>
    </dataHost>
</mycat:schema>

server

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
        - you may not use this file except in compliance with the License. - You
        may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
        - - Unless required by applicable law or agreed to in writing, software -
        distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
        WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
        License for the specific language governing permissions and - limitations
        under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <!-- Mycat中有两个重要的标签,分别是user、system -->
    <!-- system标签与系统配置有关 -->
    <system>
        <!-- 配置该属性的时候一定要保证mycat的字符集和mysql 的字符集是一致的。
        如果需要配置特殊字符集,如:utf8mb4,则可以在index_to_charset.properties中配置,配置格式
        为“ID=字符集”,例如:“224=utf8mb4”-->
        <property name="charset">utf8</property>
        <!-- 1为开启实时统计、0为关闭 -->
        <property name="useSqlStat">0</property>
        <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
        <property name="nonePasswordLogin">0</property>
        <property name="useHandshakeV10">1</property>
        <!-- 1为开启全加班一致性检测、0为关闭 -->
        <property name="useGlobleTableCheck">0</property>
        <!-- SQL 执行超时 单位:秒-->
        <property name="sqlExecuteTimeout">300</property>
        <!-- 指定使用 Mycat 全局序列的类型。 0 为本地文件方式,1 为数据库方式,2 为时间戳序列方式,3 为分布式ZK ID 生成器,4 为 zk 递增 id 生成。 -->
        <property name="sequnceHandlerType">5</property>
        <!-- 必须带有MYCATSEQ_或者 mycatseq_进入序列匹配流程 注意MYCATSEQ_有空格的情况 -->
        <property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
        <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
        <property name="subqueryRelationshipCheck">false</property>
        <property name="sequenceHanlderClass">io.mycat.route.sequence.handler.HttpIncrSequenceHandler</property>
        <!-- 默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
        <property name="processorBufferPoolType">0</property>
        <!-- 分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
        <property name="handleDistributedTransactions">0</property>
        <!-- off heap for merge/order/group/limit      1开启   0关闭 -->
        <property name="useOffHeapForMerge">0</property>
        <!-- 单位为m -->
        <property name="memoryPageSize">64k</property>
        <!-- 单位为k -->
        <property name="spillsFileBufferSize">1k</property>
        <property name="useStreamOutput">0</property>
        <!-- 单位为m -->
        <property name="systemReserveMemorySize">384m</property>
        <!--是否采用zookeeper协调切换  -->
        <property name="useZKSwitch">false</property>
        <!--如果为 true的话 严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接-->
        <property name="strictTxIsolation">false</property>
        <property name="useZKSwitch">true</property>
    </system>

        <!-- name="root" 定义登录用户名 -->
    <user name="root">
        <!-- 定义了登录密码 -->
        <property name="password">123456</property>
        <property name="schemas">userDB</property>
    </user>
</mycat:server>

配置完成之后,我们启动Mycat即可:

进入bin目录
./mycat start

验证是否已经成功实现读写分离

首先我们在主服务器上增加两条数据,由于我们实现mysql主从复制,这个时候增加的两条数据,其他两台从服务器都会同时增加。数据如下:

在这里插入图片描述

在主服务器上添加的数据由于MySQL主从复制,所以在每一台服务器上看到的都是一样的数据,但是在从服务器上添加的数据主服务器和另外一台服务器上不会有,我们就利用这个特性添加。

在从服务器192.168.222.134上添加一条数据,如下:

在这里插入图片描述

134服务器上就具备了其他服务器不具备的数据,由于我们在schema中配置了写功能服务器132、读133/134两台,所以Mycat读取数据的时候应该是随机读取133/134中的某一台,我们登陆Mycat然后打开user表,多刷新几次就可以看到id为5的那条数据时有时无

登陆Mycat报错,先检查Mycat是否已经成功启动,如果没有启动可以进入mycat文件下logs目录中,打开wrapper.log查看原因
在这里插入图片描述

注意:

  • 配置登录用户的时候,我们的server要对应上我们schemas中的逻辑库,不然会报错。
  • 访问不到Mycat的时候检查端口8066,查看是否开放了端口
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3天前
|
存储 SQL 微服务
常用的分布式事务解决方案(三)
常用的分布式事务解决方案(三)
|
3天前
|
关系型数据库 MySQL
常见分布式事务的解决方案(一)
常见分布式事务的解决方案(一)
|
3天前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
3天前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
26天前
|
存储 JSON 数据库
Elasticsearch 分布式架构解析
【9月更文第2天】Elasticsearch 是一个分布式的搜索和分析引擎,以其高可扩展性和实时性著称。它基于 Lucene 开发,但提供了更高级别的抽象,使得开发者能够轻松地构建复杂的搜索应用。本文将深入探讨 Elasticsearch 的分布式存储和检索机制,解释其背后的原理及其优势。
85 5
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践
【9月更文挑战第4天】赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践
赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践
|
3天前
|
消息中间件 中间件 关系型数据库
常用的分布式事务解决方案(四)
常用的分布式事务解决方案(四)
|
3天前
常用的分布式事务解决方案(二)
常用的分布式事务解决方案(二)
|
26天前
|
存储 监控 数据可视化
SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
【9月更文挑战第2天】SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
60 9
|
1月前
|
运维 安全 Cloud Native
核心系统转型问题之分布式数据库和数据访问中间件协作如何解决
核心系统转型问题之分布式数据库和数据访问中间件协作如何解决