ShardingSphere-Proxy(一)
1.现实中的问题
我们知道数据库的数据,基本80%的业务是查询,20%的业务涵盖了增删改,经过长期的业务变更和积累数据库的数据到达了一定的数量之后,直接影响的是用户与系统的交互,查询时的速度,插入数据时的流畅度,系统的可用性,这些指标对用户体验都是会有影响的,不说用户,你自己用是什么感觉?我经历过且常见的无非以下几个解决方案,从用户,代码,数据库,不知道有没有人跟我有相似的经历
1.最简单粗暴的就是从用户下手,也就是通过业务的手段来约束,限定查询时间,限定查询条件,大批量需要申请后台工程师导出,不是说对这些方法嗤之以鼻,在某些场景下这样也是不错的方法.
2.检查代码,查询语句什么的能优化的做下优化,这一点确实也是比较关键的,再好的架构和服务器,也顶不住递归死循环查询这些.
3.结合一些数据库监控工具或者对常用查询的表,做一些数据库基本的属性设定,例如数据库加索引,分分区.
虽然确实可以使用这些技术手段来提升本身的查询速度,但是达到一定量级,这些手段得到的改善也不是很大,因为数据的量是实实在在的存在,假设此时加上并发量的增大,数据库引擎在查询或者计算时,使用的是服务器的CPU和内存,当资源消耗过高时,直接降低系统可用性,往往这个时候就需要通过整体业务上的变通或者技术架构的转换上来着手解决问题了。
然而现实中业务上的改变,可能在落实上会存在很大的问题,但是可以从技术架构上来尝试解决,主要在代码整体架构或者数据库存储架构解决了,我们主要介绍数据架构层面的方案。
1.分库
在水平分库中,就是将数据库中的表,存到不同的数据库,但是不同库的表数量和结构是一样的,只是每个库的数据都不一样,没有交集,库的并集是全量数据
在垂直分库中,以表为依据,按照业务归属不同,将不同的表拆分到不同的库中,不同的库存储的可能是不同的表,库的并集是全量数据
2.分表
水平分表就是将一张表分为多张表,表的结构都一样,每个表的数据都不一样,没有交集,所有表的并集是全量数据;
垂直分表将一张表字段拆分为不同的表,合并起来就是整个全量数据,但是这种可以归属于设计之初的设计缺陷
虽然使用分库分表可以一定程度解决上面所说的问题,但是分了之后也有可能再变大,总不能一直无脑拆分下去把,此时应该使用读写分离,也就是说读写分离应该是在分库分表的基础之上来实施的。
2.什么是ShardingSphere-Proxy?
在ShardingSphere
中一共有3个核心组件 ShardingSphere-JDBC
定位是一个Java的框架 、ShardingSphere-Proxy
、ShardingSphere-Sidecar
还在开发中,我们主要介绍ShardingSphere-Proxy和ShardingSphere-Proxy的实际应用。
ShardingSphere-Proxy定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持,主要目的对数据库实现分库分表和读写分离,应用场景不管是传统的单体项目,或者现有流行的微服务项目中都可以使用,但是目前只支持 MySQL 和 PostgreSQL
, 它在整个系统架构中定位是一个数据库中间件
。
在这里我们选择使用ShardingSphere-Proxy
中间件,来作为我们实现分库分表的工具,写这个的目的主要是记录ShardingSphere-Proxy的使用和一些基本的概念,至于说具体分成什么样,如果您只想知道到底是分表,还是分库,又或者是分库分表,我可能帮不了什么,但是您可以按照现在所困扰的问题展开分析,然后使用ShardingSphere-Proxy落地。
3.分库分表方案
实现分库分表的方案根据不同的需求可能会延伸出很多,但是我们在逻辑上抽象出2种,一种是进程内
和业务系统集成,一种是拆分出分库分表作为独立进程
,
1.进程内方案
进程内的方案通常是将分库分表实现业务放到系统内部,通常存在以下缺陷
1.系统和分库分表会存在资源竞争
2.一个异常的话,另外一个也会异常,依赖性太强。
3.无法适应异构,对其他语言的支持
2.进程外方案
进程外方案将分库分表逻辑拆分,使用单独的工具实现客户端将请求发送到系统, 系统通过数据库中间件在内部进行分库分表逻辑,然后存储数据库,通常存在以下缺陷
1.维护量上升
2.相对进程内,性能会差一点,但是如果内网部署基本可以接受
4.ShardingSphere-Proxy基本概念
使用ShardingSphere-Proxy
在进行实现分库分表或者查询时,主要有6个阶段,这整个阶段中的核心步骤是由中间件来实现的。
1.选择具体数据库
2.sql解析将中间件连接成为真实数据库连接
3.sql路由,选择一个真实数据库执行
4.sql重写优化
5.sql执行真实数据库获取结果
6.结果合并从多个表或者库中获取结果
用户主要是针对路由规则
的配置,实现将数据分片
到不同表以及不同的库,那我们应该思考如何对数据进行分片呢,需要哪些条件?
1.分片键:数据表中的字段,选择以哪个字段作为分片的条件。
2.分片算法:它的作用就是根据分片数据字段如何去实现数据的分片。
5.项目环境及搭建
ShardingSphere-Proxy
是由java开发,所以首先我们需要准备java
的基本环境。
1.环境准备
- 1.下载Mysql
- 2.下载jdk1.8 提取码:wgl2
- 3.下载mysql-connector-java-5.1.47.jar
- 4.下载ShardingSphere-Proxy
- 4.1 使用tar命令解压 tar zxvf apache-shardingsphere-5.0.0-shardingsphere-proxy-bin.tar.gz
- 4.2 将下载的mysql-connector-java-5.1.47.jar 拷贝到lib目录下
6.分库分表配置
1.ShardingSphere-Proxy 分表
1.以数据采集数据库的电源信息数据表为例,如果没有数据库就创建数据库
2.在ShardingSphere-Proxy
中的conf下找到config-sharding.yaml
配置文件进行配置
3.在config-sharding.yaml
中配置数据库连接
dataSources:
dataacquisitionsources_0:
url: jdbc:mysql://localhost:3306/dataacquisition?serverTimezone=UTC&useSSL=false
username: root
password: 123456
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
4.配置表和数据的分片规则
- actualDataNodes节点用来配置分成几张表{0..1}就是2张,如果配置10张那就{0..9}
- 如果多张表分表就使用多个逻辑表名和节点,注意一定要注意配置格式
rules:
- !SHARDING
tables:
powerinformation:# 逻辑表名
actualDataNodes: dataacquisitionsources_0.powerinformation_${0..1} #分表
tableStrategy: #数据分表策略
standard:
shardingColumn: id #分表字段
shardingAlgorithmName: powerinformation_MOD
shardingAlgorithms:
powerinformation_MOD:
type: MOD
props:
sharding-count: 2
5.配置客户端连接虚拟数据库,一般和真实库名对应
schemaName: dataacquisition
6.打开配置目录的server.yaml配置文件,来设置用户和密码
rules:
- !AUTHORITY
users:
- root@%:root
- sharding@:sharding
provider:
type: ALL_PRIVILEGES_PERMITTED
7.启动bin目录下的start.bat
,如果出现以下画面,那么恭喜你中间件被成功配置
8.使用客户端连接虚拟服务器3307端口
9.执行脚本在虚拟服务器上创建表结构,那么中间件会默认按照预定的规则分表
create table powerinformation
(
id int not null AUTO_INCREMENT PRIMARY key,
Station Text,
voltage DECIMAL,
resistance DECIMAL,
electricity DECIMAL,
createDate DATETIME
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=2
;
10.打开客户端查看真实库已经分表成功
2.ShardingSphere-Proxy 分库
1.创建2个数据库分别取名为dataacquisition_0和dataacquisition_1
2.打开配置文件,对代理配置不同数据库连接
dataSources:
dataacquisitionsources_0:
url: jdbc:mysql://127.0.0.1:3306/dataacquisition_0?serverTimezone=UTC&useSSL=false #连接库0
username: root
password: sa@123456
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
dataacquisitionsources_1:
url: jdbc:mysql://127.0.0.1:3306/dataacquisition_1?serverTimezone=UTC&useSSL=false #连接库1
username: root
password: sa@123456
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
3.配置分库规则,由于现在是2个不同的库,所以不需要配置数据分到表的规则
rules:
- !SHARDING
tables:
powerinformation:
actualDataNodes: dataacquisitionsources_${0..1}.powerinformation #库名表达式
databaseStrategy: #数据分库策略
standard:
shardingColumn: id
shardingAlgorithmName: powerinformation_MOD
shardingAlgorithms:
powerinformation_MOD:
type: MOD
props:
sharding-count: 2
4.在虚拟库中添加表和数据将会分配到2个不同的库
3.ShardingSphere-Proxy 分库分表
1.按照分库的操作执行,分库配置不变
2.配置文件配置分库分表的规则
rules:
- !SHARDING
tables:
powerinformation:
actualDataNodes: dataacquisitionsources_${0..1}.powerinformation_${0..1}
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: powerinformation_MOD
databaseStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: powerinformation_MOD
shardingAlgorithms:
powerinformation_MOD:
type: MOD
props:
sharding-count: 2
7.搭建常见问题
1.由于是yaml文件,一定要注意对应节点的格式对齐
2.建议使用大于等于5.0.0+版本 折腾4.0.0版本被恶心吐了
3.如果出现 near 0这种错误就是在配置中使用了特殊符号 建议使用 下划线的"_"
ShardingSphere-Proxy(一)的更多相关文章
- 重磅|Apache ShardingSphere 5.0.0 即将正式发布
Apache ShardingSphere 5.0.0 GA 版在经历 5.0.0-alpha 及 5.0.0-beta 接近两年时间的研发和打磨,终于将在 11 月份与大家正式见面! 11 月 10 ...
- 打造基于 PostgreSQL/openGauss 的分布式数据库解决方案
在 MySQL ShardingSphere-Proxy 逐渐成熟并被广泛采用的同时,ShardingSphere 团队也在 PostgreSQL ShardingSphere-Proxy 上持续发力 ...
- [原创]Sharding-Sphere之Proxy初探
大家好,拓海(https://github.com/tuohai666)今天为大家分享Sharding-Sphere推出的重磅产品:Sharding-Proxy!在之前闪亮登场的Sharding-Sp ...
- DBAplus社群线上分享----Sharding-Sphere之Proxy初探
功能 Cobar Mycat Heisenberg Shark TDDL Sharding-JDBC 是否开源 开源 开源 开源 开源 部分开源 开源 架构模型 Proxy架构 Proxy架构 Pro ...
- 分库分表(2) --- ShardingSphere(理论)
ShardingSphere---理论 ShardingSphere在中小企业需要分库分表的时候用的会比较多,因为它维护成本低,不需要额外增派人手;而且目前社区也还一直在开发和维护,还算是比较活跃. ...
- spring boot:用shardingjdbc实现多数据源的分库分表(shardingsphere 4.1.1/spring boot 2.3.1)
一,shardingjdbc的用途 1,官方站介绍: Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈, 它由 JDBC.Proxy 和 Sidecar( ...
- 面试官: ShardingSphere 学一下吧
文章目录 目录 一.ShardingSphere简介 二.Sharding-JDBC 2.1 Sharding-JDBC实现水平分表 2.2 Sharding-JDBC实现水平分库 2.3 Shard ...
- ShardingSphere 看这一篇就够了
1.什么是shardingSphere Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBC.Proxy 和 Sidecar(规划中)这 ...
- 易华录 X ShardingSphere|葫芦 App 后台数据处理的逻辑捷径
"ShardingSphere 大大简化了分库分表的开发和维护工作,对于业务的快速上线起到了非常大的支撑作用,保守估计 ShardingSphere 至少为我们节省了 4 个月的研发成本.& ...
- ShardingSphere 知识库更新 | 官方样例集助你快速上手
Apache ShardingSphere 作为 Apache 顶级项目,是数据库领域最受欢迎的开源项目之一.经过 5 年多的发展,ShardingSphere 已获得超 14K Stars 的关注, ...
随机推荐
- SpringBoot 自定义MessageConvert
创建一个MessageConvert类,实现HttpMessageConvert接口 简单实现,只完成写功能.其他默认false package com.boot.converter; import ...
- TCP三次握手原理
本文主要讲述的是 1.TCP协议三次握手原理,以及为什么要三次握手,两次握手带来的不利后果. 2.TCP协议四次挥手原理,为什么要四次挥手. TCP协议三次握手原理: 首先,给张图片,建立TCP三次握 ...
- HTTP攻击与防范-PHP安全配置
实验目的 1.了解PHP攻击带来的危险性. 2.掌握PHP攻击的原理与方法 3.掌握防范攻击的方法 实验原理 由于网站服务器是以单一系统使用者的模式在运行,因此这个系统的使用者账号必须能够读取每个使用 ...
- 【windows 操作系统】线程句柄HANDLE与线程ID的关系
什么是句柄 句柄是一种指向指针的指针.我们知道,所谓指针是一种内存地址.应用程序启动后,组成这个程序的各对象是住留在内存的.如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访 ...
- Python常用内建模块和第三方库
目录 内建模块 1 datetime模块(处理日期和时间的标准库) datetime与timestamp转换 str与datetime转换 datetime时间加减,使用timedelta这个类 转 ...
- XML序列化反序列化
using System; using System.Collections.Generic; using System.IO; using System.Xml.Serialization; nam ...
- 基于JQuery打造无缝滚动新闻
JQuery实现 新闻无缝滚动 一.使用"首尾追加"实现无缝滚动 <head lang="en"> <meta charset="U ...
- VMware虚拟机三种网络模式
VMware三种网络模式 在学习中经常遇到Vmware虚拟机网络设置有问题,可能是因为你没有理解这三种网络模式的工作原理.VMware虚拟机常见的网络类型有bridged(桥接).NAT(地址转换). ...
- 在矩池云上复现 CVPR 2018 LearningToCompare_FSL 环境
这是 CVPR 2018 的一篇少样本学习论文:Learning to Compare: Relation Network for Few-Shot Learning 源码地址:https://git ...
- SQL从零到迅速精通【实用函数(3)】
1.LOWER()函数 使用LOWER函数将字符串中所有字幕字符转换为小写,输入语句如下. SELECT LOWER('BEAUTIFUL'),LOWER('Well'); 2.UPPER()函数 S ...