MyCat实现水平分库
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下的conf目录下3个配置文件:
- 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条测试数据:
然后在mysql刷新一下,3个数据就都有对应分片规则的数据了:
order1里就有第三条数据了。
end …
上一篇: pygame实现简单五子棋游戏
下一篇: MyCat 之 水平分库实战