MySQL实操(三)——使用Mycat实现分库分表+读写分离

 MySQL实操系列


目录

整体架构

实现目标

环境准备

环境搭建

1.Mycat下载

2.Mycat下载安装、配置、启动、测试

2.1 Mycat下载安装

2.2 Mycat配置

2.3 Mycat启动

2.4 Mycat分库分表读写分离测试


整体架构

实现目标

  • 搭建MySQL主从复制集群
  • 安装Mycat并配置分库分表+读写分离

环境准备

环境搭建

1.Mycat下载

可从以下网址下载Mycat:

        CSDN下载:Mycat-server-1.6.6.1ForLinux-CentOS文档类资源-CSDN下载

        Mycat官网地址:MyCat2

        Mycat Gitee地址:Mycat2: Mycat2是Mycat社区开发的一款分布式关系型数据库(中间件)。它支持分布式SQL查询,兼容MySQL通信协议,以Java生态支持多种后端数据库,通过数据分片提高数据查询处理能力

        Mycat GitHub地址:GitHub - MyCATApache/Mycat-Server

具体下载哪个版本以发布为准,推荐稳定最新版,当前演示使用1.6.6.1

2.Mycat下载安装、配置、启动、测试

2.1 Mycat下载安装

将下载的压缩包上传到Mycat服务器的/usr/soft/mycat目录下,执行解压命令

tar -zxvf Mycat-server-1.6.6.1-release-linux.tar.gz

解压后文件路径及目录如下

进入mycat,目录说明如下

目录说明
binmycat命令,启动、重启、停止等
catletcatlet为Mycat的一个扩展功能
confMycat 配置信息,重点关注:主要配置文件为rule.xml、schema.xml和server.xml三个
libMycat依赖的jar包,Mycat是java开发的
logs日志文件,包括Mycat启动日志wrapper.log和运行日志mycat.log

2.2 Mycat配置

进入mycat/conf目录下,修改rule.xml、schema.xml和server.xml三个配置文件

配置文件下载地址:Mycat配置文件,请配合博客使用-Linux文档类资源-CSDN下载

修改server.xml

#进入conf配置目录
cd /usr/soft/mycat/mycat/conf
#修改server.xml
vim server.xml

只修改server.xml中的user标签

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
	...
	<!-- 
		name:登录mycat的用户名
		property.password:登录mycat的密码
		property.schemas:mycat的逻辑库(虚拟库)
	-->
	<user name="root" defaultAccount="true">
		<property name="password">123456</property>
		<property name="schemas">mydb</property>
	</user>
</mycat:server>

修改schema.xml(Mycat的主要配置文件

vim schema.xml

schema.xml所有内容及备注如下

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
	<schema name="mydb" checkSQLschema="false" sqlMaxLimit="100">
		<!-- 
			name: 分表 
			dataNode:拆分后的数据切片的位置
			rule:拆分规则,在rule.xml中配置,如mod-long为平均分配
		-->
		<table name="user" dataNode="dn1,dn2" rule="mod-long" />
	</schema>
	<!--
		name:对应schema-table标签下的dataNode
		dataHost:对应下面的dataHost
	-->
	<dataNode name="dn1" dataHost="localhost1" database="mydb01" />
	<dataNode name="dn2" dataHost="localhost1" database="mydb02" />
	<!-- 
		dataHost:设置读写分离的主机地址 
		balance:读请求的负载均衡
			0:不开启读写分离,所有的读操作 都发送到writehost中
			1:全部的readhost和stand by writehost都参与 读操作的负责均衡
			2:读请求 随机发送给readhost、writehost
			3:读请求随机发送给writehost中的readhost  (writehost不参与读请求) 》》》推荐
			
		writeType:写请求的负载均衡
			0:写请求先发送给schema.xml中的第一个writehost。当第一个writehost挂掉,再自动切换到其他的writehost中 。切换的记录 会被记录在 conf/dnindex.properties  》》》推荐
			1:写请求随机发送到所有的wirtehost中


		switchType: 是否允许 “读操作”在readhost和writehost上自动切换(解决延迟问题:当从readhost中读取数据中 出现网络延迟等问题时,自动从writehost中读数据)
			-1:不许
			1:默认,允许
			2:根据“主从同步的状态” 自动选择是否 切换。
				主从之间 会持续发送心跳。 当心跳检测机制发送了IO延迟,则readhost自动切换到writehost;
				否则不切换。 必须将心跳设置 show slave status    》》》推荐
	-->
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <!-- Mysql主从的心跳 -->
		<heartbeat>select user()</heartbeat>
		<!-- 
			readHost在writeHost标签中,默认为主从读写架构,在此架构中写默认为主节点,读默认为从节点
			host:自主命名
		-->
		<writeHost host="hostM1" url="192.168.237.135:3306" user="root" password="123456">
			<readHost host="hostS2" url="192.168.237.136:3306" user="root" password="123456" />
		</writeHost>
	</dataHost>
	
</mycat:schema>

修改rule.xml

vim rule.xml

如在schema.xml中引用的rule(拆分规则)为mod-long,则到rule.xml中找到mod-long并修改其配置;并设置数据库节点数量及拆分后的切换数量

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
	...
	<!-- 
		平均拆分 
		rule.columns:平均拆分依据的列
	-->
	<tableRule name="mod-long">
		<rule>
			<columns>id</columns>
			<algorithm>mod-long</algorithm>
		</rule>
	</tableRule>
	...
	<function name="murmur"
		class="io.mycat.route.function.PartitionByMurmurHash">
		<property name="seed">0</property><!-- 默认是0 -->
		<property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
		<property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
		<!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->
		<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 
			用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->
	</function>
	...
	<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
		<!-- 拆分后的切片个数 -->
		<property name="count">2</property>
	</function>
	...
</mycat:rule>

2.3 Mycat启动

进入mycat/bin目录下,启动mycat

#进入mycat的bin目录
cd /usr/soft/mycat/mycat/bin
#启动mycat
./mycat start

 Mycat其他命令

#启动
./mycat start
#停止
./mycat stop
#前台运行
./mycat console
#添加到系统自动启动
./mycat install
#取消随系统自动启动
./mycat remove
#重启服务
./mycat restart
#暂停
./mycat pause
#查看启动状态
./mycat status

2.4 Mycat分库分表读写分离测试

测试之前要确保的问题

        1.两台Mysql服务器主从同步成功

        2.确保MySqlMaster中mydb01和mydb02两个数据库存在(在schema.xml中配置的dataNode.database属性

        3.确保MySqlMastermydb01和mydb02两个库中都有user表,且表的字段相同(在schema.xml中配置的schema.table属性

        4.通过Mycat执行的SQL语句和SQL92基本一致,语法相对较为严格。如下所示

--可执行的
INSERT INTO user (id,userName,userPwd,age,address) VALUES (1, 'admin', '123', 100, '3');
--不可执行的
INSERT INTO user VALUES (1, 'admin', '123', 100, '3');

方式一:在Mysql服务器上登录Mycat进行测试

说明:不能直接在Mycat服务器上测试的原因是因为Mycat服务器上没有安装Mysql,无法执行mysql之类的命令,如果mycat和mysql服务在同一台服务器上,可以直接进行测试

登录mycat进行操作

#登录Mycat
#    -u 登录名 用户名和密码为在server.xml中配置的name和password
#    -p 密码
#    -h Mycat服务器地址
#    -P Mycat端口号,默认8066
mysql -uroot -p123456 -h192.168.237.134 -P8066;

 登录数据库查看是否分库分表

方式二:通过SQL管理工具测试

以navicat为例,在navicat中新建Mysql连接:主机为Mycat服务器IP,Mycat端口默认8066,用户名和密码为在server.xml中配置的name和password,其余测试均同方式一一致

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Re: Mycat 实现 MySQL分库分表读写分离、主从切换 =============================# MyCAT 作用是能够代替昂贵的oracle的MySQL集群中间件。     1) 一个彻底开源的,面向企业应用开发的“大数据库集群”    2) 支持事务、ACID、可以替代Mysql的加强版数据库    3) 一个可以视为“MySQL”集群的企业级数据库,用来替代昂贵的Oracle集群(核心价值观) (即:可不用 Orcale数据库及RAC等,以此代替)    4) 一个融合内存缓存技术、Nosql技术、HDFS大数据的新型SQL Server    5) 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品    6) 一个数据库中间件产品 # MyCAT 目标:    1) 低成本的将现有的单机数据库和应用,平滑迁移到“云”端,解决数据存储和业务规模迅速增长情况下的数据瓶颈问题。从这一点介绍上来看,能满足数据库数据大量存储,提高了查询性能。    2) MyCat在大数据方面的运用不容小觑啊。 # MyCAT 特性    1) 支持 SQL 92标准    2) 支持Mysql集群,可以作为Proxy使用    3) 支持JDBC连接ORACLE、DB2、SQL Server,将其模拟为MySQL Server使用    4) 支持galera for mysql集群,percona-cluster或者mariadb cluster, (提供高可用性数据分片集群)    5) 自动故障切换,高可用性(failover & HA)    6) 支持读写分离,支持Mysql双主多从,以及一主多从的模式    7) 支持全局,数据自动分片到多个节点,用于高效关联查询    8) 支持独有的基于E/R 关系的分片策略,实现了高效的关联查询    9) 多平台支持,部署和实施简单 # MyCAT 架构    用户可以把MyCAT看作是一个数据库代理,用mysql客户端工具(如Navicat)和命令访问,其核心功能就是分库分表,即将一个大水平分割为N个小,真正的存储在后端Mysql服务器中或其它数据库中。      

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醉酒的戈多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值