MySQL分库分表

一、介绍两种拆分方式

    • 垂直分库

不同的表存到不同的服务器当中

2.垂直分表

一张表不同的字段分到不同的服务器当中(表格垂直分下来,左右字段分开)

    • 水平分库

将一个数据库拆分到多个服务器中(每个服务器的表相同)

    • 水平分表

将一个表的数据拆分到多个表中(每个服务器的字段名相同)

二、Mycat概述

查看MySQL是否运行

systemctl status mysqld

(一)下载上传

服务器中要安装好MySQL、JDK、Mycat

Mycat下载地址http://www.mycat.org.cn/

Mycat云盘下载https://www.aliyundrive.com/s/urAAgT1HUQh

上传JDK、Mycat到服务器

(二).安装jdk

    • 解压jak 到 /usr/local目录中

tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local

在/usr/local目录下就可以看见解压后的jdk1.8.0_171

2.配置环境变量

进入profile配置vim /etc/profile

添加

JAVA_HOME=/usr/local/jdk1.8.0_171
PATH=$JAVA_HOME/bin:$PATH

3. 重新加载profile文件

source /etc/profile

4. 检查安装是否成功

java -version

(三)安装Mycat

    • 解压

tar -zxvf Mycat-server-1.6.7.3-release-20210913163959-linux.tar.gz -C /usr/local/

出现mycat,进入mycat就可以看到文件了

bin:存放可执行文件,用于启动停止mycat

conf:存放mycat的配置文件

lib:存放mycat的项目依赖包(jar)(架包)

logs:存放mycat的日志文件

    • 如果您的MySQL是高版本,则要将lib目录下的mysql-connector-java-5.1.35.jar更换为新的jar

mysql-connector-java下载连接:MySQL :: Download Connector/J

1.删掉
rm -rf mysql-connector-java-5.1.35.jar
2.上传一份高版本的在这个目录下
3.授权
chmod 777 mysql-connector-java-8.0.22.jar

三、Mycat入门

1.项目需求

由于tborder 表中数据量很大,磁盘10及容量都到达了瓶颈,现在需要对 tb order表进行数据分片,分为三个数据节点,每一个节点主机位于不同的服务器上,具体的结构,参考下图:水平分表

2. 创建数据库

在各个服务器中,创建好db01的数据库

3.修改配置schema.xml

修改配置可以用Notepad++ 编辑这个文件

/usr/local/mycat/conf/schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="DB01" checkSQLschema="true" sqlMaxLimit="100">
        <table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
    </schema>
    
    <dataNode name="dn1" dataHost="dhost1" database="db01" />
    <dataNode name="dn2" dataHost="dhost2" database="db01" />
    <dataNode name="dn3" dataHost="dhost3" database="db01" />
    
    <dataHost name="dhost1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        
        <writeHost host="master" url="jdbc:mysql://192.168.200.210:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234" />
    </dataHost>
    
    <dataHost name="dhost2" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        
        <writeHost host="master" url="jdbc:mysql://192.168.200.213:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234" />
    </dataHost>
    
    <dataHost name="dhost3" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        
        <writeHost host="master" url="jdbc:mysql://192.168.200.214:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234" />
    </dataHost>
</mycat:schema>

4.server.xml配置

修改用户名密码,添加DB01这张逻辑表

<user name="root" defaultAccount="true">
        <property name="password">123456</property>
        <property name="schemas">DB01</property>
        
        <!-- 表级 DML 权限设置 -->
        <!--         
        <privileges check="false">
            <schema name="TESTDB" dml="0110" >
                <table name="tb01" dml="0000"></table>
                <table name="tb02" dml="1111"></table>
            </schema>
        </privileges>        
         -->
    </user>

    <user name="user">
        <property name="password">123456</property>
        <property name="schemas">DB01</property>
        <property name="readOnly">true</property>
    </user>

5.启动服务

Mycat启动后,占用端口号8066

#启动 /usr/local/mycat/

bin/mycat start

查看wrapper.log日志 切换到路径cd /usr/local/mycat/

tail -f logs/wrapper.log

最底部如果显示 MyCAT Server startup successfully.则表达Mycat正常启动

#停止 =====省略

bin/mycat stop

登录Mycat --确认打开8066端口号

mysql -h 121.37.20.23 -P 8066 -uroot -p123456

连接进入 ,显示有Server version: 5.6.29-mycat-1.6.7.3-release-20210913163959 MyCat Server (OpenCloudDB)

6.在mycat中创建一张表

CREATE TABLE TB_ORDER (
id BIGINT(20) NOT NULL,
title VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO TB_ORDER(id,title) VALUES(1,'goods1');
INSERT INTO TB_ORDER(id,title) VALUES(2,'goods2');
INSERT INTO TB_ORDER(id,title) VALUES(3,'goods3');
INSERT INTO TB_ORDER(id,title) VALUES(1000000,'goods1000000');
INSERT INTO TB_ORDER(id,title) VALUES(10000000,'goods10000000');

创建完成后,插入数据查看各个数据库的数据分布情况

四、Mycat配置

schema.xml

schema.xml作为MyCat中最重要的配置文件之一,涵盖了MyCat的逻辑库、逻辑表、分片规则、分片节点及数据源的配置。

主要包含以下三组标签:

1. schema标签 逻辑库逻辑表

    <schema name="DB01" checkSQLschema="true" sqlMaxLimit="100">
        <table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
    </schema>

schema 标签用于定义 MyCat实例中的逻辑库,一个MvCat实例中,可以有多个逻辑库,可以通过 schema 标签来划分不同的逻辑库,MyCat中的逻辑库的概念,等同于MySQL中的database概念,需要操作某个逻辑库下的表时,也需要切换逻辑库(use xxX)。

核心属性:

name: 指定自定义的逻辑库库名

checkSOLschema: 在SOL语句操作时指定了数据库名称,执行时是否自动去除;true: 自动去除,false: 不自动去。true可以不用 use DB01 进入数据库,直接select * from DB01.TB_ORDER

sglMaxLimit: 如果未指定limit进行查询,列表查询模式查询多少条记录。默认一次性只能查一百条

schema标签(table)

table 标签定义了MyCat中逻辑库schema下的逻辑表所有需要拆分的表都需要在table标签中定义

核心属性:

name: 定义逻辑表表名,在该逻辑库下唯一

dataNode: 定义逻辑表所属的dataNode,该属性需要与dataNode标签中name对应; 多个dataNode逗号分隔rule: 分片规则的名字,分片规则名字是在rule.xml中定义的

primaryKey: 逻辑表对应真实表的主键

type: 逻辑表的类型,目前逻辑表只有全局表和普通表,如果未配置,就是普通表;全局表,配置为 global

2. datanode标签 数据节点

    <dataNode name="dn1" dataHost="dhost1" database="db01" />
    <dataNode name="dn2" dataHost="dhost2" database="db01" />
    <dataNode name="dn3" dataHost="dhost3" database="db01" />

dataNode标签中定义了MyCat中的数据节点,也就是我们通常说的数据分片。一个dataNode标签就是一个独立的数据分片。

核心属性:

name: 定义数据节点名称

dataHost: 数据库实例主机名称,引用自 dataHost 标签中name属性

database: 定义分片所属数据库

3.datahost标签 节点主机、数据源

    <dataHost name="dhost1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>        
        <writeHost host="master" url="jdbc:mysql://121.37.20.23:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="root" />
    </dataHost>

该标签在MyCat逻辑库中作为底层标签存在,直接定义了具体的数据库实例、读写分离、心跳语句。

核心属性:

name: 唯一标识,供上层标签使用

maxCon/minCon: 最大连接数/最小连接数

balance: 负载均衡策略,取值 0,1,2,3writeType: 写操作分发方式(0: 写操作转发到第一个

writeHost,第一个挂了,切换到第二个,1: 写操作随机分发到配置的writeHost)

dbDriver: 数据库驱动,支持 native、jdbc

rule.xml

    <tableRule name="auto-sharding-long">
        <rule>
            <columns>id</columns>
            <algorithm>rang-long</algorithm>
        </rule>
    </tableRule>
    <function name="rang-long"
        class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">autopartition-long.txt</property>
    </function>

rule.xml中定义所有拆分表的规则,在使用过程中可以灵活的使用分片算法,或者对同一个分片算法使用不同的参数,它让分片过程可配置化。主要包含两类标签: tableRule、Function。

server.xml

详细的server配置详情 在网盘:https://www.aliyundrive.com/s/urAAgT1HUQh中“server系统配置信息含义” 有详细的介绍

server.xml配置文件包含了MyCat的系统配置信息,主要有两个重要的标签:system、user

五、Mycat分片

分片规则

rule引用rule.xml

rule.xml存放有很多写好的分别策略

(一)垂直拆分

1.项目需求

2.垂直拆分配置

schema.xml

server.xml加上逻辑数据库名字

重启mycat(关闭,开启)在mycat页面

bin/mycat stop
bin/mycat start

查看mycat日志

tail -f logs/wrapper.log

3.创建表结构

上传sql脚本(创建表格、插入数据)(网盘有)

shopping-table.sql

shopping-insert.sql

创建表格

source /root/shopping-table.sql

可以看到不同的表存放到不同的服务器中的

插入数据

source /root/shopping-insert.sql

完成!

4.多表联查

需要把要跨服务器的多表联查的表格设置为全局表(每个服务器都存在这几张表)

如设置省市区tb_areas_provinces , tb_areas_city , tb_areas_region为全局表,那么每台服务器中都会存在着三张表,就可以实现与这三张表的多表联查了。

1.修改schema.xml

dataNode="dn1,dn2,dn3" 分布到每一台服务器

添加type="global" 多表联查

<table name="tb_areas_provinces" dataNode="dn1,dn2,dn3" primaryKey="id" type="global" />
<table name="tb_areas_city" dataNode="dn1,dn2,dn3"  primaryKey="id"  type="global" />
<table name="tb_areas_region" dataNode="dn1,dn2,dn3"  primaryKey="id"  type="global" />
2. 停止mycat
3.把服务器中的表结构先全部清空
4.重启mycat
5.查看日志是否错误
6.重新导入表结构、数据

(二)水平拆分

    • 项目需求

分别在三台MySQL中创建数据库itcast。

2.配置

配置与垂直拆分一样

重启mycat,导入表格、数据

(三)分片规则

1.范围auto-sharding-log

2.取模 mod_long

3.一致性hash sharding-by-murmur

4. 枚举 sharding-by-intfile-enumstatus

(适用于按照 省份、性别、状态拆分数据等业务)

5.应用指定 sharding-by-substring

应用指定(根据字符串子串(必须是数字))01****:0 、 02****:1

6. 固定分片hash算法 sharding-by-long-hash

该算法类似于十进制的求模运算,但是为二进制的操作,例如,取 id 的二进制低 10 位与 1111111111 进行位&运算。

7.字符串hash sharding-by-strtringhash

8.日期分片 sharding-by-date

9.按月分片 sharding-by-month

六、Mycat管理及监控

命令行管理

Mycat默认开通2个端口,可以在server.xml中进行修改。

8066数据访问端口,即进行DML和DDL操作。

9066数据库管理端口,即mycat 服务管理控制功能,用于管理mycat的整个集群状态

mysql -h 121.37.20.23 -P 9066 -uroot -p12346

Mycat-eye管理

Mycat-web(Mycat-eye)是对mycat-server提供监控服务,功能不局限于对mycat-server使用。他通过JDBC连接对Mycat、Mysql监控监控远程服务器(目前仅限于linux系统)的cpu、内存、网络、磁盘。Mycat-eye运行过程中需要依赖zookeeper,因此需要先安装zookeeper。

安装

Zookeeper安装

MyCat-web安装

网盘MyCat-Web安装文档有安装文档


安装Zookeeper

A. 上传安装包

zookeeper-3.4.6.tar.gz

B. 解压

    tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local/  

C. 创建数据存放目录

    cd /usr/local/zookeeper-3.4.6/
    mkdir data

D. 修改配置文件名称并配置

  cd conf
   mv zoo_sample.cfg zoo.cfg

E. 配置数据存放目录

    vim zoo.cfg
    dataDir=/usr/local/zookeeper-3.4.6/data

dataDir的路径在 C. 创建数据存放目录 中创建的文件目录

F. 启动Zookeeper

cd .. 退出到zookeeper安装目录

    bin/zkServer.sh start

查看是否启动成功

   bin/zkServer.sh status

看到Mode: standalone表示启动成功

安装Mycat-web

A. 上传安装包

Mycat-web.tar.gz

B. 解压

    tar -zxvf Mycat-web.tar.gz -C /usr/local/

C. 目录介绍

etc ----> jetty配置文件

lib ----> 依赖jar包

mycat-web ----> mycat-web项目

readme.txt

start.jar ----> 启动jar

start.sh ----> linux启动脚本

C1.修改

如果不是本机地址

  cd mycat-web/
  vim WEB-INF/classes/mycat.properties

把zookeeper=localhost:2181中的localhost修改为自己的ip地址

D. 启动

   cd /usr/local/mycat-web
    sh start.sh

访问查看

浏览器搜索

ip:8082/mycat

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值