数据分片
概念: 按特定方式拆分,分散存放到多个数据库服务器上,达到负载效果
垂直分割:单个表切换成多个表,按业务类别分散到不同数据库.
水平分割:将表里的多条记录切分到不同数据库.
搭建数据分片服务器 MyCAT
基于JAVA的分布式
适合大量写入数据的存储需求
分片 高可用集群 读写分离 都可以使用MYCAT
支持MYSQL Oracle Sqlserver Mongodb
分片规则:
枚举法 固定分片 范围约定 求模法 日期列分区法 通配取模 ASCII码求模通配
编程指定 字符串拆分hash 一致性hash
Mycat软件介绍:
工作过程图一
工作过程图二
一、配置mycat环境
拓扑结构、
IP规划
二、开始搭建mycat分片服务器(56操作)
步骤一:公共配置
1)关闭防火墙和selinux,配置yum源(系统源),这里不再操作
2)把53,54,55还原成独立数据库服务器,56主机下载mycat 软件包
需要的软件包:Mycat-server-1.6 这个软包需要三台数据库服务器
56]# tar -zxvf Mycat-server-1.6-linux.tar.gz
56]# mv mycat/ /usr/local
56 ]# cd /usr/local/mycat/
56 mycat]# ls
bin catlet conf lib logs version.txt
配置文件
修改配置文件图一
3)在53(主机)54(主机)和55(主机)上面创建db3、db2、db1库和授权一个用户。
53]# mysql -u root -p123@qq.Com
mysql> create database db3;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on * . * to roota@"%" identified by "123@qq.Com";
52]# mysql -u root -p123@qq.Com
mysql> create database db2;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on * . * to roota@"%" identified by "123@qq.Com";
51]# mysql -u root -p123@qq.Com
mysql> create database db1;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on * . * to roota@"%" identified by "123@qq.Com";
4)修改数据库的配置文件(53、54、55)
注意:1代表不区分表名的大小写,0为区分大小写
主机c1上面:
53]# vim /etc/my.cnf
[mysqld]
lower_case_table_names=1 //表名忽视大小写
53]# systemctl restart mysqld
54]# vim /etc/my.cnf
[mysqld]
lower_case_table_names=1 //表名忽视大小写
54]# systemctl restart mysqld
55]# vim /etc/my.cnf
[mysqld]
lower_case_table_names=1 //表名忽视大小写
55]# systemctl restart mysqld
5)在56主机上面安装JDK和mycat
56]# 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
copy-jdk-configs-2.2-3.el7.noarch
56]# yum -y install java-1.8.0-openjdk
56]# cd mysql/
56mysql]# tar -xf Mycat-server-1.4-beta-20150604171601-linux.tar.gz //免安装,解压即可使用
56mysql]# mv mycat/ /usr/local/
56mysql]# ls /usr/local/mycat/
bin catlet conf lib logs version.txt
56mysql]# cd /usr/local/mycat/
56mycat]# ./bin/mycat --help
Usage: ./bin/mycat { console | start | stop | restart | status | dump }
修改配置文件图二(图片上的修改仅供查看,不做修改)
修改配置文件图三(图片上的修改仅供查看,不做修改)
修改配置文件图四(图片上的修改仅供查看,不做修改)
修改配置文件图五(图片上的修改仅供查看,不做修改)
6)56主机上修改配置文件。
56]# cd /usr/local/mycat/conf
56conf]# vim schema.xml
7 <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /> //dataNode="dn1,dn2,dn3"代表数据库,有几个数据库就写几个dn....。
8
9 <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> //dataNode="dn1,dn2,dn3"代表数据库,有几个数据库就写几个dn....。
10 <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> //dataNode="dn1,dn2,dn3"代表数据库,有几个数据库就写几个dn....。
12 <table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3“
13 rule="mod-long" /> //dataNode="dn1,dn2,dn3"代表数据库,有几个数据库就写几个dn....。
14 <table name="employee" primaryKey="ID" dataNode="dn1,dn2,dn3"
15 rule="sharding-by-intfile" /> //dataNode="dn1,dn2,dn3"代表数据库,有几个数据库就写几个
16 <table name="customer" primaryKey="ID" dataNode="dn1,dn2,dn3"
17 rule="sharding-by-intfile"> //dataNode="dn1,dn2,dn3"代表数据库,有几个数据库就写几个
..........
<dataHost >
.........
27 <dataNode name="dn1" dataHost="localhost53" database="db3" /> //在53创建的数据库
28 <dataNode name="dn2" dataHost="localhost54" database="db2" /> //在54创建的数据库
29 <dataNode name="dn3" dataHost="localhost55" database="db1" /> //在55创建的数据库
</dataHost> //代表一个数据库服务器
31 <dataHost name="localhost53" maxCon="1000" minCon="10" balance="0" // name="localhost53"代表主机53,只是一个标识。
32 writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
33 <heartbeat>select user()</heartbeat>
34 <writeHost host="hostM1" url="192.168.4.53:3306" user="roota"
35 password="123@qq.Com"> //数据库服务器的IP、端口、用户、密码
36 </writeHost>
37 </dataHost>
38
39 <dataHost name="localhost54" maxCon="1000" minCon="10" balance="0"
40 writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> // name="localhost54"代表主机54,只是一个标识。
41 <heartbeat>select user()</heartbeat>
42 <writeHost host="hostM1" url="192.168.4.54:3306" user="roota" //数据库服务器的IP、端口、用户、密码
43 password="123@qq.Com">
44 </writeHost>
45 </dataHost>
46
47 <dataHost name="localhost55" maxCon="1000" minCon="10" balance="0"
48 writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> // name="localhost55"代表主机53,只是一个标识。
49 <heartbeat>select user()</heartbeat>
50 <writeHost host="hostM1" url="192.168.4.55:3306" user="roota"
51 password="123@qq.Com"> //数据库的IP、用户、密码
52 </writeHost>
53 </dataHost>
7)添加PATH路径(可不用)
56 conf]# export PATH=/usr/local/mycat/bin:$PATH
56 conf]# echo "PATH=/usr/local/mycat/bin:$PATH" >> /etc/profile
56 conf]# source /etc/profile
56 conf]# echo $PATH
/usr/local/mycat/bin:/usr/local/mycat/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
56 conf]# which mycat
/usr/local/mycat/bin/mycat
8)启动服务并查看端口
56 conf]# /usr/local/mycat/bin/mycat start
Starting Mycat-server...
56 conf]# netstat -antup | grep :8066
tcp6 0 0 :::8066 :::* LISTEN 6421/java
[root@mycat conf]# ps -C java
PID TTY TIME CMD
6421 ? 00:00:04 java
9)客户端验证:
客户端50连接分片服务器访问数据
50]# mysql -h192.168.4.56 -P8066 -u root -p123456;
mysql> show databases;
mysql> use testdb;
mysql> create table employee(
> ID int primary key auto_increment,
> sharding_id int,
> name char(30),
> age int);
mysql> desc employee;
mysql> insert into employee(sharding_id,name,age) values(10000,"bob",19); //插入的数据库存储在53
mysql> insert into employee(sharding_id,name,age) values(10010,"fanny",19); //插入的数据库存储在54
select * from employee;
10)修改56主机分片规则配置文件,让数据库可以分片存储到服务55里
56]# /usr/local/mycat/bin/mysqlcat stop
56]# vim /usr/local/mycat/conf/partition-hash-int.txt
10000=0
10010=1
10020=2
partition-hash-int.txt //设置分片规则的配置文件,规则为枚举算法。
枚举类型算法:
10000=0 //代表数据存储在数据服务器53
10010=1 //代表数据存储在数据服务器54
10020=2 //代表数据存储在数据服务器55
56]# /usr/local/mycat/bin/mysqlcat start
56]# ss -unptl | grep 8066
50]# mysql -h192.168.4.56 -P8066 -u root -p123456
mysql> create table company(ID int primary key auto_increment,name char(30));
Query OK, 0 rows affected (0.77 sec)
mysql> desc company;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| name | char(30) | YES | | NULL | |
+-------+----------+------+-----+---------+----------------+
55 ~]# mysql -u root -p123@qq.Com
mysql> use db1;
Database changed
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| company |
| employee |
+---------------+
2 rows in set (0.00 sec)
53 ~]# mysql -u root -p123@qq.Com
mysql> use db2;
Database changed
mysql> show tables;
+---------------+
| Tables_in_db2 |
+---------------+
| company |
| employee |
+---------------+
2 rows in set (0.00 sec)55 ~]# mysql -u root -p123@qq.Com
mysql> use db3;
Database changed
mysql> show tables;
+---------------+
| Tables_in_db3 |
+---------------+
| company |
| employee |
+---------------+
2 rows in set (0.00 sec)
11)创建表指定余数存储到数据库服务器
56]# mysql -h192.168.4.56 -u root -p123456
mysql> create table hotnews(id int,name char(30));
Query OK, 0 rows affected (0.98 sec)
mysql> insert into hotnews(id,name) values(10,"qq"),(8,"oo"),(12,"uu");
Query OK, 3 rows affected (0.37 sec)
55]# mysql -u root -p123@qq.Com
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| company |
| employee |
| employee02 |
| hotnews |
+---------------+
4 rows in set (0.00 sec)
mysql> select * from hotnews;
+------+------+
| id | name |
+------+------+
| 8 | oo |
+------+------+
1 row in set (0.00 sec)
54]# mysql -u root -p123@qq.Com
mysql> show tables;
+---------------+
| Tables_in_db2 |
+---------------+
| company |
| employee |
+---------------+
2 rows in set (0.00 sec)
mysql> select * from hotnews;
±-----±-----+
| id | name |
±-----±-----+
| 10 | qq |
±-----±-----+
1 row in set (0.00 sec)
53]# mysql -u root -p123@qq.Com
mysql> show tables;
±--------------+
| Tables_in_db3 |
±--------------+
| company |
| employee |
±--------------+
2 rows in set (0.00 sec)
mysql> select * from hotnews;
±-----±-----+
| id | name |
±-----±-----+
| 12 | uu |
±-----±-----+
1 row in set (0.00 sec)