MySQL Mycat数据库中间件

MyCat简单使用与配置

2017-04-10  本文已影响8261人  iEvans

基本配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <!-- 定义一个MyCat的模式,逻辑数据库名称TestDB -->
        <!-- “checkSQLschema”:描述的是当前的连接是否需要检测数据库的模式 -->
        <!-- “sqlMaxLimit”:表示返回的最大的数据量的行数 -->
        <!-- “dataNode="dn1"”:该操作使用的数据节点是dn1的逻辑名称 -->
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
        <!-- 定义数据的操作节点 -->
        <!-- “dataHost="localhost1"”:定义数据节点的逻辑名称 -->
        <!-- “database="mldn"”:定义数据节点要使用的数据库名称 -->
        <dataNode name="dn1" dataHost="localhost1" database="mldn" />
        <!-- 定义数据节点,包括了各种逻辑项的配置 -->
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
            <!-- 配置真实MySQL与MyCat的心跳 -->
            <heartbeat>select user()</heartbeat>
            <!-- 配置真实的MySQL的连接路径 -->
            <writeHost host="hostM1" url="192.168.1.128:3306" user="root" password="123456"></writeHost>
        </dataHost>
</mycat:schema>

读写分离

一. MycSQL主从配置

log-bin=mysql-bin-1 : 表示配置同步的bin的文件名称,不同的主从关系组,名称不同
server_id=196 : 表示MySQL服务的编号,这个编号一般取IP的最后一位,也可自定义

其中
File(tid_set) : 表示主机名称(mysql-bin-1.000001)
Position : 表示同步的节点位置

GRANT REPLICCATION SLAVE,REPLICATION CLIENT ON *.* TO 'sync_user'@'192.168.1.%' IDENTIFIED BY '123456';
flush privileges;

log-bin=mysql-bin-1 : 表示配置同步的bin的文件名称,不同的主从关系组,名称不同
server_id=168 : 表示MySQL服务的编号,这个编号一般取IP的最后一位,也可自定义

  • 若此时已经启动了从主机,必须先停止:stop slave;
change master to master_host='192.168.1.128',master_user='sync_user',master_password='123456',master_log_file='mysql-bin-1.000001',master_log_pos=435 ;

master_host表示mast的主机ip
master_user表示可同步的账号
master_password表示同步账号的密码
master_log_file表示MASTERshow master stats;查看时的File(tid_set)
master_log_pos表示MASTERshow master stats;查看时的Position

Slave_IO_Running:YES
Slave_SQL_Running:Yes
二. MyCat读写分离配置
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <!-- 定义一个MyCat的模式,逻辑数据库名称TestDB -->
        <!-- “checkSQLschema”:描述的是当前的连接是否需要检测数据库的模式 -->
        <!-- “sqlMaxLimit”:表示返回的最大的数据量的行数 -->
        <!-- “dataNode="dn1"”:该操作使用的数据节点是dn1的逻辑名称 -->
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
        <!-- 定义个数据的操作节点,以后这个节点会进行一些库表分离使用 -->
        <!-- “dataHost="localhost1"”:定义数据节点的逻辑名称 -->
        <!-- “database="test"”:定义数据节点要使用的数据库名称 -->
        <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">
            <!-- 配置真实MySQL与MyCat的心跳 -->
            <heartbeat>select user()</heartbeat>
            <!-- 配置真实的MySQL的连接路径 -->
            <writeHost host="hostMaster" url="192.168.1.196:3306" user="root" password="123456">
                <readHost host="hostSlave" url="192.168.1.168:3306" user="root" password="123456"/>
            </writeHost>
        </dataHost>
</mycat:schema>

垂直分库

垂直分库实际上就是进行多表分库管理

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="TESTDB1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
        <schema name="TESTDB2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"/>
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <dataNode name="dn2" dataHost="localhost2" database="db2" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host1" url="192.168.1.199:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host2" url="192.168.1.166:3306" user="root" password="123456"/>
        </dataHost>
</mycat:schema>
<property name="schemas">TESTDB1,TESTDB2</property>

全局表

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
                <table name="dict" primaryKey="did" type="global" dataNode="dn1,dn2"/>
        </schema>
        <schema name="TESTDB1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
        <schema name="TESTDB2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"/>
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <dataNode name="dn2" dataHost="localhost2" database="db2" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host1" url="192.168.1.199:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host2" url="192.168.1.166:3306" user="root" password="123456"/>
        </dataHost>
</mycat:schema>
<property name="schemas">TESTDB1,TESTDB2,TESTDB</property>

水平分库

  • 求模分库:mod-long
<tableRule name="my-mod-long">
        <rule>
                <columns>id</columns>
                <algorithm>mod-long</algorithm>
        </rule>
</tableRule>
<function name="my-mod-long" class="io.mycat.route.function.PartitionByMod">
        <property name="count">3</property><!--求模取余的数-->
</function>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
                <table name="data" primaryKey="id" dataNode="dn1,dn2,dn3" rule="my-mod-long"/>
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <dataNode name="dn2" dataHost="localhost2" database="db2" />
        <dataNode name="dn3" dataHost="localhost3" database="db3" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host1" url="192.168.1.199:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host2" url="192.168.1.166:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost3" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host3" url="192.168.1.176:3306" user="root" password="123456"/>
        </dataHost>
</mycat:schema>
<property name="schemas">TESTDB</property>
  • 序列的配置,在usr/local/mycat/conf/sequence_conf.properties文件中
  • 还需要在server.xml文件中配置
  • <property name="sequenceHandlerType">0</property>
  • 在SQL中使用next value for MYCATSEQ_GLOBAL表示序列增长
  • INSERT INTO data (id,title) VALUES (next value for MYCATSEQ_GLOBAL,@@hostname);
<tableRule name="my-auto-sharding-long">
        <rule>
                <columns>id</columns>
                <algorithm>my-auto-sharding-long</algorithm>
        </rule>
</tableRule>
<function name="my-auto-sharding-long" class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">partition-long.txt</property><!--范围规则文件-->
</function>
 - 此时需要定义一个范围分库的规则问津`partition-long.txt`,并存放在`conf`目录中`vim /usr/local/mycat/conf/partition-long.txt`
 - partition-long.txt

根据数据编号划分
0-10000=0
10001-20000=1
20001-30000=2

 - 修改`schema.xml`匹配新的分片规则
<table name="data" primaryKey="id" dataNode="dn1,dn2,dn3" rule="my-auto-sharding-long"/>
<tableRule name="my-by-intfile">
        <rule>
                <columns>title</columns>
                <algorithm>my-hash-int</algorithm>
        </rule>
</tableRule>
<function name="my-hash-int" class="io.mycat.route.function.PartitionByFileMap">
                < property name="type">1</property><!--0表示数字型分片,1表示字符串分片-->
        <property name="mapFile">partition-hash-int.txt</property><!--Hash规则文件-->
</function>
- `schema.xml`配置
<table name="data" primaryKey="title" dataNode="dn1,dn2,dn3" rule="my-by-intfile"/>
<tableRule name="my-by-month">
        <rule>
                <columns>saledate</columns>
                <algorithm>my-partbymonth</algorithm>
        </rule>
</tableRule>
<function name="my-partbymonth" class="io.mycat.route.function.PartitionByMonth">
                < property name="dateFormat">yyyy-MM-dd</property>
        <property name="sBeginDate">2017-01-01</property>
</function>
- `schema.xml`配置
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
                <!--使用$表示通配符-->
                <table name="data" primaryKey="id" dataNode="dn$1-12" rule="my-by-month"/>
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <dataNode name="dn2" dataHost="localhost2" database="db2" />
        <dataNode name="dn3" dataHost="localhost3" database="db3" />
        <dataNode name="dn4" dataHost="localhost4" database="db4" />
        <dataNode name="dn5" dataHost="localhost5" database="db5" />
        <dataNode name="dn6" dataHost="localhost6" database="db6" />
        <dataNode name="dn7" dataHost="localhost7" database="db7" />
        <dataNode name="dn8" dataHost="localhost8" database="db8" />
        <dataNode name="dn9" dataHost="localhost9" database="db9" />
        <dataNode name="dn10" dataHost="localhost10" database="db10" />
        <dataNode name="dn11" dataHost="localhost11" database="db11" />
        <dataNode name="dn12" dataHost="localhost12" database="db12" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host1" url="192.168.1.166:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host2" url="192.168.1.199:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost3" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host3" url="192.168.1.116:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost4" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host4" url="192.168.1.150:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost5" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host5" url="192.168.1.152:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost6" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host6" url="192.168.1.177:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost7" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host7" url="192.168.1.136:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost8" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host8" url="192.168.1.153:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost9" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host9" url="192.168.1.159:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost10" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host10" url="192.168.1.176:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost11" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host11" url="192.168.1.156:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost12" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host12" url="192.168.1.136:3306" user="root" password="123456"/>
        </dataHost>
</mycat:schema>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
                <!--此处表示父表与子表的相互关联-->
                <table name="data" primaryKey="id" dataNode="dn$1-3" rule="my-mod-long">
                        <childTable name="data_details" joinKey="id" primaryKey="ddid" parentKey="id"/>
                </table>
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <dataNode name="dn2" dataHost="localhost2" database="db2" />
        <dataNode name="dn3" dataHost="localhost3" database="db3" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host1" url="192.168.122.166:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host2" url="192.168.122.199:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost3" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host3" url="192.168.122.198:3306" user="root" password="123456"/>
        </dataHost>
</mycat:schema>
屏幕快照 2017-04-06 13.55.24.png
屏幕快照 2017-04-06 13.56.24.png
屏幕快照 2017-04-06 13.56.29.png

- 官方案例分析:

屏幕快照 2017-04-06 13.57.36.png
屏幕快照 2017-04-06 13.57.41.png
屏幕快照 2017-04-06 13.57.45.png
屏幕快照 2017-04-06 13.57.50.png
屏幕快照 2017-04-06 13.57.54.png
屏幕快照 2017-04-06 13.58.00.png
上一篇 下一篇

猜你喜欢

热点阅读