欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MyCat实现水平分库

程序员文章站 2022-03-09 09:13:12
...

MyCat实现水平分库

mycat的关键特性

  • 支持 SQL 92标准

  • 支持Mysql集群,可以作为Proxy使用

  • 支持JDBC连接ORACLE、DB2、SQL Server,将其模拟为MySQL Server使用

  • 支持galera for mysql集群,percona-cluster或者mariadb cluster,提供高可用性数据分片集群

  • 自动故障切换,高可用性

  • 支持读写分离,支持Mysql双主多从,以及一主多从的模式

  • 支持全局表,数据自动分片到多个节点,用于高效表关联查询

  • 支持独有的基于E-R 关系的分片策略,实现了高效的表关联查询

  • 多平台支持,部署和实施简单

为什么要进行水平分库
(1)集中式处理,势必造成性能瓶颈;

(2)应用程序集中在一台计算机上运行,一旦该计算机发生故障,则整个系统受到影响,可靠性不高;

(3) 集中式处理引起系统的规模和配置都不够灵活,系统的可扩充性差。

在这种形势下,集中式数据库将向分布式数据库发展。

mycat的分片规则
一共有10种,今天只讲一种:取余

例子 分片
1%3=1 第二个分片
2%3=2 第三个分片
3%3=0 第一个分片

测试分片

首先我们需要安装好了的两个容器,分别为mysql及mycat。
在mycat中需要一张表,同时在mysql中建三个数据库,分别为dm_order1,dm_order2,dm_order3,并在这3个数据库分别建1张表和mycat主表结构一样,这样对应待会分过来的数据。
我这里使用的是partainer,进入mycat容器,找到console,进去,然后到这个界面,点击
提示如果你用的是普通docker安装容器的,执行以下命令::

1. docker ps -a 查询所有容器包括未启动的:
2. docker start + 容器名字 就进去了:

MyCat实现水平分库
进入容器以后,找到mycat下的conf目录下3个配置文件:

  1. schema.xml:主要是对数据库的逻辑操作
    将以下内容放入mycat:schema标签里:
<schema name="dm_order" checkSQLschema="false" sqlMaxLimit="100">
   <!-- 需要对那张表进行分片     节点名称,对应下面datanode标签           分片规则 -->
		<table name="dm_order" dataNode="dn1,dn2,dn3" rule="auto-sharding-rang-mod-order"/>
 </schema>
	  <!--  对应什么取得节点名       主机名 ,也可以加多个主机,这里就用一台名为localhost1        对应要分片的数据库 -->
	<dataNode name="dn1" dataHost="localhost1" database="dm_order1" />
	<dataNode name="dn2" dataHost="localhost1" database="dm_order2" />
	<dataNode name="dn3" dataHost="localhost1" database="dm_order3" />
	
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select 1</heartbeat>
	<!--  要分库的url    用户名    密码-->
  <writeHost host="hostM1" url="192.168.83.115:3306" user="root" password="123456">
  </writeHost>
	</dataHost>

rule.xml:主要配置分片规则:

<!--  name对应schema.xml里面配置的规则-->
<tableRule name="auto-sharding-rang-mod-order">
		<rule>
			<columns>id</columns>
			<algorithm>rang-mod-dm</algorithm>
		</rule>
	</tableRule>
 <!-- name对应上面标签algorithm的名字,这里主要是对分片规则的一些参数设置 -->
<function name="rang-mod-dm"  class="io.mycat.route.function.PartitionByMod">
 <!--   也就是对应取余的3 -->
		<property name="count">3</property>
	</function>

server.xml: 在</mycat:server>加以下内容:

<user name="root">
  
		<property name="password">123456</property>
		<property name="schemas">dm_order</property>
	
	</user>

	<user name="user">
		<property name="password">user</property>
		<!-- ,就是mycat的要分库的表 -->
		<property name="schemas">dm_order</property>
		<property name="readOnly">true</property>
	</user>

连接mycat数据库,向表里添加3条测试数据:
MyCat实现水平分库
然后在mysql刷新一下,3个数据就都有对应分片规则的数据了:
order1里就有第三条数据了。
MyCat实现水平分库
end …