文章目录
- 1.应用指定Hash算法分片的概念
- 2.使用应用指定Hash算法分片对某张表进行水平拆分
- 2.1.在所有的分片节点中创建表结构
- 2.2.配置Mycat实现应用指定Hash算法分片的水平分表
- 2.2.1.配置Schema配置文件
- 2.2.2.配置Rule分片规则配置文件
- 2.2.3.配置Server配置文件
- 2.2.4.重启Mycat
- 2.3.写入数据观察分片效果
1.应用指定Hash算法分片的概念
应用指定Hash算法分片指的是,由应用自主决定路由到哪一个分片节点,根据分片的字段通过Hash算法计算出分片号,最终将数据写入到特定的分片节点中
应用指定Hash算法分片的字段必须是数字类型的内容,否则没有分片的条件。
字段值的内容例如是01xxxx,我们在配置分片规则时,就可以取前两个数字,然后根据Hash算法写入到对应的分片中。
2.使用应用指定Hash算法分片对某张表进行水平拆分
需求:目前有一张tb_app表,表中的id一列的值是以数字+字符串的形式存储的,我们按照id一列使用应用指定Hash算法分片进行水平分表。
2.1.在所有的分片节点中创建表结构
分片依旧是2个,还是之前垂直分库分表时使用的两套双主双从集群。
#在分片1节点中创建表结构
[root@mysql-1 ~]# mysql -uroot -p123456 -P3306 -h 192.168.20.11
mysql> use db_2;
mysql> create table tb_app (id varchar(10),name varchar(200));
#在分片2节点中创建表结构
[root@mysql-1 ~]# mysql -uroot -p123456 -P3307 -h 192.168.20.11
mysql> use db_2;
mysql> create table tb_app (id varchar(10),name varchar(200));
2.2.配置Mycat实现应用指定Hash算法分片的水平分表
2.2.1.配置Schema配置文件
[root@mysql-1 ~]# vim /data/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--定义逻辑库 库名叫做db_shopping 该逻辑库关联dn1这个数据节点-->
<schema name="db_2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<!--应用指定Hash算法分片-->
<table name="tb_app" dataNode="dn1,dn2" rule="sharding-by-substring"/>
</schema>
<!--定义数据节点 也就是分片 一个分片会关联一个数据主机组 然后对应真实的数据库名称-->
<dataNode name="dn1" dataHost="mysqlcluster-1" database= "db_2" />
<dataNode name="dn2" dataHost="mysqlcluster-2" database= "db_2" />
<!--定义数据主机 在这个标签下定义具体的读写操作路由的数据库实例地址 schema、table划分如何指定的是该数据主机关联的数据节点 那么对应的库、表都会被存储在数据主机定义的数据库实例中-->
<dataHost name="mysqlcluster-1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<!--定义写操作路由的数据库实例-->
<writeHost host="c1-1-master3306" url="192.168.20.11:3306" user="root" password="123456">
<!--定义读操作路由的数据库实例-->
<readHost host="c1-1-slave3308" url="192.168.20.11:3308" user="root" password="123456" />
</writeHost>
<!--备用的主库 也是提供写操作的数据库,当主库c1-1-master3306故障后 备用库开始提供写操作-->
<writeHost host="c1-2-master3306" url="192.168.20.12:3306" user="root" password="123456">
<!--备用主库的从库 从始至终 只要备用主库不故障 会一直提供读服务-->
<readHost host="c1-2-slave3308" url="192.168.20.12:3308" user="root" password="123456" />
</writeHost>
</dataHost>
<dataHost name="mysqlcluster-2" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="c2-1-master3307" url="192.168.20.11:3307" user="root" password="123456">
<readHost host="c2-1-slave3309" url="192.168.20.11:3309" user="root" password="123456" />
</writeHost>
<!--备用主库db3 主库db1故障后 开始提供写操作-->
<writeHost host="c2-2-master3307" url="192.168.20.12:3307" user="root" password="123456">
<!--备用主库的从库 从始至终 只要备用主库不故障 会一直提供读服务-->
<readHost host="c2-2-slave3309" url="192.168.20.12:3309" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
2.2.2.配置Rule分片规则配置文件
[root@mysql-1 ~]# vim /data/mycat/conf/rule.xml
<tableRule name="sharding-by-substring">
<rule>
<columns>id</columns>
<algorithm>sharding-by-substring</algorithm>
</rule>
</tableRule>
<function name="sharding-by-substring" class="io.mycat.route.function.PartitionDirectBySubString">
<!--字符子串起始索引 我们写的是0 表示依据的字段必须全部是0开头 否则将不满足条件-->
<property name="startIndex">0</property>
<!--字符串截取的长度-->
<property name="size">2</property>
<!--分片数量-->
<property name="partitionCount">2</property>
<!--默认的分片节点 当不满足要求的数据就存储在这个节点中-->
<property name="defaultPartition">0</property>
</function>
例如:依据字段的值为05xxxxssds,根据分片规则,从0开始截取,截取2位,最终会得到05这个数字,然后根据算法写入到对应的分片中。
2.2.3.配置Server配置文件
[root@mysql-1 ~]# vim /data/mycat/conf/server.xml
<user name="root" defaultAccount="true">
<!--登录用户的密码-->
<property name="password">123456</property>
<!--该用户登录后可以显示那些Schema-->
<property name="schemas">db_2</property>
</user>
2.2.4.重启Mycat
[root@mysql-1 ~]# mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...
2.3.写入数据观察分片效果
[root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
mysql> use db_2;
mysql> insert into tb_app (id,name) values('0000001','Testx00001');
mysql> insert into tb_app (id,name) values('0100001','Test100001');
mysql> insert into tb_app (id,name) values('0100002','Test200001');
mysql> insert into tb_app (id,name) values('0200001','Test300001');
mysql> insert into tb_app (id,name) values('0200002','TesT400001');
一部分写入到分片1,一部分写入分片2。
数据写入后在Mycat中可以看到完整表的数据。