高性能Mysql(二) | 基于MyCat分库分表,读写分离,主从同步

本文详细介绍了如何在MyCat上进行数据库分库分表及读写分离的配置,包括server.xml、schema.xml和rule.xml的调整,以及如何启动、登录和检查MyCat的效果。通过实例演示,读者可以掌握如何在192.168.43.110和192.168.43.111的数据库中实现逻辑库TESTDB的分表和主从同步操作。
摘要由CSDN通过智能技术生成

前言

      前文介绍了主从同步原理以及进行了实操演示,本文在前文的基础上学习基于mycat分库分表,读写分离。
      上一篇:高性能Mysql(一) | 主从同步原理与实操

MyCat

示例架构图:
在这里插入图片描述
192.168.43.110:数据库test01,数据库test02,分别有student表

192.168.43.111:数据库test01,数据库test02,分别有student表

192.168.43.216:安装mycat,安装JDK

安装与配置(需要装JDK)

1.下载MyCat
2.解压:tar -xvzf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz
3.进入conf目录,修改3个配置文件server.xml,schema.xml,rule.xml

文件作用
server.xml指定MyCat用户账号和密码,以及逻辑数据库等等
schema.xml设置分库分表,读写分离配置
rule.xml分表的一些规则
server.xml:
  • 只留一个用户,账号密码为 root/root,指定逻辑数据库为TESTDB(修改点)
  • 注释掉的privileges是给表做一些DML权限控制(注意点)
	<user name="root" defaultAccount="true">
		<property name="password">root</property>
		<property name="schemas">TESTDB</property>
		
		<!-- 表级 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">TESTDB</property> -->
		<!-- <property name="readOnly">true</property> -->
	<!-- </user> -->

schema.xml:
解释:
1.给TESTDB逻辑库,拆分为2个物理库test01,test02。
2.student表以为rule为mod-long的规则来分表,这个规则是根据id平均分配,配置在rule.xml里面
3.读写分离,192.168.43.110master写,192.168.43.111slave节点读

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
		<!--name:分表
			dataNode:拆分后的数据切片的位置  dn1,dn2
			rule:拆分规则myrule (拆分的规则叫 myrule)
		-->
		<table name="student" dataNode="dn1,dn2" rule="mod-long" />

	</schema>


	<dataNode name="dn1" dataHost="localhost1" database="test01" />
	<dataNode name="dn2" dataHost="localhost1" database="test02" />

	<!--  dataHost:设置读写分离的主机地址-->
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
	
		<writeHost host="hostM1" url="192.168.43.110:3306" user="root"
				   password="123456">
			<readHost host="hostS2" url="192.168.43.111:3306" user="root" password="123456" />
		</writeHost>

	</dataHost>

</mycat:schema>

部分参数说明:

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 --推荐

rule.xml
修改rule中mod-long的规则,count=2,因为配置的test01,test02 2个节点

	<tableRule name="mod-long">
		<rule>
			<columns>id</columns>
			<algorithm>mod-long</algorithm>
		</rule>
	</tableRule>
	<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
		<!-- how many data nodes -->
		<property name="count">2</property>
	</function>

启动MyCat

进入bin目录:

../mycat start  --启动
../mycat stop  --停止
../mycat restart    --重启
../mycat status    --查看状态

登录:
不能直接在mycat所在节点192.168.43.216 登录,需要借助一个 已经安装了mysql软件的 计算机上 远程操作mysql
我们在192.168.43.110或者192.168.43.111登录mycat,端口为8066:

mysql  -uroot -proot -h192.168.43.216 -P8066

在这里插入图片描述
我们可以看到数据库为逻辑库TESTDB,

查看日志:如果有报错看日志
logs目录下的:wrapper.log文件
在这里插入图片描述

检验效果

看一下数据库的结构,也就是一开始的那张图的样子:
192.168.43.110:数据库test01,数据库test02,分别有student表
192.168.43.111:数据库test01,数据库test02,分别有student表
在这里插入图片描述

使用逻辑库TESTDB登录,查看student表,并且插入一条数据:
insert into student(id,name) values(1,‘testmycat1’);
注意:通过mycat是强语法,比如insert into student values(1,testmycat1) ;就不行)
在这里插入图片描述
在这里插入图片描述
我们可以看到,我们使用的逻辑库TESTDB,往master(192.168.43.110)的物理库test02插入了一条数据,并且通过主从同步同步到了slave(192.168.43.111)从节点的test02库

再次插入一条数据:
insert into student(id,name) values(2,‘testmycat2’);
在这里插入图片描述
我们可以看到这次在master(192.168.43.110)的test01库插入了一条数据,并且通过主从同步同步到了slave节点(192.168.43.110)的test01库

它是根据rule.xml文件里面配置的平均分的规则来确定入的哪个库的student表,id每加1交替入test01和test02库,然后同步至slave库

学习博文:MyCAT 配置详解

上一篇:高性能Mysql(一) | 主从同步原理与实操
下一篇:高性能Mysql(三) | 通过haproxy与keepalived对mysql分库分表实现高可用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值