MyCat分库分表

场景: 一个数据库有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>

有不明白的可以留言,我写的不是特别详细.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值