300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > mycat分库分表与读写分离

mycat分库分表与读写分离

时间:2023-09-19 13:15:56

相关推荐

mycat分库分表与读写分离

mycat分库分表与读写分离

Dockerfile搭建mycat

1.创建mycat的配置文件

#新建目录mkdir /docker/mycat#切换目录cd /docker/mycat#下载mycat release1.6.7.6到当前目录wget .cn/1.6.7.6/2026013625/Mycat-server-1.6.7.6-release-2026013625-linux.tar.gzmv Mycat-server-1.6.7.6-release-2026013625-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

1 . 1配置文件

调整/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 /AlphaYu/Adnc/master/doc/mycat/Dockerfile#如果下载失败,请手动下载并上传到/root/data/mycat目录,文件地址如下#/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/confdocker cp mycat:/usr/local/mycat/logs /docker/mycat/logs

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="orders" database="orders" />

3.配置数据源

<!--Name:数据源名称 maxCon:最大连接数 minCon:最小连接数 Balance:负载均衡类型,有0,1,2,3四种类型 writeType:读写类型:有0,1两种 dbType:数据库类型--><dataHost name="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>

完整测试

1 . 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</property></user></mycat:server>

2 . schema.xml

配置逻辑库与真实库的匹配规则,

指定 sx_user 与 sx_order的数据分别分配到不同的 dataNode的数据库中去,

sx_order则是分配到 dataNode的数据库中,并且分配到10张表中去

<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"><!-- 配置2个逻辑库,分别是sx_user 与 sx_order --><schema name="sx_user" checkSQLschema="true" sqlMaxLimit="100"><!-- 设置库中的表,其中 name="user_01" 是一个虚拟表名,有虚拟表名转发sql语句,这张表对应 dataNode 设置的两个节点 , 数据会通过 rule 规则分配到 dataNode 中的表中 --><!--sharding-by-murmur : 一致性hash , auto-sharding-long : 范围求模分片--><table name="user_01" primaryKey= "id" dataNode="dn_user_1,dn_user_2" rule="sharding-by-murmur" /> <!-- 一致性hash--><table name="user_02" primaryKey= "id" dataNode="dn_user_1,dn_user_2" rule="sharding-by-murmur" /> <!-- 一致性hash--></schema><schema name="sx_order" checkSQLschema="false" sqlMaxLimit="100"><!-- 设置库中的表, 这张表被 subTables 设置拆分成 10 张表 数据会根据rule 规则分配到这些表中--><!-- 在rule.xml中配置,根据id轮循环 --><table name="orders" primaryKey="id" subTables="orders_$0-9" dataNode="dn_orders" rule="mod-long" /><table name="order_items" primaryKey="id" subTables="order_items_$0-9" dataNode="dn_orders" rule="mod-long" /><!-- 在rule.xml中自定义配置,根据user_id轮循分表 --><table name="user_order_index" primaryKey="user_id" subTables="user_order_index_$0-9" dataNode="dn_orders" rule="mod-long-user_id" /></schema><!-- 逻辑库对应的真实数据库,database 为真实的数据库名称--><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_orders" dataHost="dh_orders" database="test_order" /><!-- 真实数据库地址:--><!--真实数据库所在的服务器地址,这里配置了1主2从。主服务器(hostM1)宕机会自动切换到(hostS1) --><!--192.168.238.111:3309(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.238.111:3309" user="root" password="root" ><readHost host="hostS2" url="192.168.238.111:3309" user="root" password="root" /></writeHost><writeHost host="hostS1" url="192.168.238.111:3309" user="root" password="root" /></dataHost><!--192.168.238.134: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.238.134:3306" user="root" password="root" ><readHost host="hostS2" url="192.168.238.134:3306" user="root" password="root" /></writeHost><writeHost host="hostS1" url="192.168.238.134:3306" user="root" password="root" /></dataHost><!--192.168.238.111:3309(order)--><dataHost name="dh_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.238.111:3309" user="root" password="root"><readHost host="hostS2" url="192.168.238.111:3309" user="root" password="root" /></writeHost></dataHost></mycat:schema>

2 . 1 分析:

2 . 1 . 2 分库分表

根据节点把数据分配到不同服务器中

2 . 2 . 2 单库分表

把一张表切割成10张表

匪夷所思的问题:

解决方案:点击新建查询的时候,就会变成设置的三个逻辑库

2 . 2 . 3 异构索引表

数据异构表的作用,主要是把相同数据的信息,统一切分到同一张表中,比如根据用户user_id拆分,那么以后这个用户产生的订单都会在同一张表中,那么在根据用户user_id查询数据的时候,就可以解决数据分散的问题,也解决了数据分页的问题。

如果不使用数据异构表,比如在根据用户id来查询数据的时候,则会使用用户的id在10张表中循环查询,如果使用了数据异构表,则可能只需要在一张表张查询,性能快了10倍。

如果查询的数据过于分散,分页问题无法解决的时候,这时候只能使用es来进行解决,因为es的分片查询是天然的分布式数据查询,在把查询到的id去表中获取到详细的数据信息。

2 . 2 . 4 join联表问题

注意:数据异构表只是解决了搜索分页的问题,但是join的问题没有得到解决,join只能使用全局表来解决,或者使用子查询的方式来解决,子查询的方式解决的方式会比较简单粗暴

3 . rule.xml

<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><function name="mod-long" class="io.mycat.route.function.PartitionByMod"><!-- 10表示定义了10张表,根据10进行hahs运行 --><property name="count">10</property></function>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。