• 分库分表


                                                              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;

  • 相关阅读:
    java实现LFU算法
    2.1 测试函数-Rastrigin函数
    VM虚拟机如何与主机共享文件夹
    .bashrc文件和.bash_profile文件的区别
    1.2 准备工作
    1.1 JSOP架构
    vue中页面跳转拦截器的实现方法
    Javascript性能优化阅读笔记
    理解 e.clientX,e.clientY e.pageX e.pageY e.offsetX e.offsetY
    Vue.directive()的用法和实例
  • 原文地址:https://www.cnblogs.com/qingbai/p/12015640.html
Copyright © 2020-2023  润新知