mycat简单安装和配置

前言

说明

最近从同事那边了解到一些数据库主从读写分离,分片的工具。叫mycat。然后就写下这篇入门博客简单的说一下和mycat有关的内容吧。

准备

mysql5.7。安装2个,做好主从配置。如果不会可以参照我之前的文章docker安装mysql以及主从配置
mycat下载。从mycat官网,上面有本mycat权威指南挺好用的

1.mycat的简短介绍

我使用mycat的原因是它对于代码的没有侵入,相比大家也都看过java的一些主从分离和分片的方案,就是配置多数据源,到用到主库的时候,就调用主库的连接。需要用到从库的时候,就调用从库的连接。
但是使用mycat之后,他相当于给数据库外面再做一层。你每次调用sql语句,等于先到mycat中,mycat再分发到需要操作的数据库中。
例如,一个表根据id分成了10个表。但是实际上在程序员看来,需要写的代码并不需要变化。还是操作一个表。只不过是配置好的mycat的逻辑表,它会给你分发到对应物理表中。

2.mycat的配置说明

mycat的主要配置其实就在于3(或者说4)个文件的配置
分别是:
server.xml
说明:mycat最基本的配置,配置连接的数据库和用户
schema.xml
说明:mycat中逻辑表的具体配置
rule.xml
说明:
mycat中逻辑表需要分片的分片规则的配置文件
以及一个具体的分片规则txt文件。我这边命名为chen.txt

3.表格建立

注意开启主从后这些操作只要在主库进行就可以,从库会自动同步
创一张不需要分片的数据库test,然后创一张表做例子

CREATE TABLE `test`.`test1`( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(20), PRIMARY KEY (`id`) );

然后创建需要分片的表的数据库,创建10个数据库,分别是db1-db10。做分片表的数据库位置。

4.server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <system>
        <property name="defaultSqlParser">druidparser</property>
        <!--需要配置的端口号-->
        <property name="serverPort">8066</property>
    </system>
    <user name="master">
    <!--name就是登录名,password就是密码,schemas就是对应的schema.xml里面的逻辑库,就是schemal标签里面的name,注意这个name要和数据库中的库名相同,readOnly就是开启只读-->
        <property name="password">mycat</property>
        <property name="schemas">test</property>
    </user>
    <user name="read">
        <property name="password">mycat</property>
        <property name="schemas">test</property>
        <property name="readOnly">true</property>
    </user>
</mycat:server>

5.schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="test">
        <!--不需要分片的表直接用test处理-->
        <!--注意,name要和逻辑库中的名字相同,dadaNode对应配置,schema name就是service配置文件中需要对应的用户所操作的数据库-->
        <!--需要分片的表的配置-->
            <table name="test2" dataNode="dn$1-10" rule="chen" />
        </schema>
        <dataNode name="test" dataHost="dh1" database="test"></dataNode>
        <!--需要配置需要分片的表-->
        <dataNode name="dn1" dataHost="dh1" database="db1" />
        <dataNode name="dn2" dataHost="dh1" database="db2" />
        <dataNode name="dn3" dataHost="dh1" database="db3" />
        <dataNode name="dn4" dataHost="dh1" database="db4" />
        <dataNode name="dn5" dataHost="dh1" database="db5" />
        <dataNode name="dn6" dataHost="dh1" database="db6" />
        <dataNode name="dn7" dataHost="dh1" database="db7" />
        <dataNode name="dn8" dataHost="dh1" database="db8" />
        <dataNode name="dn9" dataHost="dh1" database="db9" />
        <dataNode name="dn10" dataHost="dh1" database="db10" />
        <!--dataHost就是具体要连接的数据库的,dataBase就是具体的数据库名-->
        <dataHost name="dh1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!--用于验证心跳,这个是mysql主库的配置-->
                <writeHost host="hostM1" url="ip:3306" user="root" password="password">
                <!--具体物理库mysql从库的配置-->
                <readHost host="hostS1" url="ip:3307" user="root" password="password">
                </readHost>
                </writeHost>
        </dataHost>
</mycat:schema>

6.rule.xml

添加

    <tableRule name="chen">
        <rule>
            <columns>id</columns>
            <algorithm>chen-test</algorithm>
        </rule>
    </tableRule>
    <!--schema.xml中配置的rule="chen"所对应的规则,规则对应主键,列名为id-->
    <function name="chen-test"
        class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">chen.txt</property>
        <!--在conf中需要添加的txt规则文件-->
    </function>

7.chen.txt

0-10=0
10-20=1
20-30=2
30-40=3
40-50=4
50-60=5
60-70=6
70-80=7
80-90=8
90-100=9

表示主键id为0-10的在db1,11-20的在表bd2操作

8.开启服务

win系统,打开bin/startup_nowrap.bat这个文件,提示mycat server startup successfully。
表示启动成功

9.连接mycat,测试数据库操作

打开数据库工具,我用的是sqlyog,配置是locathost/mycat/mycat/8066
然后就可以看到之前创建好的test库中的test表了,然后对test进行相应操作就可以
然后我们需要创建需要分片的表

CREATE TABLE `test2` ( `id` BIGINT(20) NOT NULL, `name` VARCHAR(100) DEFAULT NULL, `date` DATE DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4; 
INSERT INTO test2 (`id`, `name`, `date`) VALUES ('10', '2', '2018-05-28')#插入测试数据
SELECT * FROM test2

创建test2表的时候可以看到,db1-10中,都创建了表test2
然后通过sqlyog连接实际的数据库,发现如果插入对应的数据的时候,1-10会被mycat插入到db1中,11-20会被插入到db2中,以此类推
其次就是查询。mycat会自动把分片表中的数据整合在一起显示出来。这样mycat的配置就算完毕了。
然后在读写分离这边。可以试着关闭主库,进行读操作(select),发现操作都去了从库。关闭从库,进行写操作(delete,update,inser),发现操作都去了主库。

关于mycat-eye

只需要配置安装好一个zookeeper,已经在网页中对数据库做好相应的连接配置即可。非常简单,就不多叙述了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章