利用mycat管理mysql的集群的管理

Mycat是什么:

    Mycat是一个 数据库的中间件,支持 SQL92标准

    支持MySQL、Oracle、DB2、SQLServer、PostgreSQL等DB的常见SQL语法

    遵守 Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。

    基于心跳的自动故障切换,支持读写分离,支持 MYSQL主从,以及集群操作。


首先在github上下载Mycat-Server的源代码:

https://github.com/MyCATApache/Mycat-Server

找到 项目当中的 MycatStartup.java  这个文件是一个入口文件,等下会用到。


-----------------------------------------------------------------------------------------------------------------------------

接下来演示mycat对mysql中的一张表进行垂直分表(单数据库大表拆分)的操作,即将一张表映射到mysql当中的三张表上


首先在某台服务器的mysql当中建立一张表如下图:

表名:  company1


然后把company1这张表复制2份

表名: company2

表名: company3


在navicat当中是这样的:



然后回到  Mycat-Server这个项目中进行对应的配置:

看到  server.xml文件中的 <user 这个标签的配置


记下这里的 password和schemas,等下使用  navicat连接


然后过来配置  schema.xml文件:

替换成下面的配置:

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


	<!-- 
		schema标签
			name意思是 在mycat当中显示的模拟库的名称和 工程中server.xml文件中的 schemas 配置要一样
			checkSQLschema   select * from db1.table where      加了这个之后会默认识别 db1
		table标签
			name 对应 mycat中虚拟的表名称
			subTables 对应的是实际 对应company表在 mysql中的实际分片,本例子中分了三片
			dataNode  配置数据节点
			rule    对应分片的规则,可以在 rule.xml文件当中查看
	-->
	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
		<table name="company" subTables="company$1-3" dataNode="dn1" rule="mod-long" />
	</schema>
	
	
	<dataNode name="dn1" dataHost="localhost1" database="test" />

	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

		<heartbeat>select user()</heartbeat>
		
		<!-- 数据的写操作,这里要配置数据库的真实连接地址  -->
		<writeHost host="hostS1" url="192.168.159.136:3306" user="root"
				   password="root" />

	</dataHost>

	
</mycat:schema>

然后把 MyCat-Server.java中的 MyCatStartUp.java这个文件运行一下

运行,在navicat控制端连接mycat



连接之后发现 TESTDB这个模拟库和  company 这个mycat中的模拟表


然后点击Mycat-Server中的查询-->新建查询,然后在控制台执行下面的语句:

INSERT INTO `company2` VALUES ('1', '华为');
INSERT INTO `company3` VALUES ('2', '中兴');
INSERT INTO `company1` VALUES ('3', 'OPPO');
INSERT INTO `company2` VALUES ('4', '百度');
INSERT INTO `company3` VALUES ('5', '小米');

INSERT INTO `company1` VALUES ('6', '阿里');

然后看实际数据库表中的数据,已经被mycat分流到不同的 company1、company2、company3表当中了如下图:

company1:


company2:


company3:



然后继续在控制台执行下面的语句:

explain select * from company;


可以看到下面的信息:


发现sql解释执行计划会遍历所有的表


-----------------------------------------------------------------------------------------------------------------------------

接下来演示下跨数据库分表的问题:

在schema.xml文件当中进行下面的配置:

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

	<!--  schema 当中的

		name  属性配置了新的数据库名称
		checkSQLschema   select * from db1.table where      加了这个之后会默认识别 db1
	-->
	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">

		<table name="company" subTables="company$1-3" dataNode="dn1" rule="mod-long" />
		<table name="record"  dataNode="dn1,dn2,dn3" rule="mod-long" />

	</schema>


	<dataNode name="dn1" dataHost="localhost1" database="db1" />
	<dataNode name="dn2" dataHost="localhost1" database="db2" />
	<dataNode name="dn3" dataHost="localhost1" database="db3" />


	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

		<heartbeat>select user()</heartbeat>

		<writeHost host="hostS1" url="192.168.159.136:3306" user="root"
				   password="root" />

	</dataHost>


</mycat:schema>

然后再192.168.159.136这台服务器上面建立三个 数据库 分别为  db1、db2、db3




配置完成后运行 MycatStartup.java 这个文件:

然后再在  Mycay-server.java  当中发起一个查询:


输入下面的建表语句

CREATE TABLE `record` (
  `id` varchar(32) DEFAULT NULL,
  `record_name` varchar(255) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后会发现在 管理配置的192.168.159.136这台服务器上出现了 schema.xml当中配置的record这张表,并且分配给了不同的三个数据库  db1、db2、db3


再次在Mycat-Server这个虚拟库下新建一个查询


insert into record(id,record_name)value(1,"hahaha");
insert into record(id,record_name)value(2,"hehehe");

insert into record(id,record_name)value(3,"gagaga");

然后可以再其他三个库当中看到record记录被分片路由,最后存储到三个不同的库,如下图所示:

db1中:


db2中:


db3中:



-----------------------------------------------------------------------------------------------------------------------------

接下来演示下mycat当中的读写分离:

<?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" />


	<dataNode name="dn1" dataHost="localhost1" database="DB" />
	


	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

		<heartbeat>show slave status</heartbeat>

		<writeHost host="hostM1" url="192.168.159.136:3306" user="root"
				   password="root" >
			<readHost host="hostS1" url="192.168.159.135:3306" password="root" user="root" />
		</writeHost>

		<!--
		<writeHost host="hostS1" url="192.168.159.135:3306" user="root"
				   password="root" />
		-->

	</dataHost>


</mycat:schema>


-----------------------------------------------------------------------------------------------------------------------------



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_24545901/article/details/80333424
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭