分库分表

                                                          ql-day10     分库分表

          

mysql>  insert into employee(id,name,sharding_id)values(

       1,"jingjing",10000),(2,"niuge",10010),(3,"tao",10000),(4,"bai",10010);    

                                        

 

 

 

•什么是分库分表

–通过某种特定条件,将存放在一个数据库(主机)中的

数据,分散存放到多个数据库(主机)中。

–已达到分散单台设备负载的效果,即分库分表

–数据的切分根据其切分规则的类型,分为2种切分模式

–垂直分割(纵向)和水平分割(横向)

垂直分割

 

•纵向切分

–把单一的表,拆分成多个表,并分散到不同的数据库(主机)上。

–一个数据库由多个表构成,每个表对应不同的业务,可以按照业务对表进行分类,将其分布到不同的数据库(主机),实现专库专用,让不同的库(主机)分担不同的业务。

水平分割

 

 

 

•横向切分

–按照表中某个字段的某种规则,把向表中写入的记录分散到多个库(主机)中。

–简单来说,就是按照数据行切分,将表中的某些行存储到指定的数据库(主机)中。

  • 软件介绍

Mycat是基于Java的分布式数据库系统中间层,为高并发下的分布式提供解决方案

–支持JDBC形式连接

–支持MySQLOracleSqlserverMongodb

–提供数据读写分离服务

–可以实现数据库服务器的高可用

–提供数据分片服务

–基于阿里巴巴Cobar进行研发的开源软件

–适合数据大量写入数据的存储需求

  • 分片规则

mycat服务提供10种分片规则。

1枚举法sharding-by-intfile

2固定分片rule1

3范围约定auto-sharding-long

4求模法mod-long

5日期列分区法sharding-by-date

6通配取模sharding-by-pattern

7ASCII码求模通配sharding-by-prefixpattern

8编程指定sharding-by-substring

9字符串拆分hash解析sharding-by-stringhash

10一致性hash sharding-by-murmur

  • 工作过程

 

  • 工作过程(续1)分片算法

•每种分片规则对应一种算法。

1枚举法sharding-by-intfile->hash-int

2固定分片rule1->func1

3范围约定auto-sharding-long->rang-long

4求模法mod-long->mod-long

5日期列分区法sharding-by-date->sharding-by-date

•每种分片规则对应一种算法。

6通配取模sharding-by-pattern->sharding-by-pattern

7ASCII码求模通配sharding-by-prefixpattern

->sharding-by-prefixpattern

8编程指定sharding-by-substring->sharding-by-substring

9字符串拆分hash解析sharding-by-stringhash->sharding-by-stringhash

10一致性hash sharding-by-murmur->murmur

•当Mycat收到一个SQL

–会先解析这个SQL查找涉及到的表,然后看此表的定

–如果有分片规则,则获取到SQL里分片字段的值,并匹配分片函数,得到该QL对应的分片列表

–然后将SQL发往这些分片去执行,最后收集和处理所有分片返回的结果数据,并输出到客户端以select*from Orders where prov=?语句为例,查到prov=wuhan,按照分片函数,wuhan返回dn1,于是SQL就发给了MySQL1,去取DB1上的查询结果,并返回给用户。

-如果上述SQL改为elect*from Orders where prov in(wuhan,beijing),那么,SQL就会发给ySQL1MySQL2去执行,然后结果集合并后输出给用户。但通常业务中我们的SQL会有OrderBy以及Limit翻页语法,此时就涉及到结果集在Mycat端的二次处理。

  • IP规划

•具体配置如下:

拓扑名称主机名角色数据库名IP地址

hostA client客户端无192.168.4.254/24

hostB Mycat Mycat服务器无192.168.4.56/24

hostC c1数据库服务器db1 192.168.4.55/24

hostD c2数据库服务器db2 192.168.4.54/24

1)装包

•安装JDK

[root@localhost~]#rpm- qa |grep -i  jdk#安装系统自带的即可

java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64

java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64

•安装mycat服务软件包

[root@localhost~]#tar -zxf Mycat-server-1.4-beta-

20150604171601-linux.tar.gz#免安装,解压后即可使用

[root@localhost~]#mv mycat/ /usr/local/

[root@localhost~]#ls /usr/local/mycat/

bin catlet conf lib logs version.txt

2)修改配置文件

•目录结构说明

–bin mycat命令如启动停止等

catlet扩展功能

conf配置文件

lib mycat使用的jarmycatjava开发的

log mycat启动日志和运行日志

wrapper.log mycat服务启动日志,启动有问题可以看这个日志的内容

mycat.log记录sql脚本执行后的具体报错内容

3)修改配置文件(1)

•重要配置文件说明

设置连接mycat服务的账号、密码等

server.xml

schema.xml配置mycat使用的真实数据库和表

rule.xml

定义mycat分片规则

•配置标签说明

<user>.......</user>定义连接mycat服务时使用的用户和密码

及逻辑库的名字

<datanode>......</datanode>指定数据节点(物理库的主机名和

存储分片数据的数据库名)

<datahost>......</datahost>指定数据库服务器的IP地址及连

接数据库时使用的授权用户名及密码

4)修改配置文件(2)

•修改配置文件/usr/local/mycat/conf/server.xml

<user name="test">#连接mycat服务时使用的用户名test

<property name="password">test</property>#使用

test用户连接mycat用户时使用的密码

<property name="schemas">TESTDB</property>#连接上mycat服务后,可以看到的库名多个时,使用逗号分隔(是逻辑上的库名)

</user>

<user name="user">

<property name="password">user</property>

<property name="schemas">TESTDB</property>

<property name="readOnly">true</property>#定义只读权限,使用定义的user用户连接mycat服务后只有读记录的权限

</user>

5)修改配置文件(4

•修改配置文件/usr/local/mycat/conf/schema.xml

–定义分片信息

   

6)修改配置文件(4)

•修改配置文件/usr/local/mycat/conf/schema.xml

–定义分片信息

 

7)修改配置文件(5)54,55设置

•修改数据库服务器配置文件

–添加对应设置后重启mysqld服务

–添加授权用户

Vim/etc/my.cnf

[mysqld]

......

lower_case_table_names=1#表名区分字母大小写

[root@localhost~]#systemctl restart mysqld

//mycat连接数据库服务器用户

u 54建库db2,授权

MySQL>create database db2;

MySQL>grant all on*.*to admin@"%"identified by"123456";

u 55建库db1,授权

MySQL>create database db1;

MySQL>grant all on*.*to admin@"%"identified by"123456";

7)起服务查端口:如果有问题重起电脑,显示内存不足

 

[root@host57~]#/usr/local/mycat/bin/mycat start

[root@host57~]#/usr/local/mycat/bin/mycat status

[root@host57~]#ps -p 1503

[root@host57~]#netstat -anput | grep :8066

8)测试配置

•在客户端连接mycat服务器

mysqlhmycat服务器ip地址–P端口–u用户–p密码

 

[root@room9pc17~]#mysql -h192.168.4.56 -P8066 -utest -p123456

MySQL[(none)]>show databases;

MySQL[(none)]>show tables;

[root@host57 conf]#cat partition-hash-int.txt

10000=0

10010=1

1.1建表 host57

MySQL[TESTDB]>create table employee(id int not null primary key,name     varchar(100),sharding_id int not null);

MySQL[TESTDB]>insert into employee(id,name,sharding_id)values(1,"jingjing",10000),(2,"niuge",10010),(3,"tao",10000),(4,"bai",10010);

MySQL[TESTDB]>desc employee;

1.2查看host55

mysql>use db1;

mysql>show tables;

mysql>select * from employee;

1.3查看host54

mysql>use db2;

mysql>show tables;

mysql>select*from employee;

posted @ 2019-12-10 11:31  云计算(互联网)  Views(340)  Comments(0Edit  收藏  举报