前言:数据分片就是对数据库进行拆分,可以是分库也可以是分表,达到多台服务器负载的效果。
数据分片分为水平分割:把一个表拆分到多个服务器,垂直分割:把不同表分到不同服务器。1
1.分表工具介绍:MyCAT
支持多种数据库类型,包括关系型和非关系型数据库,提供读写分离服务。
1.1.分片规则:
枚举法,固定分片,范围约定,求模法,日期列分区发,通配取模,ASCII码求模统配,
编程指定,字符串拆分hash解析,一致性hash
1.2.工作过程
1.收到sql命令
2.解析sql命令,涉及的表
3.根据表的配置,如有分片规则,获取sql分片字段的值,并匹配分片函数,获取分片列表
4.把sql命令发往对应的数据库执行
5.收集和处理所有分片结构数据,并返回到客户端
2.部署MyCAT服务
2.1.分别在3台服务器创建数据库db1,db2,db3
--数据库1
mysql> create database db1;
--数据库2
mysql> create database db2;
--数据库3
mysql> create database db3;
2.2.在分片服务器安装jdk
[root@mycat ~]# yum -y install java-1.8.0-openjdk.x86_64
[root@mycat ~]# java -version
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)
2.3.安装mycat
Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
#免安装源码包
[root@mycat ~]# tar -zxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
[root@mycat ~]# ls mycat/
bin catlet conf lib logs version.txt
[root@mycat ~]# mv mycat/ /usr/local/
[root@mycat ~]# ls /usr/local/mycat/
bin #mycat命令
catlet #扩展功能
conf #配置文件
lib #mycat使用的jar包
logs #mycat启动日志和运行日志
version.txt
2.4.重要的配置文件
[root@mycat ~]# cd /usr/local/mycat/conf
[root@mycat conf]# ls *.xml
ehcache.xml
log4j2.xml
rule.xml #分片规则
schema.xml #配置数据分片存储的表
server.xml #设置连接账号及逻辑库
3.修改配置文件
3.1.创建连接用户
[root@mycat conf]# pwd
/usr/local/mycat/conf
[root@mycat conf]# vim server.xml
<user name="root"> #连接mycat服务的用户名
<property name="password">123456</property> #用户连接mycat用户时使用的密码
<property name="schemas">TESTDB</property> #逻辑库
</user>
<user name="user"> #连接mycat服务的用户名
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property> #只读权限,连接mycat服务后只有读记录的权限,不写这一行则是可读可写
</user>
3.2.配置数据分片
1.先备份shema.xml
[root@mycat conf]# cp schema.xml /root/
2.删除无用的注释行
[root@mycat conf]# vim schema.xml
:q!
[root@mycat conf]# sed -i '56,77d' schema.xml #删除56到77行
[root@mycat conf]# sed -i '39,42d' schema.xml #删除39到42行
修改后的schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /> #对travelrecord表做分片存储
<!-- global table is auto cloned to all defined data nodes ,so can join
with any table whose sharding node is in the same data node -->
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> #对company表做分片存储
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<!-- random sharding using mod sharind rule -->
<table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"
rule="mod-long" />
<!-- <table name="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global"
needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_dn3"
rule="mod-long" /> -->
<table name="employee" primaryKey="ID" dataNode="dn1,dn2,dn3"
rule="sharding-by-intfile" />
<table name="customer" primaryKey="ID" dataNode="dn1,dn2,dn3"
rule="sharding-by-intfile">
<childTable name="orders" primaryKey="ID" joinKey="customer_id"
parentKey="id">
<childTable name="order_items" joinKey="order_id"
parentKey="id" />
</childTable>
<childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
parentKey="id" />
</table>
<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
/> -->
</schema>
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
/> -->
#定义数据库主机名及存储数据的库
<dataNode name="dn1" dataHost="mysql53" database="db1" />
<dataNode name="dn2" dataHost="mysql54" database="db2" />
<dataNode name="dn3" dataHost="mysql55" database="db3" />
#定义mysql53主机名对应的数据库服务器ip地址
<dataHost name="mysql53" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.4.53:3306" user="adminabc"
password="123456">
</writeHost>
</dataHost>
#定义mysql54主机名对应的数据库服务器ip地址
<dataHost name="mysql54" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.4.54:3306" user="adminabc"
password="123456">
</writeHost>
</dataHost>
#定义mysql55主机名对应的数据库服务器ip地址
<dataHost name="mysql55" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.4.55:3306" user="adminabc"
password="123456">
</writeHost>
</dataHost>
</mycat:schema>
3.3.用户授权(all表示所有命令,*.*表示所有库表,adminabc表示用户名,%表示所有访问地址,123456表示密码)
[root@db1 ~]# mysql -uroot -p123456 -e 'grant all on *.* to adminabc@"%" identified by "123456"'
[root@db2 ~]# mysql -uroot -p123456 -e 'grant all on *.* to adminabc@"%" identified by "123456"'
[root@db3 ~]# mysql -uroot -p123456 -e 'grant all on *.* to adminabc@"%" identified by "123456"'
3.4.客户端验证
mysql -h192.168.4.53 -uadminabc -p123456
mysql -h192.168.4.54 -uadminabc -p123456
mysql -h192.168.4.55 -uadminabc -p123456
3.5.启动服务
[root@mycat conf]# /usr/local/mycat/bin/mycat start
Starting Mycat-server...
[root@mycat conf]# netstat -utnlp | grep 8066
[root@mycat mycat]# pwd
/usr/local/mycat
[root@mycat mycat]# ls logs/
mycat.log mycat.pid wrapper.log
3.6.验证配置结果
[root@client ~]# mysql -h192.168.4.56 -P8066 -uroot -p123456
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB | --定义的逻辑库,实际上不存在。里面的表也是假的
+----------+
1 row in set (0.00 sec)
mysql> use TESTDB
mysql> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| company |
| customer |
| customer_addr |
| employee |
| goods |
| hotnews |
| orders |
| order_items |
| travelrecord |
+------------------+
9 rows in set (0.00 sec)
4.分片规则
4.1枚举法
vim schema.xml
<table name="employee" primaryKey="ID" dataNode="dn1,dn2,dn3"
rule="sharding-by-intfile" /> #表使用的分片规则
vim /usr/local/mycat/conf/rule.xml
<tableRule name="sharding-by-intfile"> #分片规则
<rule>
<columns>sharding_id</columns> #字段名
<algorithm>hash-int</algorithm> #算法
</rule>
</tableRule>
vim /usr/local/mycat/conf/rule.xml
<function name="hash-int"
class="io.mycat.route.function.PartitionByFileMap"> #算法
<property name="mapFile">partition-hash-int.txt</property> #配置文件名
</function>
vim /usr/local/mycat/conf/partition-hash-int.txt
10000=0 #0表示第一台数据库服务器,对应dn1
10010=1 #1表示第二台数据库服务器,对应dn2
10020=2 #3表示第三台数据库服务器,对应dn3
4.2求模法
[root@mycat local]# vim /usr/local/mycat/conf/schema.xml
<table name="hotnews" dataNode="dn1,dn2,dn3"
rule="mod-long" />
vim /usr/local/mycat/conf/rule.xml
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
vim /usr/local/mycat/conf/rule.xml
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>
———————————————
版权声明:本文为CSDN博主「行走的皮卡丘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载
原文链接:https://blog.csdn.net/weixin_44908159/article/details/108303570