MyCat 数据库分片极简体验

MyCat是什么

MyCat是数据库分库分表的中间件。

应用场景实例

场景之一是: 某一个表数据量很大,超过千万级别, 通过MyCat可以将这张表的数据按照一定的分片算法分布在多个数据库中。

实例环境与效果

  • Windows
  • MyCat 1.6
  • mysql-8.0.16-winx64
  • MySQL Workbench

实例效果:
有一张用户表my_user, 包含三个字段
id : 用户ID
country :用户所属的国家
name : 用户名
按照不同的国家存储用户到不同库的表中, 每个国家对应一个库。

  1. 安装MySQL和MyCat, 建立db1、db2和db3三个数据库。
  2. 在MyCat中配置以上三个数据库和分片规则之后,启动MyCat
  3. 使用WorkBench连接MyCat虚拟数据库
  • 创建数据表时会同时在三个库中创建表
  • 插入数据时,会根据分片规则将数据写到对应的表中

实例步骤:

1. 下载MyCat并解压

下载地址:
http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-win.tar.gz

解压后目录如下:
在这里插入图片描述

2. 配置

进入config目录,分别配置server.xml、schema.xml和rule.xml的配置文件

1.配置虚拟数据库 server.xml
配置MyCat虚拟数据库的用户名、密码以及数据库名。
这里保持默认设置即可:

	<user name="root"> <!--数据库用户名 -->
		<property name="password">123456</property> <!-- 密码-->
		<property name="schemas">TESTDB</property> <!-- 数据库名-->
	</user>
  1. 配置虚拟数据库和实体数据库的关系: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">
		<table name="my_user"  dataNode="dn1,dn2,dn3" rule="myrule" />
	</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="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
        </writeHost>
  </dataHost>
</mycat:schema>

schema 配置虚拟数据库,与server.xml中的对应(TESTDB),table定义数据库中的表
dataNode 数据节点,代表的就是实体数据库,包括数据主机(dataHost)和数据库名
dataHost就是实体数据库的配置,包括数据库类型,数据库实际的url,已经连接的用户名密码

  1. 分片规则 rule.xml
    MyCat可以定义多种分片规则,这里根据表的某个字段的值来分片,将分片规则定义在partition-hash-int.txt文件中。
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
    <tableRule name="myrule">
             <rule>
                <columns>country</columns>
                <algorithm>hash-int</algorithm>
                </rule>
    </tableRule>
	
	<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
		<property name="mapFile">partition-hash-int.txt</property>
		<property name="type">1</property>
		<property name="defaultNode">0</property>
	</function>
</mycat:rule>

partition-hash-int.txt

china=0
usa=1
england=2

以上的意思是:来自中国的用户写入db1库的my_user表,美国的写入db2,英国的写入db3。在MySQL中分别创建3个数据库:

create database db1;
create database db2;
create database db3;

3. 启动

简单的启动方式是在MyCat的bin目录下, 命令行执行:

startup_nowrap.bat

4.测试

在这里插入图片描述

CREATE TABLE my_user (

id varchar(64) NOT NULL,

country varchar(10) NOT NULL,

name varchar(64) NOT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into my_user(id,country,name) values(‘001’,‘china’,‘User 1’);
insert into my_user(id,country,name) values(‘002’,‘usa’,‘User 2’);
insert into my_user(id,country,name) values(‘003’,‘england’,‘User 3’);

jdbc:mysql://127.0.0.1:8066/TESTDB?characterEncoding=utf-8

错误解决

以上在MySQL 5运行正常,但在MySQL8出错,报:

Client does not support authentication protocol requested by server; consider upgrading MySQL client

解决方法是执行:

 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';

原因:
mysql模块并未完全支持MySQL 8的“caching_sha2_password”加密方式,而“caching_sha2_password”在MySQL 8中是默认的加密方式

conf/wrapper.conf 参数配置,比如JVM

CREATE TABLE exam (

id varchar(64) NOT NULL,

ilevel int NOT NULL,

name varchar(64) NOT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE exam (

id varchar(64) NOT NULL,

slevel varchar(10) NOT NULL,

name varchar(64) NOT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

startup_nowrap.bat

create database db1;
create database db2;
create database db3;

CREATE TABLE exam (

id varchar(64) NOT NULL,

slevel varchar(64) NOT NULL,

name varchar(64) NOT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

发布了591 篇原创文章 · 获赞 486 · 访问量 463万+

猜你喜欢

转载自blog.csdn.net/oscar999/article/details/102801860
今日推荐