MySQL分库分表详解

一 分库分表
1 什么是分库分表
– 将存放在一个数据库(主机)中的数据,按照特定方式进行拆分,分散存放到多个数据库(主机)中,以达到分散单台设备负载的效果。

2 垂直分隔
1) 纵向切分(分多个表)
–将单个表,拆分成多个表,分散到不同的数据库
–将单个数据库的多个表进行分类,按业务分类分散到不同的数据库上。

3 水平分隔
1) 横向切分(一个表分行)
–按照表中的某个字段的某种规则,把表中的许多记录按行切分,分散到多个数据库中

二 maycat软件介绍:
1 mycat 是基于java的分布式数据库系统中间层,为高并发的分布式访问提供解决方案
– 支持JDBC形式连接
– 支持mysql,oracle,sqlserver,mongodb等
– 可以实现数据库服务器的高可用
– 提供数据读写分离服务
– 提供数据分片服务
– 基与阿里巴巴Cobar进行研发的开源软件
– 适合数据大量写入的数据存储需求

  1. 分片规则:
    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
–环境: --数据库服务器2台 192.168.4.54 192.168.4.55
–Mycat服务器1台 192.168.4.57
–客户端 192.168.4.50
–2台数据库服务器安装mysql即可,不要开主从

1 查看Mycat主机的java环境(因为Mycat是基于java开发的,所以需要jave环境的支持)

[root@mycat57 ~]# 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

[root@mycat57 ~]# 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包

[root@mycat57 ~]# tar -xf Mycat-server-1.4-beta-20150604171601-linux.tar.gz  

3 将主配置文件移动到/usr/local/下

[root@mycat57 ~]# mv  mycat/ /usr/local/
[root@mycat57 ~]# cd /usr/local/mycat/
[root@mycat57 mycat]# ls
bin  catlet  conf  lib  logs  version.txt

4 Mycat目录结构说明
–bin //mycat 命令,如启动 停止等
–catlet //扩展文件
– conf //配置文件
–lib //mycat使用的jar
–log //mycat启动日志和运行日志
–wrapper.log //mycat服务启动日志
–mycat.log //记录SQL脚本执行后报错的信息

5 重要配置文件说明:
–server.xml 设置连接mycat的帐号信息
–schema.xml 配置mycat的真实库表
–rule.xml 定义mycat分片规则

6 配置标签说明:
<user……</user 定义连mycat用户信息
<datanode……</datanode 指定数据节点
<datahost……</datahost 指定数据库地址及用户信息

7 配置57server.xml:

[root@mycat57 conf]# vim server.xml
34         <user name="admin">
35                 <property name="password">123456</property>
36                 <property name="schemas">TESTDB</property>
37         </user>
38 
39         <user name="user">
40                 <property name="password">user</property>
41                 <property name="schemas">TESTDB</property>
42                 <property name="readOnly">true</property>

8 修改57主配置文件schema.xml

[root@mycat57 conf]# vim schema.xml
<schema
此标签对内的dn3去掉
</schema>

    删除39行的datanode
    37行 dataHost=mysql54
    38行 dataHost=mysql55
     37         <dataNode name="dn1" dataHost="mysql54" database="db1" />
     38         <dataNode name="dn2" dataHost="mysql55" database="db2" />
    ----- 去54上建立数据库db1  去55上创建数据库db2
    
42         <dataHost name="mysql54" maxCon="1000" minCon="10" balance="0"
43                 writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
44                 <heartbeat>select user()</heartbeat>
45                 <writeHost host="hostM1" url="192.168.4.54:3306" user="plj"
46                         password="123456">

47                 </writeHost>
48         </dataHost>
49 
50         <dataHost name="mysql55" maxCon="1000" minCon="10" balance="0"
51                 writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
52                 <heartbeat>select user()</heartbeat>
53                 <writeHost host="hostM2" url="192.168.4.55:3306" user="plj"
54                         password="123456">
55                 </writeHost>
56         </dataHost>

四 主机54 55数据库上授权用户plj 密码为123456 用于mycat登录2台数据库。

1)修改数据库配置文件针对数据库表名忽略大小写

[root@mysql54 mysql]# vim /etc/my.cn
[mysqld]
lower_case_table_names = 1

2)用户授权:用于mycat登录数据库

mysql> grant all on *.* to plj@"%" identified by "123456";

3)54 上创建数据库db1 在55上创建数据库db2

4) 启动服务

 [root@mycat57 ~]# /usr/local/mycat/bin/mycat start
 [root@mycat57 ~]# ss -antulp | grep 8066
tcp    LISTEN     0      100      :::8066                 :::*                   users:(("java",pid=1376,fd=49))

注意:启动mycat时,发现8066端口查询不到,查看日志

[root@mycat57 bin]# cat /usr/local/mycat/logs/wrapper.log
ERROR  | wrapper  | 2018/11/28 17:23:28 | JVM exited while loading the application.
INFO   | jvm 1    | 2018/11/28 17:23:28 | OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0
INFO   | jvm 1    | 2018/11/28 17:23:28 | OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000aaaa0000, 1431699456, 0) failed; error='Cannot allocate memory' (errno=12)

信息提示无法分配内存,于是在57虚拟机上加入一块磁盘,重启虚拟机,然后就可以正常启动mycat服务了

五 客户端测试:
服务端50登录mycat服务器

[root@mysql50 ~]# mysql -h192.168.4.57 -P8066 -uadmin -p123456
    mysql> show databases;
    +----------+
    | DATABASE |
    +----------+
    | TESTDB   |
    +----------+
    
mysql> use TESTDB;

mysql> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| company          |
| customer         |
| customer_addr    |
| employee         |
| goods            |
| hotnews          |
| orders           |
| order_items      |
| travelrecord     |
+------------------+
9 rows in set (0.00 sec)
#######################################################

1 创建employee 表(枚举法)

mysql> create table employee(id int primary key auto_increment,name varchar(12),sharding_id int);

具体查看步骤:
第一步:查询到这个表的规则:

[root@mycat57 conf]# vim schema.xml
                <table name="employee" primaryKey="ID" dataNode="dn1,dn2"
                        rule="sharding-by-intfile" />

第二步:进入规则表查看具体规则的要求

[root@mycat57 conf]# vim rule.xml
        <tableRule name="sharding-by-intfile">
                <rule>
                        <columns>sharding_id</columns>
                        <algorithm>hash-int</algorithm>
                </rule>
        </tableRule>

        <function name="hash-int"
                class="org.opencloudb.route.function.PartitionByFileMap">
                <property name="mapFile">partition-hash-int.txt</property>
        </function>

第三步:根据指引文件查看具体的值

[root@mycat57 conf]# cat partition-hash-int.txt
10000=0             
10010=1
//创建employee必须要有字段sharding_id ,插入数据为此字段赋值10000的数据
 会被存放到54数据库上去,赋值为10010的数据会被存放到55数据库上去。

2 插入数据:

 mysql> insert into employee(name,sharding_id) values ("tom",10000),("kenji",10010);

3 进入54主机查看数据:数据被存放到db1数据库中的employee表中

mysql> select * from employee;
+----+------+-------------+
| id | name | sharding_id |
+----+------+-------------+
|  1 | tom  |       10000 |
+----+------+-------------+

4 进入55主机查看数据:数据被存放到db2数据库中的employee表中

mysql> select * from employee;
+----+-------+-------------+
| id | name  | sharding_id |
+----+-------+-------------+
|  1 | kenji |       10010 |
+----+-------+-------------+

################################################
1 创建表travelrecord :(范围约定)

mysql> create table travelrecord(id int,name varchar(12));

具体查看步骤:
第一步:查询到这个表的规则:

[root@mycat57 conf]# vim schema.xml
<table name="travelrecord" dataNode="dn1,dn2" rule="auto-sharding-long" />

第二步:进入规则表查看具体规则的要求

[root@mycat57 conf]# vim rule.xml
<tableRule name="auto-sharding-long">
                <rule>
                        <columns>id</columns>
                        <algorithm>rang-long</algorithm>
                </rule>
        </tableRule>

<function name="rang-long"
                class="org.opencloudb.route.function.AutoPartitionByLong">
                <property name="mapFile">autopartition-long.txt</property>
        </function>

第三步:根据指引文件查看具体的值
[root@mycat57 conf]# vim autopartition-long.txt
 range start-end ,data node index
 K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2
 //创建travelrecord必须要有字段id ,插入数据为此字段赋值0-500000的数据会被存放到54数据库上去,赋值为的500001-10000000数据会被存放到55数据库上去。

2 插入数据:

mysql> insert into travelrecord(id,name) values (5500000,"tom");
Query OK, 1 row affected (0.05 sec)

mysql> insert into travelrecord(id,name) values (50000,"tom");
Query OK, 1 row affected (0.07 sec)

3 进入54主机查看数据:数据被存放到db1的travelrecord表中

 mysql> select * from travelrecord;
+-------+------+
| id    | name |
+-------+------+
| 50000 | tom  |
+-------+------+
1 row in set (0.00 sec)

4 进入55主机查看数据:数据被存放到db2数据库中的travelrecord表中

  mysql> select * from travelrecord;
+---------+------+
| id      | name |
+---------+------+
| 5500000 | tom  |
+---------+------+
1 row in set (0.00 sec)

猜你喜欢

转载自blog.csdn.net/weixin_42104231/article/details/84592769