场景: 一个数据库有n张表,其中三张数据量巨多,现在想把这三张表分到多个库中.
根据某个字段的值,来判断应该插入到那个库中
文章目录
建库
db1:存放所有的表
db2:存放数据量巨多的三张表(假设为tb1,tb2,tb3),其他的表不需要新建
db3: tb1,tb2,tb3
…: tb1,tb2,tb3
分你觉得合适数量的库,就建多少就行
最后配置完成后数据存放逻辑大概是这么个样子:
三张表按照你传入的字段插入指定的数据库中
其他的表都走db1数据库.
涉及到三张表的增删改查都需要传入一开始说的那个字段.
配置Mycat
- Mycat版本号:1.6-RELEASE
- MySQL版本号: 5.7.24-log MySQL Community Server (GPL)
- mycat安装略
配置schema.xml
# schema标签,指定逻辑库,name是逻辑库库名,可以任意填写,主要是用来给程序进行连接的数据库.sqlMaxLimit:最大查询数据
<schema name="lq_test" checkSQLschema="false" sqlMaxLimit="100">
# 逻辑表:name就是逻辑表名,通数据库是一个道理.但是要和物理库的表名对应;
# dataNode配置的是节点名,即这张表的操作去哪个数据库操作.dn1节点配置的是一个物理库
<table name="tb4" dataNode="dn1"></table>
# 同上,所用通用的表,只需要配置一个节点即可
<table name="tb5" dataNode="dn1"></table>
# 这三张表是需要进行分库的,所以我们配置了多个节点,用于处理这三张表.rule后面是处理规则,即去哪个数据库处理这次操作
# 就是我们有很多个库都有这三张表,那么我们应该去哪个库去处理关于这三张表的请求呢?就是这个rule进行配置
#autoIncrement是配置全局变量用,自增,primaryKey指定主键.因为我们分库了,不配置全局主键的话,会造成分库之间的表会出现相同的主键.其实我觉得也没有什么影响.
<table name="tb1" dataNode="dn1,dn2,dn3,dn4,dn5" rule="sharding-by-intfile" autoIncrement="true" primaryKey="id"></table>
<table name="tb2" dataNode="dn1,dn2,dn3,dn4,dn5" rule="sharding-by-intfile" autoIncrement="true" primaryKey="id"></table>
<table name="tb3" dataNode="dn1,dn2,dn3,dn4,dn5" rule="sharding-by-intfile" autoIncrement="true" primaryKey="id"></table>
</schema>
# name就是节点名,dataHost:配置的是数据库连接,dataBase指定数据库
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataNode name="dn4" dataHost="localhost1" database="db4" />
<dataNode name="dn5" dataHost="localhost1" database="db5" />
# 这一堆属性,百度百度吧....看文档也行
<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配置的是写的链接.user数据库用户名,password:密码
<writeHost host="hostM1" url="192.168.0.1:3306" user="backup"
password="bd147258">
<!-- can have multi read hosts -->
# readHost是读的链接.同上这个位置其实可以配置主从读写分离
<readHost host="hostS2" url="192.168.0.2" user="backup" password="bd147258" />
</writeHost>
</dataHost>
配置server.xml
# 最下面配置一个User标签即可,这个标签是用来链接mycat生成的逻辑库.与物理库没有实际关系.user -name配置用户,里边属性标签第一个是密码,第二个是逻辑库的名字.即我们在schema里指定的逻辑库
<user name="backup">
<property name="password">bd147258</property>
<property name="schemas">lq_test</property>
</user>
配置rule.xml
# 我们当时指定的是这个规则.这个规则最后的配置是按照枚举进行配置的,即给我一个属性值,我一一匹配,看看属于哪个,就去哪个库里面执行.
# columns是指定的字段.这个字段记得在sql里面传递过来,algorithm指定规则实现
<tableRule name="sharding-by-intfile">
<rule>
<columns>qybh</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
# 规则实现,与上边关联
<function name="hash-int"
class="io.mycat.route.function.PartitionByFileMap">
# 这里有个文件,该文件位于此文件同级目录下.这个文件配置枚举对应的值
<property name="mapFile">partition-hash-int.txt</property><!-- 枚举规则,字段值:节点n(从0开始) -->
<property name="type">1</property> <!-- 字段类型:0 Integer 1:String -->
<property name="defaultNode">0</property> <!-- 配置默认节点:位于文件中 -->
</function>
配置枚举文件
这个配置文件的意思是:
先解释一下0,1,2,3,4的意思.
0代表节点1,1代表节点2,依次类推.即dataNode配置的节点
前排的值,即为字段值:我们在枚举规则设置的那个字段的值,
如果为db1就去节点0,也就是我们前边配置的db1数据库
剩下的以此类推
最后是DEFAULT_NODE.这个节点的意思是如果字段值前边都匹配不上,就去0,也就是我们的节点1里面操作.
db1=0
db2=1
db3=2
db4=3
db5=4
DEFAULT_NODE=0
本地文件配置全局主键
配置全局主键有很多的方式,我只用了这一种.
修改server.xml
有一个地方需要修改
<property name="sequnceHandlerType">0</property> <!-- 全局主键:使用本地文件模式 -->
修改sequence_conf.properties
配置三张表的全局主键.
TB1,TB2,TB3.大写.配置三张表
HISIDS不知道干什么的
MAXID最大ID.反正我是写的很大
MINID最小ID,
CURID,当前ID,就是这张表当前的id是多少
你每次添加一条数据,这个CURID是会变的.
TB1.HISIDS=
TB1.MAXID=999999999
TB1.MINID=1001
TB1.CURID=1004
TB2.HISIDS=
TB2.MAXID=999999999
TB2.MINID=1001
TB2.CURID=1002
TB3.HISIDS=
TB3.MAXID=999999999
TB3.MINID=1001
TB3.CURID=1000
这种方式不支持Mycat集群
另外网上说的,重启会重置Mycat会重置全局配置.本地测试了一下.我用自己弄的这个,并没有重置
读写分离
我觉得读写分离一般都是主从复制上使用,主库写,从库查.
修改schema.xml里面的dataHost节点.
注意balance的配置,writerType配置,switchType配置.
有时间可以去查一下.我还没搞清楚.
配置完成之后,可以看mycat日志.
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 写:主库 -->
<writeHost host="hostM1" url="localhost:3306" user="backup"
password="bd147258"></writeHost>
<!-- 读:从库 -->
<writeHost host="hostS1" url="192.168.1.2:3306" user="backup"
password="bd147258"></writeHost>
</dataHost>