目录
1、概述
- 读写分离就是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。
- 通过MyCat即可轻易实现上述功能。
- 【注】Mycat是一个开源数据库中间件,是一个实现了MySQL协议的的数据库中间件服务器,我们可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问Mycat,而Mycat再使用用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,包括SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。
- 下面为一主一从的图解:
2、环境准备
- 主机:阿里云服务器Ubuntu22.04
- 从机:本地电脑Win10
- Mycat1.6(从机Win10上)
- java环境:jdk1.8
- 数据库:Mysql8.0.34
- 读写分离是基于主从复制的,如何搭建主从复制可以看这篇文章:数据库进阶教学——主从复制(Ubuntu22.04主+Win10从)-CSDN博客
- 搭建好主从复制环境后,在从机中查看主从复制信息,显示如下。
3、读写分离实验
3.1、安装jdk
- 使用mycat是需要java环境的,先查看本地电脑上是否安装了java环境。
- 【注】mycat1.6需要的jdk版本不能太新,不然会报错!用jdk1.8就行。
- 我这已经安装好了,没有安装的可以参考:超详细JDK1.8安装与配置_jdk1.8安装教程及环境变量配置-CSDN博客
3.2、安装Mycat
- 理论上,应该将Mycat安装在一个独立的服务器上,然后配置Mycat与主库和从库建立连接,通过Mycat提供的读写分离配置,将读操作分发到从库,将写操作分发到主库。
- 这里为了方便,直接在本地电脑(从库)上安装Mycat。Mycat资源:Win10安装Mycat_mycat windows-CSDN博客(不知道为啥官网打不开)。
- 【注】因为我的本地电脑没有外网,所以mycat只能装在我的本地电脑中。如果装在服务器上,它将不能访问我的本地电脑。而我的本地电脑是可以访问服务器的。
- 【注】下面是在Win10中安装Mycat。
- 下载压缩包并解压。
- 配置环境变量:
- 新增环境变量MYCAT_HOME,配置mycat的根目录。
- 新增Path变量。
-
%MYCAT_HOME%\bin
-
- 新增环境变量MYCAT_HOME,配置mycat的根目录。
- 修改配置文件mycat/conf/wrapper.conf
-
# 添加java路径 wrapper.java.command=D:\App\Java\jdk-1.8\ wrapper.java.command=%JAVA_HOME%/bin/java.exe # 修改内存 wrapper.java.additional.10=-Xmx4G wrapper.java.additional.11=-Xms1G 改为: wrapper.java.additional.10=-Xmx512M wrapper.java.additional.11=-Xms64M
-
3.3、配置Mycat
3.3.1、配置schema.xml
- Mycat控制后台数据库的读写分离和负载均衡由schema.xml文件datahost标签的balance属性控制。
- balance参数值:
- 0:不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
- 1:全部的readHost与备用的writeHost都参与select语句的负载均衡(主要针对于双主双从模式)。
- 2:所有的读写操作都随机在writeHost,readHost上分发。
- 3:所有的读请求随机分发到writeHost对应的readHost上执行,writeHost不负担读压力。
- schema.xml位置:
- 选择要实现读写分离的数据库,要在文件中修改对应的名字。
-
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="MASTER_RW" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema> <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" /> --> <dataNode name="dn1" dataHost="localhost1" database="db01" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="master" url="123.56.xxx.xxx:3306" user="root" password="root"> <readHost host="slave" url="127.0.0.1:3306" user="root" password="root"/> </writeHost> </dataHost> </mycat:schema>
-
- 重点关注以下几个参数:
3.3.2、配置server.xml
- server.xml的位置。
- 修改逻辑库。
-
<!--以下设置为应用访问帐号权限 --> <user name="root" defaultAccount="true"> <property name="password">root</property> # mycat登录密码 <property name="schemas">MASTER_RW</property> </user> <!--以下设置为应用只读帐号权限 --> <user name="user"> <property name="password">user</property> <property name="schemas">MASTER_RW</property> <property name="readOnly">true</property> </user>
-
3.4、修改主从机远程登陆权限
- mycat需要通过权限访问主库和从库。
3.4.1、主机
- 进入数据库,输入命令:
-
update user set host='%' where user = 'root'; flush privileges; # 刷新权限
-
3.4.2、从机
- 进入数据库,输入命令:
-
update user set host='%' where user = 'root'; flush privileges; # 刷新权限
-
3.5、启动Mycat
- 以管理员打开终端,进入 mycat/bin,启动mycat。
-
mycat.bat start
- 启动失败:
- 查看日志文件wrapper.log。
- 查看日志文件wrapper.log。
- 解决办法:
- 修改配置文件mycat/conf/wrapper.conf
-
- 再次启动,成功。
3.6、登录Mycat
- 使用终端登录mycat。
-
mysql -u root -p -h127.0.0.1 -P8066
-
- 登录成功,查看其中的数据。
3.7、验证
- 在mycat的终端插入一条数据。
-
insert into tb_user(id,name,sex) values(4,'master',0);
-
- 查看主库的数据,已经插入了新数据。
- 查看从库的数据,并没有插入新数据。
- 说明插入操作是在主库中进行的。
- 【注】这是因为主从复制和读写分离配置的都是3306端口,使用了读写分离后,主从复制就会失效。只需要用完读写分离后,再打开主从复制即可。
- 在mycat中执行查询操作。
- 查询到的数据与从库一致,说明查询操作是在从库中进行的。
- 重新开启主从复制。在从库的数据库中执行下列命令:
-
stop slave; set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; start slave; show replica status\G;
-
- 查看从库数据,已经与主库保持一致。
- 再次在mycat中执行查询操作。
- 验证完毕。