一 分库分表
1 什么是分库分表
– 将存放在一个数据库(主机)中的数据,按照特定方式进行拆分,分散存放到多个数据库(主机)中,以达到分散单台设备负载的效果。
2 垂直分隔
1) 纵向切分(分多个表)
–将单个表,拆分成多个表,分散到不同的数据库
–将单个数据库的多个表进行分类,按业务分类分散到不同的数据库上。
3 水平分隔
1) 横向切分(一个表分行)
–按照表中的某个字段的某种规则,把表中的许多记录按行切分,分散到多个数据库中
mycat 介绍
1 mycat 是基于java的分布式数据库系统中间层,为高并发的分布式访问提供解决方案
– 支持JDBC形式连接
– 支持mysql,oracle,sqlserver,mongodb等
– 可以实现数据库服务器的高可用
– 提供数据读写分离服务
– 提供数据分片服务
– 基与阿里巴巴Cobar进行研发的开源软件
– 适合数据大量写入的数据存储需求
分片规则:
1)枚举法 sharding-by-infile
2)固定分片 rule1
3)范围约定 auto_sharding-long
4) 求模法 mod-long
5) 日期列分区法 sharding-by-date
6) 通配取模 sharding-by-pattern
7) ASCII 码求模通配 sharding-by-prefixpattern
8) 编程指定 sharding-by-substring
9) 字符串拆分hash解析 sharding-by-stringhash
10) 一致性hash sharding-by-murmur
缺点: 查询速度变慢,不适合读取的环境。适合大并发写入的环境
如何解决读取数度慢的问题?
3 mycat工作过程:
当mycat收到一个SQL查询时:
– 先解析这个SQL查询涉及到的表
– 然后看此表的定义,如果有分片规则,则获取SQL里的分片字段的值。并分配函数,获取分片列表
– 然后将SQL发往这些分片去执行
– 最后收集和处理所有分片的结果数据,并返回到客户端
部署mycat
1.装 jdk(让java 跑起来的软件)
rpm -qa | grep -i jdk
java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64
java-1.8.0-openjdk-headless-1.8.0.131-11.b12.el7.x86_64
java-1.8.0-openjdk-devel-1.8.0.131-11.b12.el7.x86_64
copy-jdk-configs-2.2-3.el7.noarch
java -version
openjdk version “1.8.0_131”
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
2.解包
tar -zxvf Mycat-server-1.4-beta-20150604171601-linux.tar.gz
3 将主配置文件移动到/usr/local/下
mv mycat /usr/local/
4 Mycat目录结构说明
–bin //mycat 命令,如启动 停止等
–catlet //扩展文件
– conf //配置文件
–lib //mycat使用的jar
–logs //mycat启动日志和运行日志
–wrapper.log //mycat服务启动日志
–mycat.log //记录SQL脚本执行后报错的信息
version.txt //版本介绍
5 重要配置文件说明:
–server.xml 设置连接mycat的帐号信息
–schema.xml 配置mycat的真实库表
–rule.xml 定义mycat分片规则
6 配置标签说明:
<user……</user 定义连mycat用户信息
<datanode……</datanode 指定数据节点
<datahost……</datahost 指定数据库地址及用户信息
vim /usr/local/mycat/conf/server.xml
34 ------------------------(连接mycat帐号为 test 密码 为 test)
35 test
36 TESTDB
37
38
39
40 user
41 TESTDB
42 true --------(定义只读)
cp schema.xml /tmp/ (备份)
定义分片信息
vim /usr/local/mycat/conf/schema.xml (配置mycat的真实库表)
7
5 (与server.xml表要对应)
37
38
39 (注释)
47 <writeHost host=“hostM1” url=“192.168.4.54:3306” user=“root”
48 password=“123456”>
43 <dataHost name=“localhost2” maxCon=“1000” minCon=“10” balance=“0” --------------(复制一份指定dn2 IP 『<datahost……</datahost 指定数据库地址及用户信息』 )
44 writeType=“0” dbType=“mysql” dbDriver=“native” switchType=“1” slaveThreshold=“100”>
45 select user()
46
47 <writeHost host=“hostM1” url=“192.168.4.55:3306” user=“root”
48 password=“123456”>
49
————————————————————————(黄色部分都是注释的)
50
51
52
54
55
1.在数据库 54 55 创建 表
55主机 (创建 db1) 56 主机 (创建 db2)
验证 : 用56 主机 验证
2.在 数据库 54 55 设置授权用户
grant all on . to root@"%" identified by “123456”;
3.在数据库54 55 配置文件(/etc/my.cnf)
lower_case_table_names = 1 (添加) ------//表名忽略大小写
4.在主机56 启动服务
/usr/local/mycat/bin/mycat start (启动)
/usr/local/mycat/bin/mycat status (看进程)
Mycat-server is running (15112).
ss -nutlp | grep :8066 (看状态)
tcp LISTEN 0 100 :::8066 ::? users:((“java”,pid=15114,fd=49))
/usr/local/mycat/bin/mycat stop (停止)
kill -9 15114 (如停止不了杀进程)
在客户机(50)访问
mysql -h192.168.4.56 -uadmin -p123456 -P8066
创建employee表
create table employee (
-> ID int primary key auto_increment,
-> sharding_id int,
-> name char(12),
-> age tinyint unsigned default 28);
insert into employee(sharding_id,name) values(10000,“jim”); (存在db1)
insert into employee(sharding_id,name) values(10010,“bom”); (存在db2)
vim /usr/local/mycat/conf/schema.xml
partition-hash-int.txt
vim /usr/local/mycat/conf/partition-hash-int.txt (查看算法对应的规则)
10000=0
10010=1
表示(写10000 存在 表db1–54主机上 写10010 存在55 主机上)