Mysql升阶之Mycat正中间件(一) mycat的安裝和基本

摘要:有一个纪录得奖工作人员的表,每一年都是有得奖新手入录到这一表格中大家以時间为层面开展表的分割,方式以下:t_archieve_2016t_archieve_2017t_archieve_2018...假如要想开展增加,大家要获...

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

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-03-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.
重要是第一句,说虚似机鉴别不上AggressiveOpts主要参数。
第二句说起动不上Java虚似机。

# 改动mycat配备文档
vi /usr/local/mycat/conf/wrapper.conf

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

* 创作者碰到的起动出错是:
Invalid maximum heep size: -Xmx2G
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=-Xmx2G
wrapper.java.additional.10=-Xms2GB

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

# 将全部的真正连接点的MySQL设定为忽视表名尺寸写,不然后边会出现许多难题,只需在mysql配备文档的[mysqld]加一条
lower_case_table_names=1 

还记得重新启动
能够根据 show variables like %case%  查询是不是打开忽视尺寸写

忽视表名尺寸写实际上是将你一直在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

这2个配备文档相当关键 

 

mycat初了解:

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


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

 user name="root" ount="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这2个虚似表。 table 的dataNode特性表明,这2个虚似表要和什么连接点的真正物理学表开展关系。
-----------------------------------
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="" 
     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 

界定了写连接点和读连接点,这2个连接点是同一个连接点同一个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这2个库,这要归因于在界定schema.xml的 table 标识中的rule= auto-sharding-long 这一特性。
该特性特定该product表应用auto-sharding-long(范畴承诺)这一分块标准来分块。

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

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

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

因此这儿是依据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"
          
    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这三个配备文档的标识和特性的含意。

张柏沛IT技术性blog > Mysql升阶之Mycat正中间件(一) mycat的安裝和基本应用

点一下拷贝转截该一篇文章



联系我们

全国服务热线:4000-399-000 公司邮箱:343111187@qq.com

  工作日 9:00-18:00

关注我们

官网公众号

官网公众号

Copyright?2020 广州凡科互联网科技股份有限公司 版权所有 粤ICP备10235580号 客服热线 18720358503

技术支持:自助建站