0
点赞
收藏
分享

微信扫一扫

mycat分库分表与读写分离

cwq聖泉寒江2020 2022-04-20 阅读 38
mysql

mycat分库分表与读写分离

Dockerfile搭建mycat

1.创建mycat的配置文件
#新建目录
mkdir /docker/mycat

#切换目录
cd /docker/mycat

#下载mycat release1.6.7.6到当前目录
wget http://dl.mycat.org.cn/1.6.7.6/20201126013625/Mycat-server-1.6.7.6-release-20201126013625-linux.tar.gz

mv Mycat-server-1.6.7.6-release-20201126013625-linux.tar.gz mycat1.6.7.6.tar.gz

#解压conf目录到当前目录,因为使用docker直接挂载conf目录会报错,mycat启动时需要依赖conf目录中的文件。
tar -zxvf mycat1.6.7.6.tar.gz -C /docker/ mycat/conf

配置文件

调整/home/winner/mycat/conf目录中的server.xmlschema.xml 两个核心配置文件

  • server.xml 请参考这里
  • schema.xml 请参考这里
  • server.xml 关键节点介绍
 <!-- mycat的账号 -->
  <user name="root" defaultAccount="true"> 
    <!-- 密码 -->
    <property name="password">alpha.mycat</property>  
    <!-- 该账号可以访问的逻辑库,对应schema.xml文件的schema节点的name-->
    <property name="schemas">adnc_usr,adnc_maint,adnc_cus</property> 
  </user> 
  • schema.xml 关键节点介绍
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!-- 配置3个逻辑库-->
    <schema name="adnc_usr" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn_usr"></schema>
    <schema name="adnc_maint" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn_maint"></schema>
    <schema name="adnc_cus" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn_cus"></schema>

    <!-- 逻辑库对应的真实数据库-->
    <dataNode name="dn_usr" dataHost="dh_adnc" database="adnc_usr" />
    <dataNode name="dn_maint" dataHost="dh_adnc" database="adnc_maint" />
    <dataNode name="dn_cus" dataHost="dh_adnc" database="adnc_cus" />

    <!--真实数据库所在的服务器地址,这里配置了1主2从。主服务器(hostM1)宕机会自动切换到(hostS1) -->
    <dataHost name="dh_adnc" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="172.20.0.11:3306" user="root" password="alpha.abc" >
            <readHost host="hostS2" url="172.20.0.13:3306" user="root" password="alpha.abc" />
        </writeHost>
        <writeHost host="hostS1" url="172.20.0.12:3306" user="root" password="alpha.abc" />
    </dataHost>

</mycat:schema>
2.下载dockerfile,由于mycat官方并没有提供docker镜像,我们需要自己编写dockerfile文件打包镜像
#下载dockerfile文件到当前目录
wget https://raw.githubusercontent.com/AlphaYu/Adnc/master/doc/mycat/Dockerfile

#如果下载失败,请手动下载并上传到/root/data/mycat目录,文件地址如下
#https://github.com/AlphaYu/Adnc/blob/master/doc/mycat/Dockerfile
3.创建mycat镜像与容器
docker run --privileged=true -p 8066:8066 -p 9066:9066 --name mycat \
-v /docker/mycat/conf:/usr/local/mycat/conf \
-v /docker/mycat/logs:/usr/local/mycat/logs \
--restart=always -d  mycat:1.6.7.6

Docker pull 安装mycat

1.拉取docker镜像(注:1.6.7.5以上才支持单库分表的功能)

docker pull manondidi/mycat

2.简单安装mycat容器

docker run --privileged=true -p 8066:8066 --name mycat manondidi/mycat:latest

3.从docker容器中复制conf文件到宿主机环境上

docker cp mycat:/usr/local/mycat/conf /docker/mycat/conf

4.删除mycat容器

docker rm -f mycat

5.重新安装容器

docker run --privileged=true -p 8066:8066 -p 9066:9066 --name mycat \
-v /docker/mycat/conf:/usr/local/mycat/conf \
-v /docker/mycat/logs:/usr/local/mycat/logs \
--restart=always -d  manondidi/mycat

单库分表规则

1.配置分表规则

<!--
Name:表名称
primaryKey:主键
subTables:分片表的表名设置
dataNode:数据节点
Rule:分片规则-->
<table name="orders" primaryKey="id" subTables="orders_$0-63" dataNode="orders" rule="mod-long" />
<table name="order_items" primaryKey="id" subTables="order_items_$0-63" dataNode="orders" rule="mod_long" />
<table name="user_order_index" primaryKey="user_id" subTables="user_order_index_$0-63"
dataNode="orders" rule="mod-long-user_id" />

2.配置节点

<!--
Name:节点名称
dataHost:数据源名称
Database:真实的数据库名称-->
<dataNode name="orders" dataHost="lmrs_orders" database="orders" />

3.配置数据源

<!--
Name:数据源名称 
maxCon:最大连接数 
minCon:最小连接数 
Balance:负载均衡类型,有0,1,2,3四种类型 
writeType:读写类型:有0,1两种 
dbType:数据库类型-->
<dataHost name="lmrs_orders" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql"
dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.63.123:3306" user="root" password="root">
<readHost host="hostS2" url="192.168.63.123:3307" user="root" password="root" />
<readHost host="hostS3" url="192.168.63.123:3308" user="root" password="root" />
</writeHost>
</dataHost>

4.配置-规则

<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">64</property>
</function>

<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>

<tableRule name="mod-long-user_id">
<rule>
<columns>user_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>

测试案例一

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="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
        <property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->
        <property name="sequnceHandlerType">2</property>
        <property name="processorBufferPoolType">0</property>
        <property name="handleDistributedTransactions">0</property>
        <property name="useOffHeapForMerge">1</property>
        <property name="memoryPageSize">1m</property>
        <property name="spillsFileBufferSize">1k</property>
        <property name="useStreamOutput">0</property>
        <property name="systemReserveMemorySize">384m</property>
        <property name="useZKSwitch">true</property>
    </system>
    <!-- mycat的账号 -->
    <user name="root" defaultAccount="true">
        <!-- 密码 -->
        <property name="password">123456</property>
        <!-- 该账号可以访问的逻辑库,对应schema.xml文件的schema节点的name-->
        <property name="schemas">sx_user,sx_order,lm_order</property>
    </user>
</mycat:server>

schema.xml

配置逻辑库与真实库的匹配规则,这里指定 sx_user 与 sx_order的数据分别分配到不同的 dataNode的数据库中去,lm_order则是直接在当前库中分配64张表,分别把数据分配到不同的表中去

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

    <!-- 配置2个逻辑库-->
    <schema name="sx_user" checkSQLschema="true" sqlMaxLimit="100">
        <table name="user01" primaryKey= "id" dataNode="dn_user_1,dn_user_2" rule="sharding-by-murmur" />   <!-- 一致性hash-->
        <table name="user02" primaryKey= "id" dataNode="dn_user_1,dn_user_2" rule="sharding-by-murmur" />   <!-- 一致性hash-->
    </schema>

    <schema name="sx_order" checkSQLschema="true" sqlMaxLimit="100">
      <table name="order01" dataNode="dn_order_1,dn_order_2" rule="auto-sharding-long" />   	<!-- 范围求模分片-->
      <table name="order02" dataNode="dn_order_1,dn_order_2" rule="auto-sharding-long" />   	<!-- 范围求模分片-->
      <table name="order03" dataNode="dn_order_1,dn_order_2" rule="auto-sharding-long" />   	<!-- 范围求模分片-->
    </schema>

    <schema name="lm_order" checkSQLschema="true" sqlMaxLimit="100">
        <table name="lmrs_orders" primaryKey="id" subTables="lmrs_orders_$0-63" dataNode="orders" rule="mod-long" />
        <table name="lmrs_order_items" primaryKey="id" subTables="lmrs_order_items_$0-63" dataNode="orders" rule="mod-long" />
        <table name="lmrs_user_order_index" primaryKey="user_id" subTables="lmrs_user_order_index_$0-63" dataNode="orders" rule="mod-long-user_id" />
    </schema>

    <!-- 逻辑库对应的真实数据库-->
    <dataNode name="dn_user_1" dataHost="dh_user_1" database="user01" />
    <dataNode name="dn_user_2" dataHost="dh_user_2" database="user02" />

    <dataNode name="dn_order_1" dataHost="dh_order_1" database="order01" />
    <dataNode name="dn_order_2" dataHost="dh_order_2" database="order02" />

    <dataNode name="orders" dataHost="lmrs_orders" database="test_order" />

    <!-- 真实数据库地址:-->
    <!--192.168.48.129:3306(user01)-->
    <dataHost name="dh_user_1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="192.168.48.129:3306" user="root" password="root" >
          <readHost host="hostS2" url="192.168.48.129:3306" user="root" password="root"/>
        </writeHost>
        <writeHost host="hostS1" url="192.168.48.129:3306" user="root" password="root" />
    </dataHost>
    <!--192.168.48.132:3306(user02)-->
    <dataHost name="dh_user_2" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="192.168.48.132:3306" user="root" password="root" >
          <readHost host="hostS2" url="192.168.48.132:3306" user="root" password="root"/>
        </writeHost>
        <writeHost host="hostS1" url="192.168.48.132:3306" user="root" password="root" />
    </dataHost>


<readHost host="hostS2" url="192.168.48.129:3306" user="root" password="root" />
        </writeHost>
        <writeHost host="hostS1" url="192.168.48.129:3306" user="root" password="root" />
    </dataHost>
    <!--192.168.48.132:3306(order02)-->
    <dataHost name="dh_order_2" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="192.168.48.132:3306" user="root" password="root" >
          <readHost host="hostS2" url="192.168.48.132:3306" user="root" password="root"/>
        </writeHost>
        <writeHost host="hostS1" url="192.168.48.132:3306" user="root" password="root" />
    </dataHost>


<!--192.168.48.129:3306(test_order)-->
    <dataHost name="lmrs_orders" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql"
              dbDriver="native" switchType="1" slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="192.168.48.129:3306" user="root" password="root">
          <readHost host="hostS2" url="192.168.48.132:3306" user="root" password="root"/>
        </writeHost>
    </dataHost>


</mycat:schema>

 

rule.xml

<tableRule name="mod-long-user_id">
<rule>
<columns>user_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
举报

相关推荐

0 条评论