当前位置:天才代写 > tutorial > 数据库教程 > Mysql进阶之Mycat中间件(一) mycat的安装和初步使用

Mysql进阶之Mycat中间件(一) mycat的安装和初步使用

2021-03-02 15:10 星期二 所属: 数据库教程 浏览:998

Mycat分布式数据库

我们知道水准分表会给业务流程层产生许多不便,比如

有一个纪录得奖工作人员的表,每一年都是会有得奖新手入录到这一表格中
大家以時间为层面开展表的分割,方式以下:

t_archieve_2016
t_archieve_2017
t_archieve_2018

假如要想开展增加,我们要获得当今的年代,依据当今年代寻找相匹配的表开展插进

假如想依据id查询,大家就需要开展union联合查询。

假如上边的表并不是在同一个连接点只是遍布在不一样的连接点,那麼业务流程层的分辨会大量。

为了更好地处理这个问题,Mycat就出現了。拥有Mycat以后,Mycat数据库连接服务项目(Mycat可能是连一个连接点的数据库查询也可能是连好几个连接点的数据库查询),而业务流程层立即联接Mycat服务项目而不立即联接mysql服务项目。不论是储备库還是分表,不管分库分表是不是在同一个连接点,Mycat出示给业务流程层的都仅仅一个一切正常的库和一张一切正常的表。查看句子该找哪一个连接点的哪一个表有Mycat该做的事,并不是业务流程层该关注的事。这样一来业务流程层的逻辑性便会降低许多分辨,简易许多。

因为mycat是处在Web运用和MySQL中间的一个公路桥梁人物角色,因此 mycat是一种分布式数据库。分布式数据库联接着Web运用和MySQL,Web运用和MySQL不立即联接。

Mycat应用的也是mysql的协议书,也就是说便是,一切mysql手机客户端的指令,英语的语法对Mycat全是合理的。大家可以用mysql -uroot -p来联接Mycat手机客户端,可以用select句子在mycat查看等。

 

Mycat的安裝

Mycat是根据Java完成的,因此 要先安裝Java。

到官方网站下载Java SE 的rpm包。
官方网站下载mycat

# 安裝Java
rpm -ivh jdk-13.0.2_linux-x64_bin.rpm

# 安裝mycat
tar -xzf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz

mv mycat /usr/local

mycat指令是/usr/local/mycat/bin/mycat,将其载入环境变量中

# 运行
mycat console       # 前台接待运作

* 运行日报错说
Unrecognized VM option 'AggressiveOpts'
Error: Could not create the Java Virtual Machine.
关键是第一句,说vm虚拟机鉴别不上AggressiveOpts主要参数。
第二句说运行不上Javavm虚拟机。

# 改动mycat环境变量
vi /usr/local/mycat/conf/wrapper.conf

寻找
wrapper.java.additional.3=-XX: AggressiveOpts
将其注解就可以。

* 创作者碰到的运行出错是:
Invalid maximum heep size: -Xmx4G
Error: Could not create the Java Virtual Machine.
是配发Java的运行内存过高,我的网络服务器的存储空间不足

# 改动mycat环境变量
vi /usr/local/mycat/conf/wrapper.conf

寻找
wrapper.java.additional.4=-XX:MaxDirectMemorySize=2G

wrapper.java.additional.9=-Xmx4G
wrapper.java.additional.10=-Xms2GB

将2G、4g、2GB改成512M就可以

# 将全部的真正连接点的MySQL设定为忽视表名英文大小写,不然后边会出现许多难题,只需在mysql环境变量的[mysqld]加一条
lower_case_table_names=1 

还记得重新启动
能够根据 show variables like "�se%";  查询是不是打开忽视英文大小写

忽视表名英文大小写实际上是将你一直在sql语句中的表名变为小写字母。
因此 假如你的表名一开始是英文大写的,以后才打开忽视英文大小写,那麼不管你的sql语句里的表名是英文大写還是小写字母,都是会提醒出错说找不着这一表,由于他都转为小写字母了,但你的表名是英文大写的。

假如MySQL沒有打开忽视英文大小写,在mycat中创建表的情况下,即便你的sql是小写字母的表名,在mysql真正连接点中建立的全是英文大写的表名。

# 运行 
mycat console 

# 运行取得成功后,mycat监视了8066端口号,这时能够在本地连接mycat(要对外开放8066端口号的服务器防火墙);我是在204.175.124.51这一设备上安裝的mycat
mysql -h204.175.124.51 -uroot -P8066 -p123456

这时连的是mycat而不是mysql,mysql是3306端口号。

mycat联接的默认设置客户和密码是 root、123456,其配备在/usr/local/mycat/conf/server.xml
mycat中有一个原始的库默认设置是TESTDB这一库(是一个虚似库,真正不会有那样的库),其配备在/usr/local/mycat/conf/schema.xml

这两个环境变量尤为重要 

 

mycat初了解:

如今我们要处理3个难题:
1.root/123456客户是怎么转化成的
2.TESTDB这一库和里边的表是怎么转化成的

第一个难题:Mycat中的客户怎样转化成
Mycat中的客户是在server.xml这一环境变量中加上并根据重新启动mycat服务项目转化成的。
先看来一下server.xml这一文档里边有关客户的配备以下

<user name="root" defaultAccount="true">
    <property name="password">123456</property>
    <property name="schemas">TESTDB</property>
    <property name="defaultSchema">TESTDB</property>
    <!--No MyCAT Database selected 不正确时会试着应用该schema做为schema,不设定则为null,出错 -->
    <!-- 表级 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>
    <property name="defaultSchema">TESTDB</property>
</user>
 

这儿设定了2个客户并授予她们管理权限:
客户 root 登陆密码 123456 该客户能对表TESTDB有增删实际操作
客户 user 登陆密码 user   该客户只有对TESTDB开展读实际操作

我们可以在下面再次加上客户:

<user name="hello">
    <property name="password">hello</property>
    <property name="schemas">TESTDB,db2</property>      <!-- 特定能实际操作的数据库查询,这儿能够根据分号分隔特定实际操作好几个数据库查询 -->
</user>

它是非常简单的加上mycat客户的方式。这儿是在mycat加上客户,但并沒有对MySQL加上客户。一般来说,加上客户是为了更好地管理方法schema(虚似表),每一个schema都必须在server.xml中界定(建立)一个客户来对该schema开展管理方法,这时仅有该客户能够对该schema开展实际操作。

 

第二个难题:mycat中的库和表如何转化成的虚似表是在schema.xml这一环境变量中特定,随后根据重新启动mycat而转化成的。

<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
    <!-- auto sharding by id (long) -->
    <!--splitTableNames 开启<table name 特性应用分号切分配备好几个表,即好几个表应用这一配备-->
    <table name="travelrecord,address" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/>
    <!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
        /> -->
</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>
    <!-- can have multi write hosts -->
    <writeHost host="hostM1" url="localhost:3306" user="root"
               password="123456">
    </writeHost>
    <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>

———————————–
<schema>特定了TESTDB这一虚似库,里边<table>特定TESTDB这一虚似库文件要转化成什么虚似表。这儿特定转化成 travelrecord 和 address这两个虚似表。<table>的dataNode特性表明,这两个虚似表要和什么连接点的真正物理学表开展关系。
———————————–
<dataHost>用以特定mycat要联接的Mysql的连接点信息内容,包含连接点IP,客户和登陆密码。
<heartbeat>用以隔一段时间检测所联接的MySQL连接点是不是已断开。
<writeHost>特定写连接点
<readHost>特定读连接点
————————————

<dataNode>特定分块连接点,即真正的数据库查询是哪个连接点(dataHost特性)的哪一个库(database特性)。

留意点:
虚似表和真正物理学表的表名同样。
能够在mycat登陆的手机客户端中建立真正表,其相匹配的全部真正连接点都是会建立这一表。

 

 

下边做一个小案例:
mycat下建立一个shop虚似数据库查询,该库下边建立product虚似表,相匹配该设备连接点的shop1,shop2和shop3这3个库(即Mycat和Mysql都是在一台服务器上)。product表结构以下:

create table product (
    id int primary key auto_increment,
    name varchar(255),
    price decimal(10,2)
)engine=innodb;

下边是实际操作的流程:1.改动schema.xml 

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

    <schema name="shop" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
        <!-- auto sharding by id (long) -->
        <!--splitTableNames 开启<table name 特性应用分号切分配备好几个表,即好几个表应用这一配备-->
        <table name="product" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/>
        <!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
            /> -->
    </schema>
    <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
        /> -->
    <dataNode name="dn1" dataHost="h1" database="shop1" />
    <dataNode name="dn2" dataHost="h1" database="shop2" />
    <dataNode name="dn3" dataHost="h1" database="shop3" />
    <dataHost name="h1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="hostM1" url="localhost:3306" user="root"
                   password="xxxx">
            <readHost host="hostM2" url="localhost:3306" user="root" password="xxxx"></readHost>
        </writeHost>
        <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
    </dataHost>
</mycat:schema>

界定了写连接点和读连接点,这两个连接点是同一个连接点同一个MySQL服务项目。
如果不建立读连接点<readHost>,那麼你一直在mycat中只有载入,不可以查看。
writeHost和readHost应用的客户是MySQL真正客户并非mycat的登陆客户。

2.为shop这一虚似库建立一个客户,该客户专业用于实际操作shop虚似库
在server.xml中,加上:

<user name="zbp">
    <property name="password">123456</property>
    <property name="schemas">shop</property>
</user> 

PS:已经知道server.xml界定了一个root/123456的客户,该客户专业用于实际操作TESTDB虚似库。
可是假如schema.xml中沒有界定TESTDB这一虚似库,那麼运行mycat时便会出错。

3.重新启动mycat服务项目。4.在本地连接203.195.174.151的mycat服务项目,并建立product真正物理学表。

mysql -h203.195.174.151 -uzbp -P8066 -p123456

show databases;
 ---------- 
| DATABASE |
 ---------- 
| shop     |
 ---------- 

use shop;

show tables;
 ---------------- 
| Tables in shop |
 ---------------- 
| product        |
 ---------------- 

# 这时在MySQL中都还没建立shop1,shop2,shop3这3个真正的库,可是在mycat中仍然能见到shop虚似库和product虚似表
可是假如对product虚似表查看,会出错说不会有这一表。

# 现在在mysql中建立shop1,shop2,shop3这3个库

create database shop1;
create database shop2;
create database shop3;

# 在当地mycat手机客户端的shop虚似表格中建立product表:

create table product (
    id int primary key auto_increment,
    name varchar(255),
    price decimal(10,2)
)engine=innodb;

# 这时会另外在shop1~3都建立这一product表。

如今插进一条数据信息

insert into product values (null,"A",12);   # 出错:ERROR 1064 (HY000): partition table, insert must provide ColumnList

# 意思是插进时要特定全部的字段
insert into product (`id`,`name`,`price`) values (null,"A",12);     # 出错:ERROR 1064 (HY000): columnValue:NULL Please eliminate any quote and non number within it.
# 含意时不能用null团块
insert into product (`id`,`name`,`price`) values (1,"A",12);    #插进取得成功

如今这条数据信息并不是另外插进shop1~3,只是只插入了shop1;这儿涉及到到mycat的分块标准,后边会详解。

假如想查询究竟插入了哪一个库,能够

explain insert into product (`id`,`name`,`price`) values (1,"A",12);    #来查询

==============================================

Mycat表分割标准

在上面的事例中,插进的数据信息是插进到shop1这一库。可是伴随着信息量扩大,数据信息也会插进到shop2和shop3这两个库,这要归功于在界定schema.xml的<table>标识中的rule="auto-sharding-long"这一特性。
该特性特定该product表应用auto-sharding-long(范畴承诺)这一分块标准来分块。

下边大家先看一下有什么数据信息会提到shop1,什么数据信息会提到shop2和shop3:

explain insert into product (id,name,price) values (10000000,"asdf",1000);
 ----------- ------------------------------------------------------------------------- 
| DATA_NODE | SQL                                                                     |
 ----------- ------------------------------------------------------------------------- 
| dn2       | INSERT INTO product (id, name, price) VALUES ('10000000', 'asdf', 1000) |
 ----------- ------------------------------------------------------------------------- 

explain insert into product (id,name,price) values (15000000,"asdf",1000);
 ----------- ------------------------------------------------------------------------- 
| DATA_NODE | SQL                                                                     |
 ----------- ------------------------------------------------------------------------- 
| dn3       | INSERT INTO product (id, name, price) VALUES ('15000000', 'asdf', 1000) |
 ----------- ------------------------------------------------------------------------- 

发觉当id为五百万到1000万便会插进连接点2,即shop2;当id为1000万到1500万便会插进shop3;
超出1500万便会出错。

因此 这儿是依据id的尺寸范畴来区划连接点的,在mycat选用了range系统分区的技术性。

这儿的区划标准在schema.xml的<table>标识界定虚似表的情况下就界定好啦的。

<table name="product" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/>

这儿的标准是rule="auto-sharding-long",即按范畴承诺分块(系统分区)。

而标准是在rule.xml界定的

<tableRule name="auto-sharding-long">
    <rule>
        <columns>id</columns>
        <algorithm>rang-long</algorithm>
    </rule>
</tableRule>

上边的配备意思是对id字段名开展系统分区,系统分区的优化算法是range-long
而range-long优化算法还可以在rule.xml寻找。

<function name="rang-long"
          class="io.mycat.route.function.AutoPartitionByLong">
    <property name="mapFile">autopartition-long.txt</property>
</function>

表明这一优化算法是写在 AutoPartitionByLong 这一类文档中的,这一类是写在mycat的java源代码中。

不明白java源代码没事儿,关键看mapFile地形图文档,该文件是实际的系统分区标准,在这儿是autopartition-long.txt文件,该文件在mycat的配备文件目录中。

內容以下:

# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2

意思是 系统分区字段名(id)在0~五百万内就载入第一个连接点,500玩~1000万载入第二个连接点,后边一样的含意。

因此 即便大家不容易Java,大家还可以在地形图文档中撰写标准来简易的制订自定标准。
mycat有多少中标准能够查询文本文档。
 

下一节大家将详细介绍Mycat中的一些基本要素和schema.xml/server.xml/rule.xml这三个环境变量的标识和特性的含意。

 

    关键字:

天才代写-代写联系方式