MySQL数据分片

前言:数据分片就是对数据库进行拆分,可以是分库也可以是分表,达到多台服务器负载的效果。

数据分片分为水平分割:把一个表拆分到多个服务器,垂直分割:把不同表分到不同服务器。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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值