mycat读写分离部署

2023-12-19

一、前言

mycat跟proxysql一样都是实现mysql主从架构的读写分离,提高mysql性能,也是具备主从读写的故障切换和读写分离功能,不过跟proxysql有区别的是,mycat用的是虚拟库映射后端真实数据库的用法

二、部署

部署mysql,需要mysql高可用架构才能实现mycat的主从读写故障切换功能,使用一主两从架构是不会使用到mycat的主从读写故障切换功能

参考: mysql mha高可用-CSDN博客

在部署mycat前需要部署jdk环境

参考: jdk1.8环境配置_jdk1.8的配置-CSDN博客

在github上下载mycat安装包

参考: Releases · MyCATApache/Mycat-Server · GitHub

我这边用的是 1.6.7.5版本

创建mycat存放目录

mkdir /opt/mycat && cd /opt/mycat

tar -zxvf Mycat-server-1.6.7.5-release-20200422133810-linux.tar.gz

配置环境

vi /etc/profile

#mycat
export MYCAT_HOME=/opt/mycat/mycat
export PATH=$MYCAT_HOME/bin:$PATH:$JAVA_HOME/bin

#java
export JAVA_HOME=/opt/java/jdk1.8.0_391
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin

使环境配置生效

source /etc/profile

编辑mycat配置文件

vi /opt/mycat/mycat/conf/server.xml

<user name="root" defaultAccount="true">   #mycat默认使用连接后端mysql的用户,必须要在mysql里有权限
                <property name="password">12345678</property>   #mysql用户密码
                <property name="schemas">xn_nacos</property>    #配置mycat虚拟库,我这里是一个真实库对应一个虚拟库
                <property name="schemas">xn_demeter_field</property>  #配置mycat虚拟库,我这里是一个真实库对应一个虚拟库
                <property name="schemas">xn_demeter_foundation</property>  #配置mycat虚拟库,我这里是一个真实库对应一个虚拟库
                <property name="schemas">xn_demeter_report</property> #配置mycat虚拟库,我这里是一个真实库对应一个虚拟库
                <property name="defaultSchema">xn_demeter_field</property> #mycat默认使用的虚拟库
                <!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->

                <!-- 表级 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">xn_nacos</property>
                <property name="schemas">xn_demeter_field</property>
                <property name="schemas">xn_demeter_foundation</property>
                <property name="schemas">xn_demeter_report</property>
                <property name="readOnly">true</property>
                <property name="defaultSchema">xn_demeter_field</property>
        </user>

vi /opt/mycat/mycat/conf/schema.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        #虚拟库的配置,对应后端的真实库,每个虚拟库对应一个后端真实库,其实也可以一个虚拟库对应后端所有真实库,但是性能有影响,datanode就是配置对应的后端真实库,schemaname也要和前面的server配置文件中的schemename对应
        <schema name="xn_nacos" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1" >
        </schema>
        <schema name="xn_demeter_report" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2" > </schema>
        <schema name="xn_demeter_field" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn3" > </schema>
        <schema name="xn_demeter_foundation" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn4" > </schema>
        #配置后端的真实库,datanodename就是提供给虚拟库调用的名称,datahost就是下面配置的后端mysql信息已经读写分离配置信息,database就是mysql真实库的名称
        <dataNode name="dn1" dataHost="localhost1" database="nacos" />
        <dataNode name="dn2" dataHost="localhost1" database="demeter_report" />
        <dataNode name="dn3" dataHost="localhost1" database="demeter_field" />
        <dataNode name="dn4" dataHost="localhost1" database="demeter_foundation" />
        #配置后端mysql的信息,通过writehost和readhost标签实现读写分离,readhost标签在writehost标签的里面
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                #心跳检测命令
                <heartbeat>show slave status</heartbeat>
                <writeHost host="hostM1" url="10.1.60.115:3306" user="root"
                                   password="12345678">
                        <readHost host="hostS1" url="10.1.60.114:3306" user="root" password="12345678"> </readHost>
                </writeHost>
        </dataHost>
</mycat:schema>

maxCon:每个读写实例连接池的最大连接数

minCon:每个读写实例连接池的最小连接数,初始化连接池的大小

balance:指定读写分离的负载均衡模式有四种模式

0:不开启读写分离,所有读操作都发送到当前可用的writehost上

1:全部的readHost与Stand by writeHost都参与select语句的负载均衡,即在两主两从的情况下,有一个主也参与到读的负载均衡中

2:所有的读操作都随机在writeHost,readHost上分发

3:所有的读请求都随机分配到writeHost对应的readHost上执行,writeHost不负担读压力

writeType:负载均衡模式有三种模式

0:所有写操作都发送到可用的writeHost上

1:所有写操作都随机的发送到readHost

2:所有写操作都随机的在writeHost、readhost分上发

dbType:指定后端连接的数据库类型,支持的类型有mysql、mongodb等

dbDriver:指定连接后端数据库使用的Driver,目前可选的值有native和JDBC。使用native的话,因为这个值执行的是二进制的mysql协议,所以可以使用mysql和maridb。其他类型的数据库则需要使用JDBC驱动来支持

switchType:主从故障切换模式

-1:主从发生故障时不自动切换

0:默认值,主从发生故障时自动切换

1:基于MySQL主从同步状态决定是否切换,必须将心跳检测语句改为 show slave status

2:基于mysql galary cluster的切换机制,必须将心跳语句改为show status like “%esrep%”;

需要在后端的mysql节点上创建mycat配置的对应的用户才可以使用

mysql -u root -p

grant all on *.* to 'root'@'%' identified by '12345678';

flush privileges;

后台启动mycat服务

cd /opt/mycat/mycat

./bin/mycat start

命令行启动mycat服务,所有信息都会输出到命令行中

cd /opt/mycat/mycat

./bin/mycat console

停止mycat服务

cd /opt/mycat/mycat

./bin/mycat stop

验证mycat是否实现读写分离

调用mycat服务进行数据库的读写操作

mysql -u root -p -h10.1.60.115 -P8066 -e 'select * from mysql.user';

在mysql上开启查询日志收集的功能

参考: mysql开启查询日志-CSDN博客

调用mycat服务执行查询后,再查看主从节点是否有查询日志即可验证

mycat默认数据库连接端口为8066,管理端口为9066

至此mycat搭建完成,如需高可用mycat,则可以再部署一个mycat使用keepalived搭建高可用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mycat读写分离部署 的相关文章

  • ORDER BY id 或 date_created 显示最新结果?

    我有一个表 实际上有几个 我想首先从中获取最新条目的结果 这是我的ORDER BY条款选项 date created INT 从不改变值 id 当然是INT AUTO INCRMENT 两列应同等地代表记录插入的顺序 我自然会使用date
  • SQLAlchemy+pymysql 错误:sqlalchemy.util.queue.Empty

    尝试使用 Eclispse 在 Ubuntu 上运行 Python 2 SQLAlchemy 0 8 和 MySQL5 2 但我不断收到以下错误 我使用 pymysql 实际上是 pymysql3 引擎 模块监视器 from sqlalch
  • 从 datagridview 选定的行更新 mysql 数据库

    我有一个 datagridview 它在表单加载事件上加载 mysql 数据库表 t pi clients 并且我有另一个选项卡 其中包含 t pi client 相应列的文本框 它能够从 fullrowselect 模式获取数据到这些文本
  • 使用 RMySQL 会干扰 RPostgreSQL

    我有一个 R 脚本 我想从 MySQL 数据库中提取一些数据 然后从 PostgreSQL 数据库中提取一些数据 但是 从 RMySQL 加载 MySQL 驱动程序会阻止我从以下位置加载 PostgreSQL 驱动程序 PostgreSQL
  • php echo 不工作

    我的代码似乎不起作用 单选按钮出现 但旁边什么也没有 似乎 mysql fetch array 由于某种原因无法工作 因为我已经玩过代码并反复测试它以查找代码似乎遇到的位置出现问题并停止工作 有人可以告诉我出了什么问题吗 欢呼声我是新手 最
  • 尝试通过比较不同的表从 SQL 查询输出正确的值

    我对 SQL 非常陌生 需要有关如何使用正确的查询完成此任务的帮助 我有 2 张桌子需要使用 表 TB1 有 id Name 1 bob 2 blow 3 joe 表 TB2 有 compid property 1 bob 2 blow 我
  • 列是存在的,但是当我尝试删除它时,它说 MYSQL 中没有列? **错误代码:1091。无法删除...**

    我尝试运行以下查询 ALTER TABLE ORDER DETAIL DROP foreign key USER ID It says Error Code 1091 Can t DROP USER ID check that column
  • 表已满(使用 MEMORY 引擎)

    我想将生产数据库传输到我的开发机器上进行测试 它有 6 张桌子MEMORY出于性能目的的引擎 I did mysqldump routines hxxx uxxx pxxx prod database gt prod dump sql 当我
  • 更新\插入数据从grafana到mysql

    可以从grafana更新数据或插入数据到mysql 我需要使用 UI 在 mysql 中插入 更新信息 现在我已经在使用grafana 所以想知道是否有任何方法可以使用grafana来更新或插入信息 没有用于获取用户输入并将该数据插入 My
  • PHP实现的机票预订系统

    如何防止预订系统中的座位被重复预订 我正在用 PHP 和 MYSQL 制作一个航空旅行预订系统模型作为一个项目 我有一个小问题 仅在付款后 门票和座位详细信息才会永久存储在此处 座位号在付款前分配 假设人 1 预订了飞机上的座位 x 并支付
  • grails/mysql 时区更改

    完成更改应用程序时区的最佳方法是什么 在我看来 必须发生以下情况 服务器 TZ 已被系统管理员更改 mysql必须重新启动 数据库中每个基于时间的列都必须使用convert tz 或等效方法更新所有值 因此 要么必须编写一个 mysql 脚
  • 为什么将 MySQL 凭据放在 www 目录之外? [复制]

    这个问题在这里已经有答案了 可能的重复 将核心类放在 Web 根目录之上 好还是坏主意 https stackoverflow com questions 3648739 putting core classes above the web
  • 数据库中的持久日期不等于检索日期

    我有一个具有 Date 属性的简单实体类 此属性对应于 MySQL 日期时间列 Entity public class Entity Column name start date Temporal TemporalType TIMESTAM
  • 使用 DBCP 配置 Tomcat

    在闲置一段时间 几个小时 后 我们收到了 CommunicationsException 来自 DBCP 错误消息 在异常中 位于这个问题的末尾 但我没有看到任何配置文件中定义的 wait timeout 我们应该看哪里 在 tomcat
  • 为什么我的浮点数大于 1 时在 MYSQL 中存储为 .9999?

    我将进程时间作为 float 4 4 存储在 MySQL 数据库中 start time microtime TRUE things happen in my script end time microtime TRUE process t
  • 如何检查 $row['column_name'] 是否返回空 php mysql

    我有一个带有列的表格 id name phone describe 当我从这个表中获取值时 我正在使用 row mysql fetch array query 现在我想检查是否 row describe 返回空值 如何查看php 您可以使用
  • MySQL 跨表计数(*) 查询帮助

    SELECT name COUNT AS count FROM t1 t2 WHERE t2 id t1 id GROUP BY t2 id 我想从 t1 获取名称以及 t2 中 id 与 t1 相同的行数 到目前为止我已经得到了上面的内容
  • 使用数据库进行日志记录

    大多数日志似乎都是纯文本形式 而不是放入 MySQL 其他类型的数据库中 这是否有原因 在我看来 将它们放入数据库将使分析变得非常非常容易 但这会以牺牲速度还是其他什么为代价 我不太关心可移植性 显然你会有数据库连接的文本日志 我能想到两大
  • php无法在docker-compose中连接到mysql

    这是我的 docker compose version 2 services nginx image nginx 1 11 8 alpine ports 8081 80 volumes code usr share nginx html h
  • 对于相同的查询,MySQL Workbench 比 Python 快得多

    MySQL Workbench 中的以下查询需要 0 156 秒才能完成 SELECT date time minute price id FROM minute prices WHERE contract id 673 AND TIMES

随机推荐

  • 基于SpringBoot+Vue的在线互动学习网站设计实现(源码+lw+部署文档+讲解等)

    文章目录 前言 详细视频演示 具体实现截图 技术栈 后端框架SpringBoot 前端框架Vue 持久层框架MyBaitsPlus 系统测试 系统测试目的
  • 基于SpringBoot+Vue的社区养老服务系统演示设计实现(源码+lw+部署文档+讲解等)

    文章目录 前言 详细视频演示 具体实现截图 技术栈 后端框架SpringBoot 前端框架Vue 持久层框架MyBaitsPlus 系统测试 系统测试目的
  • 基于SpringBoot+Vue的小区团购管理设计实现(源码+lw+部署文档+讲解等)

    文章目录 前言 详细视频演示 具体实现截图 技术栈 后端框架SpringBoot 前端框架Vue 持久层框架MyBaitsPlus 系统测试 系统测试目的
  • JavaWeb——第五章 Servlet

    第五章 Servlet 一 Servlet简介 1 1 动态资源和静态资源 1 2 Servlet简介 二 Servlet开发流程 2 1 目标 2 2 开发过程 三 Servlet注解方式配置
  • 使用Axure的中继器的交互&动作解决增删改查h

    艳艳耶 个人主页 个人专栏 越努力 越幸运 目录 一 中继器的交互 1 什么是中继器的交互 2 Axure中继器的交互 3 如何使用中继器 二 中继器的动作 1 什么是Axure中继器的动作 三 中继器的repeater属性 1 什么是Ax
  • 采购审批工作流程快速指南

    对很多人来说 控制每一分钱的支出是一件棘手的事情 但在当下充满不确定性的环境里 这一点与收入增长同等重要 正如俗话说 要想赚钱 先学会花钱 本文将分析支出控制的基石之一 采购审批工作流程 有了审批工作流程 企业就可以跟踪每一笔支出 并开始削
  • 基于Apache SeaTunnel构建CDC数据同步管道

    引言 在快速发展的数据驱动时代 数据的实时 准确同步成为了企业信息系统不可或缺的一部分 随着技术的进步 特别是在分布式计算和大数据技术的背景下 构建一个高效且可靠的数据同步管道成为了挑战 Apache SeaTunnel作为一个先进的数据集
  • k8s集群1.23.0版本部署说明

    1 部署 k8s1 23 0版本与1 26 0版本的部署基本差不多 只不过k8s 1 23版本不需要部署cri docker 所以只需要在1 26 0版本部署的基础上不要cri docker的部署即可 参考 kubeadm部署k8s 1 2
  • ETC纹理压缩

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • Mimikatz ERROR kuhl_m_sekurlsa_acquireLSA ; Key import

    原文链接 ERROR kuhl m sekurlsa acquireLSA Key import CSDN博客 报错原因 1 确定不是权限的问题 已是最高权限 2 确定不是UAC绕过的问题 已是HIGH GROUPS 3 环境为Win10系
  • 基于Spring Boot、Mybatis、Redis和Layui的企业电子招投标系统源码实现与立项流程

    招投标管理系统是一款适用于招标代理 政府采购 企业采购和工程交易等领域的企业级应用平台 该平台以项目为主线 从项目立项到项目归档 实现了全流程的高效沟通和协作 通过该平台 用户可以实时共享项目数据信息 实现规范化管理和有效监控 协同工作网络
  • 防止被坑!明理信息科技知识服务平台教你如何明智选择知识付费平台

    明理信息科技知识服务平台 随着知识经济的兴起 知识付费已经成为一种趋势 越来越多的人开始将自己的知识和技能进行变现 而知识付费小程序平台则成为了一个重要的渠道 然而 市面上的知识付费小程序平台琳琅满目 其中不乏一些不良平台 让老实人望而却步
  • 第二十一章网络通信总结博客

    网络程序设计基础 局域网与互联网 为了实现两台 计算机 的通信 必须用一个网络线路连接两台计算机 如下图所示 网络协议 1 IP协议 IP是Internet Protocol的简称 是一种网络协议 Internet 网络采用的协议是TCP
  • Vue3+Echarts:堆积柱状图的绘制

    一 需求 在Vue3项目中 想用Echarts来绘制堆积柱状图 去展示最近一周APP在不同渠道的登录人数 效果如下 二 实现 关于Echarts的下载安装以及图表的样式设计 此处不展开 1 Templates部分
  • 大语言模型(LLM)与 Jupyter 连接起来了!

    现在 大语言模型 LLM 与 Jupyter 连接起来了 这主要归功于一个名叫 Jupyter AI 的项目 它是官方支持的 Project Jupyter 子项目 目前该项目已经完全开源 其连接的模型主要来自 AI21 Anthropic
  • TimeGPT:时序预测领域终于迎来了第一个大模型

    时间序列预测领域在最近的几年有着快速的发展 比如N BEATS N HiTS PatchTST和TimesNet 大型语言模型 llm 最近在ChatGPT等应用程序中变得非常流行 因为它们可以适应各种各样的任务 而无需进一步的训练 这就引
  • SCADA助力食品加工数字化变革:未来产业的智慧引擎

    一 背景介绍 当前 在国际市场竞争加剧 消费者个性化需求突出的背景下 我国食品加工行业面临着诸多挑战 越发严苛的食品安全标准 追求供应链的透明度和效率 进一步提高产品质量和降低成本 等等 为了应对上述挑战 我国食品加工企业迫切需要利用先进的
  • 3d抄数逆向建模服务造纸机械叶轮三维扫描曲面建模-CASAIM

    在造纸机械中 叶轮是重要的组成部分 造纸机械叶轮在使用过程中会承受较大外力的摩擦 长期使用容易导致外观变形破损 从而降低叶轮的工作效率和精度 因此 定期生产制作同类型的造纸机械叶轮产品 以用于替换年久失修的旧产品 已成为越来越多造纸类企业的
  • 【网络安全】-Linux操作系统—操作系统发展历史与Linux

    操作系统发展历史 操作系统 Operating System 简称OS 是管理计算机硬件与软件资源的系统软件 它是计算机系统的核心与基石 操作系统的发展历史可以追溯到20世纪50年代 初期的操作系统 在计算机技术的早期 操作系统并不存在 那
  • mycat读写分离部署

    一 前言 mycat跟proxysql一样都是实现mysql主从架构的读写分离 提高mysql性能 也是具备主从读写的故障切换和读写分离功能 不过跟proxysql有区别的是 mycat用的是虚拟库映射后端真实数据库的用法 二 部署 部署m