文章目录
数据分片
数据分片的目的
在分布式存储系统中,数据需要分散存储在多台设备上,数据分片就是用来确定数据在多台存储设备上分布的技术
- 分布均匀: 即每台设备上的数据量要尽可能相近
- 负载均衡:即每台设备上的请求量要尽可能相近
- 扩缩容时产生的数据迁移尽可能少
数据库分割方式
- 水平分割 (横向切分)
- 按照表中指定字段的分片规则,将表记录按行切分,分散存储到多个数据库中
- 垂直分割(纵向切分)
- 将单个数据库的多个表按业务类型分类,分散存储到不同的数据库
不是切割表字段
- 将单个数据库的多个表按业务类型分类,分散存储到不同的数据库
mycat
mycat概述
mycat是基于Java的分布式数据库系统中间件,为高并发环境的分布式存储提供解决方案
- 适合数据大量写入的存储需求
- 支持Mysql、Oracle、Sqlserver、Mongdb等
- 提供数据读写分离服务
- 提供数据切片服务
- 基于Cobar进行研发的开源软件
mycat分片规则
- 枚举法 sharding-by-intfile
- 给字段赋值时,值只能在规定的范围内选择 根据给定的字段值分片数据存储到哪个节点
- 固定分片 rule1
- 范围约定 auto-sharding-long
- 求模法 mod-long
- 给字段取模 分配到对应的节点服务器
- 日期列分区法 sharding-by-date
- 通配取模 sharding-by-pattern
- ASCLL码求模通配 sharding-by-prefixpattern
- 编程指定 sharding-by-substring
- 字符串拆分hash解析 sharding-by-stringhash
- 一致性hash sharding-by-murmur
mycat工作原理
收到一个SQL命令时
- 解析SQL命令涉及到的表
- 然后看对表的配置,如果有分片规则,则获取SQL命令里分片字段的值,并匹配分片函数,获得分片列表
- 然后将SQL命令发往对应的数据库服务器去执行
- 最后收集和处理所有分片结果数据,并返回到客户端0
分片案例
前置准备
主机名 | 角色 | 数据库 | IP地址 |
---|---|---|---|
user | 客户端 | 无 | 192.168.4.50 |
db2 | 分片服务器 | 无 | 192.168.4.51 |
db3 | 数据库服务器 | db1 | 192.168.4.53 |
db4 | 数据库服务器 | db2 | 192.168.4.54 |
db5 | 数据库服务器 | db3 | 192.168.4.55 |
过程
#4.51 配置分片服务器
yum -y install java-1.8.0-openjdk #mycat基于Java
which java;java -version #确认安装和版本
/usr/bin/java
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)
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/ #解压mycat源码包
ls /usr/local/mycat/
bin catlet conf lib logs version.txt
#程序 复杂查询 配置文件 包 日志
mycat的server.xml rule.xml schema.xml log4j2.xml 四种配置文件的简述
- server.xml
- 配置系统参数
- 配置用户访问权限
- 配置SQL防火墙以及SQL拦截功能
- rule.xml
- 配置水平分片的分片规则
- 配置分片规则对应的分配函数
- schema.xml
- 配置逻辑库及逻辑表
- 配置逻辑表所存储的数据节点
- 配置数据节点所对应的物理数据库服务器的信息
- log4j2.xml
- 配置日志展示的格式
- 配置日志级别
- 等等
#4.51
#配置mycat配置文件
vim /usr/local/mycat/conf/server.xml #设置连接账号 测试不用修改啥
========================================
....
<user name="root"> #连接mycat服务时使用的用户名
<property name="password">123456</property> #用户连接mycat用户时使用的密码
<property name="schemas">TESTDB</property> #逻辑库名
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property> #只读权限,连接mycat服务后只有读记录的权限,不写这一行则是可读可写
</user>
....
===================================================
vim /usr/local/mycat/conf/rule.xml #看看就好 没啥改的
#去除本次测试无关配置
cd /usr/local/mycat/conf/
wc -l schema.xml
77 schema.xml
sed -i '56,77d' /usr/local/mycat/conf/schema.xml #先删除下面的 先删除上面的话 行号会变
sed -i '39,42d' /usr/local/mycat/conf/schema.xml
sed -i '16,18d' /usr/local/mycat/conf/schema.xml
wc -l schema.xml
48 schema.xml #删除后为48
修改schema.xml
<!--4.51分片服务器操作-->
vim /usr/local/mycat/conf/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">
<!--定义逻辑表属性 在哪个节点 使用上面分片规则-->
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
<table name="goods" primaryKey="ID