目录
〔1〕分片概念
- 分库分表:将存放在一台数据库服务器中的数据,按照特定的方式进行拆分,分散存放到多台数据库服务器中,以达到分散单台服务器的负载压力.
- 垂直分割:将单个数据库的多个表按业务类型分类,分散存储到不同的数据库.
- 水平分割:按照表中指定的字段分片规则,将记录按行划分,分散存储到多个数据库中.
〔2〕MyCat
- 基于Java的分布式数据库系统中间件,基于阿里巴巴cobar进行研发的开源软件,为高并发环境的分布式存储提供解决方案.
- 适用于数据大量写入的存储需求,支持MySQL,SqlServer,Mongodb等数据库.
- 提供数据读写分离服务,数据分片服务
〔3〕MyCat分片规则
- 枚举法: sharding-by-intfile
- 固定分片: rule1
- 范围约定: auto-sharding-long
- 求模法: mod-long
- 日期列分区法: sharding-by-date
- 通配取模: sharding-by-pattern
- ASCII码求模通配: sharding-by-prefixpattern
- 编程指定: sharding-by-substring
- 字符串拆分hash解析: sharding-by-stringhash
- 一致性hash : sharding-by-murmur
〔4〕MyCat工作流程
- 接收SQL命令,解析命令涉及的表
- 查看表的分片规则,获取SQL命令中分片字段的值并匹配分片函数,获分片服务器列表
- 将SQL命令发向对应的分片服务器执行
- 最后收集和处理所有分片结果数据,并返回结果给客户端
〔5〕部署MyCat服务
- 拓扑结构
- 安装软件和环境
- Jdk环境: yum -y install java-1.8.0-openjdk
- MyCat软件包免安装,解压就可使用
- tar -zxvf Mycat-server-1.6-RELEASE-Linux.tar.gz
- mv mycat /usr/local/ //存在local 目录下
- 安装目录结构
- 查看: ls /usr/local/mycat/
- <bin>: mycat命令目录
- <catlet>: 扩展功能目录
- <conf>: 配置文件目录
- <lib>: 使用的jar包目录
- <logs>: mycat启动日志和运行日志目录
- wrapper.log //启动日志
- mycat.log //错误日志
- 配置文件,conf/
- 设置连接MyCat服务和逻辑库: server.xml
- 配置数据分片: schema.xml
- 分片规则: rule.xml
- 函数调用文件: *.txt
- mycat服务配置server.xml
- 定义逻辑数据库和mycat用户名密码
......
<user name="root"> //mycat用户名
<property name="password">123456</property> //密码
<property name="schemas">TESTDB</property> //逻辑数据库名
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property> //对数据库只读权限
</user>
......
- mycat分片配置schema.xml
- 定义逻辑表,存储分片数据
......
<schema name"TESTDB" checkSQLschema="false" sqlMaxLimit="100"> //逻辑库
<table name="employee" primaryKey="ID" dataNode="dn1,dn2,dn3" rule="sharding- by- intfile" />
//逻辑表表名employee,主键为ID,数据库服务器节点dn1,dn2,dn3, 分片规则为枚举法
<table name="hotnews" primaryKey="ID" dataNode="dn1,dn2,dn3" rule="mod-long" /> //分片规则为求模法
<table name="company" primaryKey="ID" dataNode="dn1,dn2,dn3" type="global" /> //global,代表数据存储时不分片,在各个数据库服务器上完整存储
</schema>
......
-
- 定义数据库服务器节点名,主机名,存储数据库名
//name: 数据库服务器节点名
//dataHost: 数据库服务器主机名
//dataBase: 数据库服务器上存储数据的数据库名
<dataNode name="dn1" dataHost="mysql53" database="db1">
<dataNode name="dn2" dataHost="mysql54" database="db2">
<dataNode name="dn3" dataHost="mysql55" database="db3">
......
-
- 定义数据库服务器IP地址和端口,授权用户
//dataHost:数据库服务器主机配置
//host: 主机名,与IP地址对应
//url: 数据库服务器IP地址和端口
//user: 数据库服务器授权用户
//password: 授权用户密码
<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="admin" password="123456"></writeHost>
</dataHost>
<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="hostM2" url="192.168.4.54:3306" user="admin" password="123456"></writeHost>
</dataHost>
<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="hostM3" url="192.168.4.55:3306" user="admin" password="123456"></writeHost>
</dataHost>
......
- 数据库服务器配置
- 添加授权用户,3个节点的数据库都执行一次
- grant all on *.* to admin@'%' identified by "123456";
- 创建存储数据数据库
- create database db1; //192.168.4.53上执行
- create database db2; //192.168.4.54上执行
- create database db3; //192.168.4.55上执行
- 添加授权用户,3个节点的数据库都执行一次
- 启动mycat服务,默认端口8066
- /usr/local/mycat/bin/mycat start
- netstat -nutlp | grep :8066
- 客户端连接测试
- 连接
- yum -y install mariadb //若是无mysql命令,安装mariadb提供mysql连接命令
- mysql -h192.168.4.56 -P8066 -uroot -p123456
- 查看
- show databases; //可以看到逻辑库TESTDB
- use TESTDB;
- show tables; //查看表,可以看到我们定义的employee,company,hotnews
- desc hotnews; //查看表结构报错,表不存在,因为这是逻辑表,数据库服务器中不存在
- 建表
- 将逻辑表在数据库服务器中实例化,需要根据定义逻辑表时设置的分片规则要求和相应算法的要求创建表结构.
- 以逻辑表employee为例,首先我们在mycat服务器上打开分片配置schema.xml,可以看到
- 连接
//逻辑表employee要求主键字段是ID,分片规则是枚举法sharding-by-intfile
<table name="employee" primaryKey="ID" dataNode="dn1,dn2,dn3" rule="sharding- by- intfile" />
-
-
- 根据分片规则,找到相应的算法要求,并配置.打开分片规则rule.xml
-
......
<tableRule name="sharding-by-intfile"> //找到枚举法的位置
<rule>
<columns>sharding_id</columns> //表中要求字段值sharding_id,枚举法要求字段值必须在列举范围内选择
<algorithm>hash-int</algorithm> //调用函数为hash-int ,定义了从哪个函数调用文件提供sharding_id的值范围
</rule>
</tableRule>
.......
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property> //hash-int函数指明了调用文件为partition-hash-int.txt
</function>
......
-
-
- mycat安装路径下/usr/local/mycat/conf/,打开partition-hash-int.txt
-
10000=0 //10000,10010,10020为sharding_id的取值, 0,1,2分别代表数据库节点dn1,dn2,dn3
10010=1 //当sharding_id取值为10000时,数据存入dn1服务器
10020=2
-
-
- 客户端建表,并插入数据,可以在3个节点数据库服务器中看到分片存储的效果
-
use TESTDB;
create table employee(
ID int primary key auto_increment,
sharding_id int,
name char(15)
);
insert into employee(sharding_id, name) values
(10000,"luo"),(10010,"luo10"),(10020,"luo20");
- 添加新库新表
- 在mycat服务配置文件sever.xml中添加一个逻辑库,
- 在mycat分片配置文件schema.xml中实现逻辑库中逻辑表的定义,
- 重启mycat服务
- 客户端在新的逻辑库中实现逻辑表的实例化验证测试