数据库:mycat实现读写分离

article/2025/9/9 7:56:41

目录

一、mycat

1、mycat实现读写分离原理

2、mycat应用场景

3、mycat作用

4、mycat实现读写分离实战


一、mycat

1、mycat实现读写分离原理

①用户进行读操作则由mycat转给配置的从数据库。

②用户进行写操作则由mycat转给配置的主数据库。

③转发规则由mycat配置文件中定义,那台是读那台是写。

2、mycat应用场景

Mycat适用的场景很丰富,以下是几个典型的应用场景

单纯的读写分离,此时配置最为简单,支持读写分离,主从切换

分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片

多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化报表系统,借助于Mycat的分表能力,处理大规模报表的统计

替代Hbase,分析大数据,作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择

3、mycat作用

一个彻底开源的,面向企业应用开发的大数据库集群

支持事务、ACID、可以替代MySQL的加强版数据库

一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群

一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server

结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

一个新颖的数据库中间件产品

4、mycat实现读写分离实战

①环境准备:

2台安装了相同版本mysql数据库的服务器

主服务器(pc1):192.168.30.11

从服务器(pc2):192.168.30.12

1台服务器备用安装mycat

mycat服务器(pc3):192.168.30.13

1台客户机用于测试读写分离

测试服务器(pc4):192.168.30.14

②首先关闭4台服务器的firewalld以及selinux,重置主从服务器的mysql密码为Admin@123

pc1、pc2执行:
systemctl  stop  firewalld.service 
setenforce 0
systemctl start mysqld
#开启数据库
grep password /var/log/mysqld.log
#在错误日志中找到mysql初始密码,如下图
mysql -uroot  -p'初始密码' 
#登录数据库
alter user root@'localhost'  identified by 'Admin@123';
quit;
#修改root默认密码并退出

③主节点: 

vim  /etc/my.cnf
[mysqld]下一行添加内容:
server_id=11
#serverid建议配置为ip地址最后8位
log-bin=mysql-bin
#开启二进制日志
binlog_format=MIXED
#二进制日志格式
log-slave-updates=true
#开启从服务器同步
systemctl restart mysqld
#重启数据库
mysql -uroot -p'Admin@123'
#登录数据库
show  master status;
#查看主从复制从那个二进制日志的那个初始节点开始,从服务器配置需要依赖此条查看结果
grant replication slave on *.* to 'myslave'@'192.168.30.%' identified by 'Admin@123';
#建立一个myslave用户,并且允许192.168.30.%这个网段的地址来登录(环境不同注意改为自己的网段),密码是Admin@123,一会儿要在slave上使用这个账号
flush privileges;
#刷新一下;
create  database  test;
use test;
create table  lhj(id int,name char(11));
insert  lhj()  values(1,'abc'),(2,'xyz');
quit
#创建test库进入test库创建lhj表并写入2条数据到lhj表中,退出数据库。

④从节点: 

vim /etc/my.cnf
[mysqld]下一行添加内容:
server_id=12
relay-log=relay-log-bin
#添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index
#添加,定义中继日志文件的位置和名称,一般和relay-log在同一目录
systemctl restart mysqld
#重启服务
mysql -uroot -p'Admin@123'
#登录数据库
change master to
master_host='192.168.30.11',
master_user='myslave',
master_password='Admin@123',
master_log_file='master-bin.000001',
master_log_pos=154;
#配置主服务器相关信息包括主机,远程辅助用户和密码以及开始日志及节点,可以使用help change master to 查看模板
start slave;
#开启slave
show slave status \G;
#查看从服务器状态信息
select * from test.lhj
#查看是否将test库中的lhj表内容同步过来

⑤mycat节点:

yum install java -y
#mycat基于java所以要安装java环境
java -version
#查看java版本,确认安装成功
cd /opt
wget http://dl.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz
#进入/opt目录从官网下载mycat包
mkdir /apps
tar zxvf Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz -C /apps/
#创建/apps目录并将mycat包解压到/apps中
echo 'PATH=/apps/mycat/bin:$PATH' > /etc/profile.d/mycat.sh
source /etc/profile.d/mycat.sh
#设置并刷新环境变量使得mycat可以补全
mycat start
#启动mycat,注意若服务器内存小于等于2Gmycat服务起不来
tail -f /apps/mycat/logs/wrapper.log
#启动成功日志末尾会出现successfully,mycat只能通过查看日志的方式判断是否启动成功
#修改 mycat 配置文件*/apps/mycat/conf/schema.xml*此文件关联mysql读写分离策略,读写分离、分库分表策略、分片节点都是在此文件中配置的
vim  /apps/mycat/conf/schema.xml
#进入文件将内容全部删除然后复制添加以下文件修改
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema><dataNode name="dn1" dataHost="localhost1" database="test" />
#定义数据节点名为dn1,物理数据库名为localhost1,物理数据库中数据库名为test,此库主服务器中必须存在<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="host1" url="192.168.30.11:3306" user="root" password="Admin@123">
#配置写主机名为host1,主机地址为192.168.30.11:3306,登录用户为root,密码为Admin@123<readHost host="host2" url="192.168.30.12:3306" user="root" password="Admin@123"/>
#配置写主机名为host2,主机地址为192.168.30.12:3306,登录用户为root,密码为Admin@123</writeHost></dataHost>
</mycat:schema>

⑤主节点授权mycat登录:

mysql -uroot -p'Admin@123'
#登录数据库
GRANT ALL ON *.* TO 'root'@'192.168.30.%' IDENTIFIED BY 'Admin@123';
#创建授权一个root远程登录用户网段为192.168.30段,密码为Admin@123
use mysql;
select user,host from user;
#查看是否创建成功

⑥mycat节点授权完成后重启mycat服务:

mycat restart 
tail -f /apps/mycat/logs/wrapper.log
#重启mycat服务并通过日志查看是否重启成功
netstat -antp |grep 3306
#mycat重启成功后可以通过过滤监听3306端口看到mycat有在监听主从俩个服务器的3306端口

⑦测试服务器测试读操作:

mysql -uroot -p123456 -h 192.168.30.13  -P8806
#客户机远程登录mycat,-h指定远程登录地址,-P指定登录端口,mycat默认有个root用户密码为123456
show  databases;
#可以看到有个TESTDB库访问此库即访问主服务器的test库
use TESTDB;
select * from lhj;
#可以看到和主库中lhj表一样的数据
select @@server_id;
#使用select查询语句看提供服务的id即可看到是12提供的服务即从服务器提供的读服务

⑧主从服务器开启通用日志并实时查看,在客户端的表中新增内容可以看到只有主有日志变化显示

主从都执行:
mysql -uroot -pAdin@123
#登录数据库
set global general_log=1;
#打开通用日志,通用日志若为yum安装则会在/var/lib/mysql/本机主机名.log文件
quit;
#退出数据库
主服务即主机名为pc1:
tail -f/var/lib/mysql/pc1.log
#实时查看通用日志
从服务即主机名为pc2:
tail -f/var/lib/mysql/pc2.log
#实时查看通用日志
客户端测试:
mysql -uroot -p123456 -h192.168.30.13 -P8066
#登录mycat
use  TESTDB;
insert lhj() values('3','test');
#进入TESTDB库并在lhj表中加入数据查看主从实时日志只有主日志显示变化则读写分离实现,日志截图如下

 


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

相关文章

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;希望对大家有所…

计算任意位数的黑洞数

黑洞数是指这样的整数&#xff1a; 由这个数字每位数字组成的最大数减去每位数字组成的最小数仍然得到这个数自身。 例如3位黑洞数是495&#xff0c;因为954-459495&#xff0c;4位数字是6174&#xff0c;因为7641-14676174。 def max( x ):data[]while x/1!0:kx%10xx//10data.…

蓝桥杯 黑洞数 解题报告

任意一个5位数&#xff0c;比如&#xff1a;34256&#xff0c;把它的各位数字打乱&#xff0c;重新排列&#xff0c;可以得到一个最大的数&#xff1a;65432&#xff0c;一个最小的数23456。求这两个数字的差&#xff0c;得&#xff1a;41976&#xff0c;把这个数字再次重复上述…

黑洞数—python

黑洞数:黑洞数又称陷阱数,是类具有奇特转换特性的整数。任何一个数字不全相同整数,经有限“重排求差”操作,总会得某一个或一些数,这些数即为黑洞数。“重排求差”操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数。或者是冰雹原理中的“1”黑洞数 如果有…