17.运维—分库分表

目录

介绍

问题分析

拆分策略

垂直拆分

水平拆分

实现技术

Mycat概述

介绍

下载

安装

目录结构

概念介绍

Mycat入门

需求

环境准备

分片配置

启动服务

分片测试

Mycat配置

schema.xml

schema标签

 schema标签(table)

dataNode标签

dataHost标签

rule.xml

Server.xml

system标签

user标签

Mycat分片

垂直拆分

场景

准备

配置

测试

全局表配置

水平拆分

场景

准备 

配置

测试 

分片规则——范围

分片规则——取模

分片规则——一致性hash

分片规则——枚举

分片规则——应用指定

分片规则——固定分片hash算法

分片规则——字符串hash解析

分片规则——按(天)日期分片

分片规则——自然月

Mycat管理及监控

MyCat原理

MyCat管理

Mycat-eye

介绍

安装

访问

配置


介绍

问题分析

 随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈:

  1. IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较低。请求数据太多,带宽不够,网络IO瓶颈。
  2. CPU瓶颈:排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源,请求数太多,CPU出现瓶颈。

分库分表的中心思想都是将数据分散存储,使得单一数据库/表的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的。 

拆分策略

垂直拆分

 

水平拆分

实现技术

shardingJDBC:基于AOP原理,在应用程序中对本地执行的SQL进行拦截,解析、改写、路由处理。需要自行编码配置实现,只支持java语言,性能较高。

MyCat:数据库分表中间件,不用调整代码即可实现分库分表,支持多种语言,性能不及前者。


Mycat概述

介绍

Mycat是开源的、活跃的、基于Java语言编写的MySQL数据库中间件。可以像使用mysql一样来使用mycat,对于开发人员来说根本感觉不到mycat的存在。

 

优势:

  • 性能可靠稳定
  • 强大的技术团队
  • 体系完善
  • 社区活跃

下载

安装

Mycat是采用java语言开发的开源的数据库中间件,支持Windows和Linux运行环境,下面介绍Mycat的Linux中的环境搭建。我们需要在准备好的服务器中安装如下软件。

  • MySQL
  • JDK
  • MyCat
服务器安装软件说明
192.168.200.210JDK、MycatMyCat中间件服务器
192.168.200.210MySQL分片服务器
192.168.200.213MySQL分片服务器
192.168.200.214MySQL分片服务器

目录结构

  •  bin:存放可执行文件,用于启动停止mycat
  • conf:存放mycat的配置文件
  • lib:存放mycat的项目依赖包(jar)
  • logs:存放mycat的日志文件

概念介绍


Mycat入门

需求

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

(表结构是一样的,数据是不一样的————水平分表)

环境准备

 step1.检查防火墙

step2.连接三个数据库,并创建db01 

 step3.配置mycat(分片配置)

分片配置

 

启动服务

 切换到MyCat的安装目录,执行如下指令,启动MyCat:

--启动
bin/mycat start
--停止
bin/mycat stop

启动完毕之后,可以查看logs目录下的启动日志,查看MyCat是否启动完成。

分片测试

通过如下指令,就可以连接并登陆MyCat。

mysql -h 192.168.200.210 -P 8066 -uroot -p123456

 

 

 

 

 

数据是怎么分布在这三个数据库中?

在schema.xml中节点rule在控制 ,节点rule与rule.xml相关联

 

 

 

 

 

 

 

 

 


Mycat配置

schema.xml

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

主要包含以下三组标签:

  • schema标签
  • datanode标签
  • datahost标签

schema标签

schema标签用于定义MyCat实例中的逻辑库,一个MyCat实例中,可以有多个逻辑库,可以通过schema标签来划分不同的逻辑库。

MyCat中的逻辑库的概念,等同于MySQL中的database概念,需要操作某个逻辑库下的表时,也需要切换逻辑库(use xxx)。

核心属性:

  • name:指定自定义的逻辑库库名
  • checkSQLschema:在SQL语句操作时指定来数据库名称, 执行时是否自动去除;true:自动去除;false:不自动去除
  • sqlMaxLimit:如果未指定limit进行查询,列表查询模式查询多少条记录。

 schema标签(table)

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

核心属性:

  • name:定义逻辑表表名,在该逻辑库下唯一
  • dataNode:定义逻辑表所属的dataNode,该属性需要在dataNode标签中name对应;多个dataNode逗号分隔
  • rule:分片规则的名字,分片规则名字是在rule.xml中定义的
  • primaryKey:逻辑表对应真实表的主键
  • type:逻辑表的类型,目前逻辑表只有全局表和普通表,如果未配置,就是普通表;全局表,配置为global

dataNode标签

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

核心属性:

  • name:定义数据节点名称
  • dataHost:数据库实例主机名称,引用自dataHost标签中name属性
  • database:定义分片所属数据库

dataHost标签

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

核心属性:

  • name:唯一标识,供上层标签使用
  • maxCon/minCon:最大连接数/最小连接数
  • balance:负载均衡策略,取值0,1,2,3
  • writeType:写操作分布方式(0:写操作转发到第一个writeHost,第一个挂了,切到到第二个;1:写操作随机分发到配置的writeHost)
  • dbDriver:数据库驱动,支持native、jdbc

rule.xml

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

 

Server.xml

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

system标签

对应的系统配置项及其含义,参考资料。 

属性取值含义
1charsetutf8设置MyCat的字符集,字符集需要与MySQL的字符集保持一致
2nonePasswordLogin0,10为需要密码登陆,1为不需要密码登陆,默认为0,设置为1则需要指定默认账户
3

useHandshakeV10

0,1 使用该选项主要的目的是为了能够兼容高版本的jdbc驱动,是否采用HandshakeV10Packet来与client进行通信,1:是,0:否
4useSqlStart0,1 开启SQL实时统计,1为开启,0为关闭;开启之后,Mycat会自动统计SQL语句的执行情況:mysql -h 127.0.0.1 -P 9066-u root -p 査看MyCat 执行的SQL, 抗行效率比较低的SQL,SQL的整体执行情況、读写比例等:show @@sql; show @@sql.slow; show @@sql.sum
5useGlobleTableCheck0,1 是否开启全局表的一致性检测。1为开启 ,0为关闭。
6sq|ExecuteTimeout1000SQL语句执行的超时时间,单位为s;
7sequnceHandlerType0,1,2用来指定MyCat全局序列类型,0为本地文件,1 为数据库方式,2为时间戳列方式,默认使用本地文件方式,文件方式主要用于测试
8sequnceHandlerPattern正则表达式必须带有MYCATSEQ或者mycatseq进行序列匹配流程注意MYCATSEQ_有空格的情况
9subqueryRelationshipCheck true,false子查询中存在关联查询的情况下,检查关联字段中是否有分片字段。默认false
10useCompression0,1开启mysql压缩协议,0:关闭,1:开启
11fakeMySQLVersion5.5,5.6设置模拟的MySQL版本号
12defaultSqlParser由于Mycat的最初版本使用了FoundationDB的SQL解析器,在MyCat1.3后增加了Druid解析器,所以要设置defaultSqlParser属性来指定默认的解析器;解析器有两个:druidparser 和 fdbparser,在MyCat1.4之后,默认是druidparser, fdbparser巳经废除了
13processors1,2...指定系统可用的线程数量,默认值为CPU核心x每个核心运行线程数量;processors 会影响processorBufferPool, processorBufferLocalPercent,processorExecutor属性,所有,在性能调优时,可以适当地修改processors值
14processorBufferChunk指定每次分配Socket Direct Buffer默认值为4096字节,也会影响BufferPool长度,如果一次性获取字节过多而导致buffer不够用,则会出现警告,可以调大该值
15processorExecutor指定NIOProcessor上共享businessExecutor固定线程池的大小;MyCat把异步任务交给businessExecutor线程池中,在新版本的MyCat中这个连接池使用频次不高,可以适当地把该值调小
16packetHeaderSize指定MySQL协议中的投文头长度,默认4个字节
17maxPacketSize指定MySQL协议可以携带的数据最大大小,默认值16M
18idleTimeout30指定连接的空闲时间的超时长度;如果超时,将关闭资源井回收,默认30分钟
19txIsolation1,2,3,4初始化前端连接的事务隔离级别,默认为REPEATED_READ,对应数宇为3READ_UNCOMMITED=1; READ_COMMITTED=2; REPEATED_READ=3;ISERIALIZABLE=4;
20sqlExecuteTimeout300执行SQL的超时时间,如果SQL语句执行超时,将关闭连接;默认300秒
21serverPort8066定义MyCat的使用端口,默认8066
22managerPort9066定义MyCat的管理端口,默认9066

user标签


Mycat分片

垂直拆分

场景

在业务系统中,涉及以下表结构,但是由于用户与订单每天都会产生大量的数据,单台服务器的数据存储及处理能力是有限的,可以对数据库表进行拆分,原有的数据库表如下。

准备

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

配置

 

测试

在mycat的命令行中,通过source指令导入表结构,以及对应的数据,查看数据分布情况。

source /root/shopping-table.sql
source /root/shopping-insert.sql

查询用户的收件人及收件人地址信息(包含省、市、区)。

select ua.user_id,ua.contact,p.province,c.city,r.area,ua.address from tb_user_address ua,tb_areas_city c,tb_areas_provinces p,tb_areas_region r where ua.province_id=p.provinceid and ua.city_id=c.cityid and ua.town_id=r.areaid;

 

查询每一笔订单及订单的收件地址信息(包含省、市、区)。

select order_id,payment,receiver,province,city,area from tb_order_master o,tb_areas_provinces p,tb_areas_city c,tb_areas_region r where o.receiver_province=p.provinceid and o.receiver_city=c.cityid and o.receiver_region=r.areaid;

全局表配置

对于省、市、区/县表tb_areas_provinces,tb_areas_city,tb_areas_region,是属于数据字典表,在多个业务模块中都可能会遇到,可以将其设置为全局表,利于业务操作。

在schema.xml里面添加type="global"

 

水平拆分

场景

在业务系统中,有一张表(日志表),业务系统每天都会产生大量的日志数据,单台服务器的数据存储及处理能力是有限的,可以对数据库表进行拆分。

准备 

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

配置

测试 

在mycat的命令行中,执行如下SQL创建表、并插入数据,查看数据分布情况。


分片规则——范围

根据指定的字段及其配置的范围与数据节点的对应情况,来决定该数据属于哪一个分片。

分片规则——取模

根据指定的字段值与节点数量进行求模运算,根据运输结果,来决定该数据属于哪一个分片。

分片规则——一致性hash

所谓一致性哈希,相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加而改变原来数据的分区位置。

分片规则——枚举

通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点上,本规则适用于按照省份、性别、状态拆分数据等业务。

 

分片规则——应用指定

运行阶段由应用自主决定路由到那个分片,直接根据字符子串(必须是数字)计算分片号。

 

分片规则——固定分片hash算法

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

特点: 

  • 如果是求模,连续的值,分别分配到各个不同的分片;但是此算法会将连续的值可能分配到相同的分片,降低事务处理的难度。
  • 可以均匀分配,也可以非均匀分配。
  • 分片字段必须为数字类型。

分片规则——字符串hash解析

截取字符串中的指定位置的子字符串,进行hash算法,算出分片。

 

分片规则——按(天)日期分片

 

分片规则——自然月

使用场景为按照月份来分片,每个自然月为一个分片。

 


Mycat管理及监控

MyCat原理

MyCat管理

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

  • 8066数据访问端口,即进行DML和DDL操作。
  • 9066数据库管理端口,即mycat服务管理控制功能,用于管理mycat的整个集群状态。
mysql -h 192.168.200.210 -p 9066 -uroot -p123456
命令含义
show @@help查看MyCat管理工具帮助文档
show @@version查看MyCat的版本
reload @@config重新加载MyCat的配置文件
show @@datasource查看MyCat的数据源信息
show @@datanode查看MyCat现有的分片节点信息
show @@threadpool查看MyCat的线程池信息
show @@sql查看执行的SQL
show @@datasource查看执行的SQL统计

Mycat-eye

介绍

MyCat-web(MyCat-eye)是对mycat-server提供监控服务,功能不局限于对mycat-server使用。它通过JDBC连接对Mycat、Mysql监控,监控远程服务器(目前仅限于linux系统)的cpu、内存、网络、磁盘。

Mycat-eye运行过程中需要依赖zookeeper,因此需要先安装zookeeper。

安装

  • Zookeeper安装
  • MyCat-Web安装

访问

http://192.168.200.210:8082/mycat

配置

  • 开启MyCat的实时统计功能(server.xml)
<property name="useSqlStat">1</property>. <!--1为开启实时统计、0为关闭>
  • 在MyCat监控界面配置服务地址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值