mysql运维------分库分表
1. 介绍
问题分析:
随着互联网以及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈:
IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较低。请求数据太多,带宽不够,网络IO瓶颈。
CPU瓶颈:排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源,请求数太多,CPU出现瓶颈。
分库分表的中心思想就是将数据分散存储,使得单一数据库/表的数据量变小来缓解的单一数据库的性能问题,从而达到提升数据库性能的目的。
拆分策略
垂直拆分
a. 垂直分库
将业务拆分成几个独立的单元, 根据业务单元将原来的单库分成多个结构不同的库, 用外键相连,数据的并集是原来的单库
b. 垂直分表
把原来支持多个业务的宽表拆分成多个窄表,每个窄表之间通过外键相连, 他们的并集是原来的那个宽表
水平拆分
a. 水平分库
根据某个字段(比如自增id,时间戳)按照一定的策略(取模,范围,hash,枚举,应用指定,日期等)讲原来的单库拆分成多个结构相同的库
b. 水平分表
根据某个字段(比如自增id,时间戳)按照一定的策略(取模,范围,hash,枚举,应用指定,日期等)讲原来的单库拆分成多个结构相同的库
2. 实现技术
Mycat
Mycat是开源的、活跃的、基于Java语言编写的MySQL数据库中间件。它位于mysql与应用程序之间,经过相应的配置后,应用程序通过mycat来访问mysql,mycat通过分片规则来决定应用程序应该访问哪个分库, 而应用程序感觉不到.
a. 下载
b. 安装
Mycat是采用Java语言开发的开源的数据库中间件,支持Windows和Linux运行环境,需要提前在准备好的服务器中安装如下软件:
MySQL
JDK
Mycat
- 利用工具上传Mycat压缩包到服务器
Mycat-server-1.6.7.3-release-20210913163959-linux.tar.gz
- 解压Mycat的压缩包
tar -zxvf Mycat-server-1.6.7.3-release-20210913163959-linux.tar.gz -C /usr/local/
mycat目录结构
[pmish@localhost mycat]$ ll /usr/local/mycat/
总用量 12
drwxr-xr-x. 2 root root 190 4月 11 09:53 bin
drwxrwxrwx. 2 root root 6 4月 15 2020 catlet
drwxrwxrwx. 4 root root 4096 4月 11 09:53 conf
drwxr-xr-x. 2 root root 4096 4月 11 09:53 lib
drwxrwxrwx. 2 root root 6 8月 31 2021 logs
-rwxrwxrwx. 1 root root 227 9月 13 2021 version.txt
目录 | 作用 |
---|---|
bin | 存放可执行文件,用于启动停止mycat |
conf | 存放mycat的配置文件 |
lib | 存放mycat的项目依赖包(jar) |
logs | 存放mycat的日志文件 |
c. mycat架构图
d.以三台服务器分片为例
- 环境准备:
- 分片配置(
/usr/local/mycat/conf/schema.xml
)
2-1. 权限配置
- 启动服务
cd /usr/local/mycat
bin/mycat start #启动
bin/mycat stop #停止
mycat启动之后占用端口8066
启动完毕之后,可以查看logs目录下的启动日志,查看Mycat是否启动完成。
tail -f logs/wrapper.log
通过如下指令,连接并登录Mycat
mysql -h -P 8066 -uroot -p
- 配置文件介绍
schema.xml: 定义逻辑表和逻辑数据库
schema.xml
作为Mycat中最重要的配置文件之一,涵盖了MyCat的逻辑库、逻辑表、分片规则、分片节点及数据源的配置。
schema标签
<schema>
标签用于定义MyCat实例中的逻辑库,一个MyCat实例中,可以有多个逻辑库,可以通过schema标签来划分不同的逻辑库。MyCat中的逻辑库的概念,等同于MySQL中的database概念,需要操作某个逻辑库下的表时,也需要切换逻辑库(use xxx)。
核心属性:
● name:指定自定义的逻辑库库名
● checkSQLschema:在SQL语句操作时指定了数据库名称,执行时是否自动去除;true:自动去除,false:不自动去除
● sqlMaxLimit:如果未指定limit进行查询,列表查询模式查询多少条记录
<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: 用来配置mycat系统配置和用户配置
server.xml
配置文件包含了MyCat的系统配置信息,主要有两个标签:system、user。
system标签
user标签
修改配置文件进行分片
1. 垂直拆分
场景
在业务系统中,涉及以下表结构,但是由于用户与订单每天都会产生大量的数据,单台服务器的数据存储及处理能力是有限的,可以对数据库进行拆分,原有的数据库表如下。
分别在三台MySQL中创建数据库shopping。
配置
全局表配置
对于省、市、区/县表,是属于数据字典表,在多个业务模块中都可能会遇到,可以将其设为全局表,利于业务操作。
2. 水平拆分
场景
单表太大: 在业务系统中,有一张表(日志表),业务系统每天都会产生大量的日志数据,单台服务器的数据存储及处理能力是有限的,可以对数据库表进行拆分。
配置
分片规则
1. 按指定指端值的范围
2. 对指定字段的值取模
3. 枚举
通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点上,本规则适用于按照省份、性别、状态拆分数据等业务。
4. 应用指定
运行阶段由应用自主决定路由到哪个分片,直接根据字符子串(必须是数字)计算分片号。
5. 一致性hash
一致性hash,相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加改变原来数据的分区位置。
6. 固定分片hash算法
7. 字符串hash解析
截取字符串中的指定位置的子字符串,进行hash算法,算出分片
8. 按(天)日期分片
9. 按(自然月)日期分片
Mycat管理及监控
1. Mycat原理
2. Mycat管理
Mycat默认开通2个端口,可以在server.xml中进行修改。
8066数据访问端口,进行DML和DDL操作。
9066数据库管理端口,mycat服务管理控制功能,用于管理mycat的整个集群状态
mysql -h 192.168.200.210 -p 9066 -uroot -proot
3. Mycat-eye
介绍
Mycat-web(Mycat-eye)是对mycat-server提供监控服务,功能不局限于对mycat-server使用。他通过JDBC连接对Mycat、Mysql监控,监控远程服务器(仅限于Linux系统)的cpu、内存、网络、磁盘。
Mycat-eye运行过程中需要依赖zookeeper,因此需要先安装zookeeper。
安装
Zookeeper安装
1.上传安装包
zookeeper-3.4.6.tar.gz
2.解压
tar -zxcf zookeeper-3.4.6.tar.gz -C /usr/local/
3.创建数据存放目录
cd /usr/local/zookeeper-3.4.6/
mkdir data
4.修改配置文件名称并配置
cd config
mv zoo_sample.cfg zoo.cfg
5.配置数据存放目录
dataDir=/usr/local/zookeeper-3.4.6/data
6.启动zookeeper
bin/zkServer.sh start
#启动
bin/zkServer.sh status
#查看状态
Mycat-web安装
1.上传安装包
Mycat-web.tar.gz
2.解压
tar -zxvf Mycat-web.tar.gz -C /usr/local/
3.目录介绍
lib —> 依赖jar包
mycat-web —>mycat-web项目
readme.txt
start.jar —>启动jar
start.sh —>linux启动脚本
4.启动
sh start.sh
5.访问
http://192.168.200.210:8082/mycat
mysql运维------分库分表的更多相关文章
- MySQL纯透明的分库分表技术还没有
MySQL纯透明的分库分表技术还没有 种树人./oneproxy --proxy-address=:3307 --admin-username=admin --admin-password=D033 ...
- Mysql中的分库分表
mysql中的分库分表分库:减少并发问题分表:降低了分布式事务分表 1.垂直分表 把其中的不常用的基础信息提取出来,放到一个表中通过id进行关联.降低表的大小来控制性能,但是这种方式没有解决高数据量带 ...
- Mycat安装并实现mysql读写分离,分库分表
Mycat安装并实现mysql读写分离,分库分表 一.安装Mycat 1.1 创建文件夹 1.2 下载 二.mycat具体配置 2.1 server.xml 2.2 schema.xml 2.3 se ...
- Docker安装Mycat并实现mysql读写分离,分库分表
Docker安装Mycat并实现mysql读写分离,分库分表 一.拉取mycat镜像 二.准备挂载的配置文件 2.1 创建文件夹并添加配置文件 2.1.1 server.xml 2.1.2 serve ...
- mysql、oracle分库分表方案之sharding-jdbc使用(非demo示例)
选择开源核心组件的一个非常重要的考虑通常是社区活跃性,一旦项目团队无法进行自己后续维护和扩展的情况下更是如此. 至于为什么选择sharding-jdbc而不是Mycat,可以参考知乎讨论帖子https ...
- MYSQL性能优化--分库分表
1.分库分表 1>纵向分表 将本来可以在同一个表的内容,人为划分为多个表.(所谓的本来,是指按照关系型数据库的第三范式要求,是应该在同一个表的.) 分表理由:根据数据的活跃度进行分离,(因为不同 ...
- mysql为什么要分库分表?
1 基本思想之什么是分库分表?从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上. 2 基本思想之为什么要分库分表? 单表操作数据量有最优值, ...
- mycat+ mysql集群 分库分表
mycat介绍Mycat数据库分库分表中间件国内最活跃的.性能最好的开源数据库中间件!Mycat关键特性关键特性支持SQL92标准支持MySQL.Oracle.DB2.SQL Server.Postg ...
- 实现对MySQL数据库进行分库/分表备份(shell脚本)
工作中,往往数据库备份是件非常重要的事情,毕竟数据就是金钱,就是生命!废话不多,下面介绍一下:如何实现对MySQL数据库进行分库备份(shell脚本) Mysq数据库dump备份/还原语法: mysq ...
- MyCat:对MySQL数据库进行分库分表
本篇前提: mycat配置正确,且能正常启动. 1.schema.xml <table>标签: dataNode -- 分片节点指定(取值:dataNode中的name属性值) rule ...
随机推荐
- Python爬虫之用Selenium做爬虫
我们在用python做爬虫的时候,除了直接用requests的架构,还有Scrapy.Selenium等方式可以使用,那么今天我们就来聊一聊使用Selenium如何实现爬虫. Selenium是什么? ...
- 解决spring boot 2.6.4版本循环依赖问题
引用spring boot 2.6.4 版本 报循环依赖错误 *************************** APPLICATION FAILED TO START ************* ...
- .Net 开发 web.config参数获取
System.Configuration.ConfigurationSettings.AppSettings["title"] 对应着 web.config下面的 <conf ...
- 【原创】SeetaFace2 Android编译
SeetaFace2 github上有很完整的编译说明,但是自己编译过程中还是遇到了一点小问题.记录一下 编译环境: wsl ubuntu 20.04 执行编译命令 cmake .. -DCMAKE_ ...
- cmake使用boost静态库,错误提示 Could NOT find Boost (missing: Boost_INCLUDE_DIR) (Required is at least version "1.48")
使用的是Cmake-gui 编译. 问题出在C盘路径下找不到 Boost ,是否需要把boost的路径添加到系统Path 中? 任然不能解决. 更改源码: 找到下面这几行代码(你可以搜索) messa ...
- 网络存储服务ip-san搭建
网络存储服务ip-san搭建 ip-san简称SAN(Storage Area Network),中文意思存储局域网络,ip- ...
- Surge 开启脚本功能后,京东自动签到总结
本人小白,花费半天时间才弄好,写下这个给自己和后来人指路. Surge 开启脚本功能后,京东自动签到获取京豆总结: 1.注意 去 Raw 真实地址下载 js https://github.com/No ...
- 通过Dnsmasq自建干净的DNS服务
不晓得为撒,用网上的一些公共DNS服务的时候,总是莫名其妙的有些网站无法解析,有时候114能解析,阿里DNS不行或者腾讯DNS不行,导致总是来回切换DNS,很是烦心. 于是就想着自己搭建一个DNS服务 ...
- 区块链技术与应用:02-BTC-密码学原理
本文为个人整理笔记,知识点来源于北京大学肖臻老师的<区块链技术与应用>公开课视频:https://www.bilibili.com/video/BV1Vt411X7JF?from=sear ...
- Spring源码构建踩坑记录
1:Kotlin: warnings found and -Werror specified Kotlin将程序中的警告变更为错误导致的问题,只需要改变一下级别即可,注意看是那个模块的 解决方式:fi ...