Mycat 读写分离实战

article/2025/9/9 7:55:47

Mycat读写分离实战

一、主从复制搭建

1.实验环境

  • 搭建一主一从的部署架构,master(主库)运行在阿里云服务器 47.108.136.201,slave(从库)运行在 IP 地址为 12.168.149.128 的Ubuntu虚拟机中
  • 两台机器均安装了 MySQL 5.7(MySQL 5.7 版本复制性能比较强,且不同版本的数据库搭建主从复制,需要一些额外的复杂配置)
  • 两台机器能够Ping通

2.主库配置

(1)修改数据库配置参数

#vi /etc/mysql/my.cnf 或 vim /etc/mysql/mysql.conf.d/mysqld.cnf[mysqld]log-bin=mysql-bin   #[必须]启用二进制日志server-id=100       #[必须]服务器唯一ID,默认是1,一般取IP最后一段binlog_format=row

重启 MySQL 服务,查看服务号,已经更改为 100

root@Ubuntu2004:~# systemctl restart mysql
root@Ubuntu2004:~# mysql -u root -p
mysql> show global variables like 'server\_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 100   |
+---------------+-------+
1 row in set (0.00 sec)

(2)进入主库,建立复制账号并授权

不同 MySQL 版本,需要执行不同的授权操作

mysql> grant replication client on *.* to 'xiaogesync'@'%' identified by 'Chen_2877';
mysql> flush privileges;

MySQL 8 执行以下操作

mysql> create user xiaogesync identified by 'Chen_2877';
mysql> grant replication client on *.* to 'xiaogesync'@'%';
mysql> flush privileges;

重启

root@Ubuntu2004:~# systemctl restart mysql

在虚拟机终端执行 MySQL 远程连接,输入授权账户和密码,即可远程访问主库了

root@ubuntu:/home/chen# mysql -h 47.108.136.201 -uxiaogesync -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.7.36-log MySQL Community Server (GPL)

2.从库配置

(1)修改数据库配置参数

跟主库同样的操作,但 server-id 必须唯一,用于标识语句最初是由哪个 server 写入,server-id 设为相同的话,同步可能会陷入死循环

#vi /etc/mysql/my.cnf 或 vim /etc/mysql/mysql.conf.d/mysqld.cnf[mysqld]log-bin=mysql-bin   #[必须]启用二进制日志server-id=101       #[必须]服务器唯一ID,默认是1,一般取IP最后一段binlog_format=row

(2)在服务器终端查看主库master状态

需要注意 File: mysql-bin.000005 和 Position: 1224 这两个值,待会配置从服务器会用得到。这个时候不要去动主数据库,会影响 Position 的值

mysql> show master status\G;
*************************** 1. row ***************************File: mysql-bin.000005Position: 1224Binlog_Do_DB: Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

(3)启动服务器复制功能

mysql> start slave;

(4)从库查看主从复制状态

根据 File 和 Position 的值,在从库上执行 MySQL 配置主从命令。Slave_IO_Running和
Slave_SQL_Running 状态均为 YES,说明主从复制成功。

mysql> show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 47.108.136.201Master_User: xiaogesyncMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000005Read_Master_Log_Pos: 1224Relay_Log_File: ubuntu-relay-bin.000004Relay_Log_Pos: 320Relay_Master_Log_File: mysql-bin.000004Slave_IO_Running: YesSlave_SQL_Running: Yes

(5)测试主从复制功能

主库上创建数据库,如果从库也查询得到,说明同步成功,主库:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
mysql> create database test_sync;

从库:能够查询 test_sync 数据库(从库中原本数据库不受影响)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| ssmiot             |
| sys                |
| test_sync          |
| wsn                |
+--------------------+

至此, MySQL 主从复制搭建完成,采用的是默认的异步复制过程,也就是说master上的 I/O Thread 线程将二进制日志写入 binlog 文件之后就返回客户端结果,不会考虑二进制日志是否完整传输到 slave 以及是否完整存放到从 slave 的relay-log 日志中。相应的,还有全同步复制半同步复制

如果要禁用主从复制的话,只需要在从库上执行 stop slave 命令就可以,执行reset slave all 可以清空从库所有配置信息。

二、Mycat 读写分离

Mycat 读写分离是建立在主从复制配置好的MySQL集群基础上(当然,也支持 Oracle、PostgreSQL,从 1.3 版本开始支持 SequoiaDB 及 MongoDB等NoSQL)。

(一)Mycat 安装部署

我是在自己 Win11 笔记本上安装的 Mycat,用的 1.6.7.4 版本。因为 Mycat 是用 Java 开发的,所以事先需要安装 Java,官网建议 jdk 1.7 及以上版本。然后还需要关闭主库 Linux 防火墙。

1.下载

Mycat下载地址:http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-win.tar.gz

2.解压

在这里插入图片描述

3.配置环境变量

在这里插入图片描述
在这里插入图片描述

(二)Mycat 配置和启动

Mycat 采用本地 xml 的方式实现配置,最重要的配置文件有 server.xml、schema.xml 和 rue.xml,配置文件均保存在安装目录的 /conf 文件夹下

1.server.xml 配置

server.xml 管理着 Mycat 的系统配置信息,如用户、密码及权限等,这里配置登录 Mycat 的用户名为 root,密码为 123456,可以访问的 schema(逻辑库) 只有 TESTDB

	<user name="root" defaultAccount="true"><property name="password">123456</property><property name="schemas">TESTDB</property><property name="defaultSchema">TESTDB</property></user>

2.schema.xml 配置

schema.xml 管理着 Mycat 的逻辑库、表、分片规则、dataNode 等。

(1)分片配置

dataNode 标签定义了 Mycat 中的数据节点,也就是数据分片,< dataNode name=“dn1” dataHost=“localhost1” database=“db1” /> 意思就是说使用名字为 localhost1 数据库实例上的 db1 物理数据库,组成一个数据分片,用 dn1 来标识这一分片

<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1"><!-- auto sharding by id (long) --><!--splitTableNames 启用<table name 属性使用逗号分割配置多个表,即多个表使用这个配置--><table name="travelrecord,address" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/><!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"/> --></schema><!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"/> --><dataNode name="dn1" dataHost="localhost1" database="db1" /><dataNode name="dn2" dataHost="localhost1" database="db2" /><dataNode name="dn3" dataHost="localhost1" database="db3" />

(2)连接配置

dataHost 是 Mycat 最底层的标签,直接定义分片所属的数据库实例,其中子标签 writeHost 指定了 MySQL 后端写数据库(主库)。接下来需要对上一步的 localhost1 进行连接配置,首先将 url 设为主库所在地址,在这里就是阿里云服务器的 ip。账号密码及相应权限需要主库为其授权,为避免麻烦,我为主机和从机的 root 账户均分配了所有远程访问权限

mysql> grant replication client on *.* to 'root'@'%' identified by 'Chen_2877';
mysql> flush privileges;
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><!-- can have multi write hosts --><writeHost host="hostM1" url="47.108.136.201:3306" user="root" password="Chen_2877"><readHost host="hostS1" url="192.168.149.128:3306" user="root" password="Chen_2877"></readHost></writeHost></dataHost>

3.启动

(1)创建实体数据库

在主库中分别创建 db1、db2和db3 三个数据库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| db2                |
| db3                |
| mysql              |
| performance_schema |
| sys                |
| test_cgx           |
| test_sync          |
+--------------------+
9 rows in set (0.00 sec)

(2)安装 Mycat

以管理员身份启动 cmd,运行 mycat install

C:\WINDOWS\system32>mycat install
wrapper  | CreateService failed - 指定的服务已存在。 (0x431)

(3)启动 Mycat

继续执行 mycat start

C:\WINDOWS\system32>mycat start
wrapper  | Starting the Mycat-server service...
wrapper  | Mycat-server started.

运行命令 mycat status,查看 mycat状态,Running 状态为 YES,则启动成功

C:\WINDOWS\system32>mycat status
wrapper  | The Mycat-server Service is installed.
wrapper  |   Start Type: Automatic
wrapper  |   Interactive: No
wrapper  |   Running: Yes

4.测试

(1)在主库创建相应数据表

在主库 db1、db2、db3、创建表 travelrecord

CREATE TABLE `travelrecord` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`uid`  int(11) NULL ,
PRIMARY KEY (`id`)
);

(2)连接 mycat,插入数据

在 cmd 中连接 mycat,其实跟使用 MySQL 一样的操作

C:\WINDOWS\system32>mysql -uroot -P8066 -p --default_auth=mysql_native_password
Enter password: ********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 5.6.29-mycat-1.6.7.4-release-20200105164103 MyCat Server (OpenCloudDB)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>

查看当前数据库实例

mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
1 row in set (0.00 sec)mysql> use TESTDB;
Database changed
mysql> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| address          |
| travelrecord     |
+------------------+
mysql> desc travelrecord;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
| uid   | int(11) | YES  |     | NULL    |                |
+-------+---------+------+-----+---------+----------------+
2 rows in set (0.03 sec)

插入数据

mysql> INSERT INTO `travelrecord` (`id`, `uid`) VALUES(1, 1);
Query OK, 1 row affected (0.03 sec)mysql> INSERT INTO `travelrecord` (`id`, `uid`) VALUES(501, 501);
Query OK, 1 row affected (0.03 sec)mysql> INSERT INTO `travelrecord` (`id`, `uid`) VALUES(5000001, 5000001);
Query OK, 1 row affected (0.03 sec)mysql> INSERT INTO `travelrecord` (`id`, `uid`) VALUES(10000001, 100000001);
Query OK, 1 row affected (0.03 sec)

(3)读取数据

在从库中,分别查询数据库 db1、db2、db3 中的数据表 travelrecord,可以看到刚插入的数据存储在了不同的数据库里面,说明Mycat 自动对其实现了分片,并实现了主从同步,而这一切对前端应用都是透明的
在这里插入图片描述
当然也可以通过数据库管理工具进行相关操作,默认端口 8066。使用方式与 MySQL 一样

在这里插入图片描述
在这里插入图片描述


参考

分布式数据库中间件 MyCat 搞起来!
Windows下安装Mycat
面试官你好,我已经掌握了MySQL主从配置和读写分离,你看我还有机会吗?
MySQL 主从复制简单搭建配置(简单,绝对能用)
《MySQL性能优化和高可用架构实战》——宋立桓


http://chatgpt.dhexx.cn/article/ytmWNTPX.shtml

相关文章

mycat-读写分离

简介&#xff1a; 主从复制的工作机制&#xff1a; ① Master将改变记录到二进制日志&#xff08;binary log&#xff09;中&#xff0c;这些记录叫做二进制日志事件&#xff08;binary log events&#xff09;&#xff1b; ② Slave将master的binary log events拷贝到它的中继…

使用mycat进行读写分离

目录 一、读写分离 1.1、什么是读写分离 1.2、为什么要用读写分离 1.3、使用mycat读写分离 1.3.1安装mycat 1.3.2、配置mycat 简单的理解&#xff0c;mycat就是一个数据中间件&#xff0c;可以让开发人员直接访问mycat&#xff0c;然后由mycat去访问具体的数据库服务器&a…

数据库:mycat实现读写分离

目录 一、mycat 1、mycat实现读写分离原理 2、mycat应用场景 3、mycat作用 4、mycat实现读写分离实战 一、mycat 1、mycat实现读写分离原理 ①用户进行读操作则由mycat转给配置的从数据库。 ②用户进行写操作则由mycat转给配置的主数据库。 ③转发规则由mycat配置文件中…

mycat实现读写分离

1、在本地复制多一个数据库&#xff08;有条件拥有多个服务器的忽略&#xff09; 1&#xff09;找到mysql实例文件夹和数据文件夹&#xff08;通常在C:\Program Files下和C:\ProgramData下&#xff09; 直接都复制一份出来做从库 2&#xff09;修改从库配置my.ini [client]…

汉诺塔递归算法(Python编程)

一、问题描述。 汉诺塔是学习计算机递归算法的经典入门案例&#xff0c;是一个数学难题。其问题为如何将所有圆盘从A移动到C&#xff0c;要求一次只能移动一个盘子&#xff0c;盘子只能在3个标杆&#xff08;A/B/C&#xff09;之间移动&#xff0c;更大的盘子不能放在更小的盘子…

汉诺塔递归调用(C语言实现)

预备知识 1.递归算法 递归算法&#xff1a;是一种直接或者间接地调用自身的算法。在计算机编写程序中&#xff0c;递归算法对解决一大类问题是十分有效的&#xff0c;它往往使算法的描述简洁而且易于理解。 递归过程一般通过函数或子过程来实现。 递归算法的实质&#xff1…

python实现汉诺塔递归算法超详细过程

python实现汉诺塔递归算法 def hanoi(n, x, y, z):if n 1:print(x, -->, z)else:hanoi(n-1, x, z, y)print(x, -->, z)hanoi(n-1, y, x, z)n int(input(请输入层数&#xff1a;)) hanoi(n, x, y, z) if n 1: #如果n等于1时print(x, -->, z) #直接将x移…

多图详解汉诺塔递归实现思路--含实现代码

前言 为了节约大家的时间&#xff0c;本文对汉诺塔的定义就不做赘述了&#xff0c;如果有小伙伴不清楚汉诺塔的规则可以直接点蓝字跳转过去。 本篇博客内容 汉诺塔实现的思路用递归的方式实现汉诺塔 汉诺塔实现的思路 我们先以两个瓷盘为例&#xff1a; 由于小瓷盘1位于顶部&a…

汉诺塔递归算法C++实现

算法介绍 其实算法非常简单&#xff0c;当盘子的个数为n时&#xff0c;移动的次数应等于2^n – 1&#xff08;有兴趣的可以自己证明试试看&#xff09;。后来一位美国学者发现一种出人意料的简单方法&#xff0c;只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型…

汉诺塔递归算法(C语言)

汉诺塔递归算法 一、引言二、解决汉诺塔问题&#xff08;1&#xff09;递归算法 三、C语言实现&#xff08;1&#xff09;代码实现&#xff08;2&#xff09;算法思想 四、结论 一、引言 汉诺塔问题是一个经典的数学谜题&#xff0c;它是在印度流传下来的&#xff0c;传说中有…

汉诺塔递归调用

1.递归算法 递归算法&#xff1a;是一种直接或者间接地调用自身的算法。在计算机编写程序中&#xff0c;递归算法对解决一大类问题是十分有效的&#xff0c;它往往使算法的描述简洁而且易于理解。 递归过程一般通过函数或子过程来实现。 递归算法的实质&#xff1a;是把问题转…

汉诺塔递归的空间复杂度_算法之美:解读递归算法原理和效率

对于很多人来说,都知道递归,也能看的懂递归,但在实际项目过程中,却不知道如何使用递归,这里给递归做个总结。 递归的定义 在数学与计算机科学中,递归(Recursion)是指在函数的定义中使用函数自身的方法。实际上,递归,顾名思义,其包含了两个意思:递和归,这正是递归思想…

汉诺塔递归问题的分析与Python实现

背景 相传在古印度圣庙中&#xff0c;有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上&#xff0c;有三根杆(编号A、B、C)&#xff0c;在A杆自下而上、由大到小按顺序放置64个金盘(如图)。游戏的目标&#xff1a;把A杆上的金盘全部移到C杆上&#xff0c;并仍保持原…

汉诺塔递归算法/搬金盘的婆罗门 - Python实现

汉诺塔递归算法/搬金盘的婆罗门 - Python实现 本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载&#xff0c;但需要注明原作者"海洋饼干叔 叔"&#xff1b;本文不允许以纸质及电子出版为目的进行抄摘或改编。 1.《Python编程基础及应用…

汉诺塔递归的空间复杂度_学习算法绕不开的~~汉诺塔

大家好,我是老郝。本文就汉诺塔问题向大家阐述递归的思想。 【问题描述】 有三根柱子,最左边的柱子上从大到小放着很多的圆盘,要求把圆盘一个一个的放到最右边的柱子上并且只能小盘子压在大盘子上。(据说古代阿三要他们的和尚把64个圆盘从左到右放一遍,看到最后你就知道阿三…

汉诺塔递归的空间复杂度_【干货】Java算法复杂度

同一问题可用不同算法解决&#xff0c;而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。 算法复杂度分为时间复杂度和空间复杂度。其作用&#xff1a; 时间复杂度是度量算法执行的时间长短&#xff1b;而空间复杂度是度量算法所需…

汉诺塔递归问题

汉诺塔问题&#xff1a; 这是一道著名的算法题&#xff0c;也是递归思想的典型体现。 可以总结&#xff0c;当圆盘数为n时&#xff0c;将最下层圆盘和其余上部份所有圆盘看作两个整体&#xff0c;则满足以下步骤&#xff1a; 1、把n-1个圆盘从A经过C移动到B 2、把第n个圆盘从…

汉诺塔递归算法python详细解析图_汉诺塔递归算法的图解(自我总结)

汉诺塔介绍 汉诺塔简单介绍&#xff1a; 有三根相邻的柱子&#xff0c;假定从左到右为A,B,C&#xff0c;A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘&#xff0c;要把所有盘子一个一个移动到柱子B上&#xff0c;并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。…

C#汉诺塔递归算法实现

目录: 一、什么是递归1.先来看一下一个递归的例子2.递归的基本原理 二、汉诺塔问题1.汉诺塔的故事2.回到编程&#xff0c;汉诺塔问题主要就是解决这个问题&#xff1a;3.怎么解决汉诺塔问题要解决汉诺塔问题就要用到递归思想&#xff0c;这里拿四层汉诺塔举例子&#xff1a; 4.…

递归算法 —— Hanoi汉诺塔游戏

前言 博客主页&#xff1a;干脆面la的主页 gitte链接&#xff1a;干脆面la的gitee仓库 刚学习完递归函数接触汉诺塔问题的时候&#xff0c;汉诺塔问题困扰了我很久。博主花了很长时间理解这道题目&#xff0c;因此整理出了用递归解决汉诺塔问题的思路&#xff0c;希望对大家有所…