需求:你提供SAAS服务,你有你有2个租户(商户),各自的数据进各自的库,而你不希望你的微服务java里默认配置多个租户数据源,数据连接池太多,而且后面动态增加也不方便,诸如此类很多问题。

方案:ShardingSphere-Proxy基于数据库表有一个租户字段

1.ShardingSphere-Proxy家族产品简介

ShardingSphere-Proxy和ShardingSphere-JDBC都是ShardingSphere的不同产品。

ShardingSphere-JDBC是客户端分库分表,而ShardingSphere-Proxy是一个中间层,客户端代码无需配置修改,定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。 目前提供 MySQL 和 PostgreSQL(兼容 openGauss 等基于 PostgreSQL 的数据库)版本,它可以使用任何兼容 MySQL/PostgreSQL 协议的访问客户端(如:MySQL Command Client, MySQL Workbench, Navicat 等)操作数据,对 DBA 更加友好。

  • 向应用程序完全透明,可直接当做 MySQL/PostgreSQL 使用。
  • 适用于任何兼容 MySQL/PostgreSQL 协议的的客户端。

2.分库分表和多租户

分库分表一般使用的是hash取模的方式,很多类似产品都是这样实现的。

ShardingSphere有一个特别的亮点是基于表中某一个字段进行分库分表。

我们可以利用这个实现多租户。

至于ShardingSphere-Proxy和ShardingSphere-JDBC配置使用是一样的,只是一个客户端一个中间层而已。

3.系统环境依赖

很多参考信息包括官方网站都不是很友好,导致安装使用过程中遇到太多问题需要解决,那么我这里就把完整的教程和注意事项写下来,照着做就行了。

环境:CentOS7.8

ShardingSphere-Proxy官方网站:ShardingSphere

安装java

ShardingSphere-Proxy需要基于java,如果已经安装可以忽略。

另外本机内存需要注意需要4G内存以上,不然Java启动会报错内存不足。

我们这边假设是从阿里云进行购买ECS,自己安装。

#cd /usr/local

解压jdk,1.8以上版本皆可
#tar -zxvf jdk-8u221-linux-x64.tar.gz

将jdk配置到/etc/profile
#vim /etc/profile

export JAVA_HOME=/usr/local/jdk1.8.0_221
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}

通过命令source /etc/profile让profile文件立即生效
#source /etc/profile

查看是否安装好

#java -version

只是source /etc/profile如果还报错nohup: failed to run command ‘java’: No such file or directory

需要重启才可以生效

#reboot

4.下载安装ShardingSphere-Proxy

下载 :: ShardingSphere

下载地址:Apache Downloads

#cd /usr/local
#wget https://dlcdn.apache.org/shardingsphere/5.0.0/apache-shardingsphere-5.0.0-shardingsphere-proxy-bin.tar.gz
#tar -xzvf apache-shardingsphere-5.0.0-shardingsphere-proxy-bin.tar.gz

解压好之后目录结构如下:

conf是配置目录,bin是启动目录,lib是库目录。

如果使用mysql需要把mysql对应的jar拷贝到这里。

#cd ./lib

wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar

5.下载安装配置ShardingSphere-Proxy

回到conf目录

修改2个文件其他文件暂时不用动

server.xml和config-sharding.yaml

需要注意的是ShardingSphere-Proxy其他版本例如4.0的配置和5.0有些许差异,特别是其他博文是4.0的例子,不能直接拿来就用,会启动报错。

5.0的配置默认都给你注释了,你就用官方给你的就行。

server.xml

rules:- !AUTHORITYusers:- root@%:root- sharding@:shardingprovider:type: ALL_PRIVILEGES_PERMITTED- !TRANSACTIONdefaultType: XAproviderType: Atomikosprops:max.connections.size.per.query: 1acceptor.size: 16  # The default value is available processors count * 2.executor.size: 16  # Infinite by default.proxy.frontend.flush.threshold: 128  # The default value is 128.# LOCAL: Proxy will run with LOCAL transaction.# XA: Proxy will run with XA transaction.# BASE: Proxy will run with B.A.S.E transaction.proxy.transaction.type: LOCALproxy.opentracing.enabled: falseproxy.hint.enabled: falsequery.with.cipher.column: true# 这个属性会打印sql 语句sql.show: true
# 该属性会允许范围查询,默认为 false ,要是我们分库分表是水平切分,可以想得到范围查询会像广播去查每一个表,比较耗性能能。allow.range.query.with.inline.sharding: true

例如你有2个完全一样的库,你有2个商户,各自的数据进各自的库。

schemaName: sharding_dbdataSources:his95001:url: jdbc:mysql://localhost:3306/order1001?useUnicode=true&characterEncoding=utf8username: rootpassword: rootconnectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1his95002:url: jdbc:mysql://localhost:3306/order1002?useUnicode=true&characterEncoding=utf8username: rootpassword: rootconnectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1rules:
- !SHARDINGtables:tb_order:actualDataNodes: order1001.tb_order,order1002.tb_ordertb_content:actualDataNodes: order1001.tb_content,order1002.tb_contentdefaultDatabaseStrategy:standard:shardingColumn: tenantidshardingAlgorithmName: database_inlineshardingAlgorithms:database_inline:type: INLINEprops:algorithm-expression: order${tenantid}

需要注意的是数据库名是  前缀+租户id  不可以有下划线横线之类,记得之前的4.0版本会出错,还有数据库密码不能保护#,其他特殊字符我没注意,如果报错数据库连不上也是这些问题。

启动文件在bin目录

默认是启动3307端口,你可以修改为你需要的端口日志位置,如果JVM需要调休可以修改对应配置。

#./bin/start.sh

需要看日志,如果有异常,一开始主要是配置异常那么你要适当的去修改。

#cat ./stdout.log

例如下面是缺少mysql-connector-java-5.1.49.jar

成功启动会提示:frontend.ShardingSphereProxy - ShardingSphere-Proxy start success

6.使用ShardingSphere-Proxy

启动好之后可以使用navicat.exe测试连接。

我们可以看到现在我们链家我们搭建的ShardingSphere-Proxy的服务器所在的ip+3007端口可以看到代理的数据库了。

如果你点开其中一个表可以看到数据是聚合的。

实际上你的SQL需要带对应的租户id就路由到对应的数据库了。

7.安装Zookeeper

https://linuxstyle.blog.csdn.net/article/details/122367289

修改server.yaml  去掉注释就行了

#mode:
#  type: Cluster
#  repository:
#    type: ZooKeeper
#    props:
#      namespace: governance_ds
#      server-lists: localhost:2181
#      retryIntervalMilliseconds: 500
#      timeToLiveSeconds: 60
#      maxRetries: 3
#      operationTimeoutMilliseconds: 500
#  overwrite: true

8.最佳实践

sharding-jdbc分表查询优化:maxConnectionsSizePerQuery

sharding-jdbc配置maxConnectionsSizePerQuery当存在分表,且查询语句不包含分表键时,每个查询都需要分解成不同的分表sql查询数据库,能够同时执行的sql数量由此参数设置;

这个数据最好=你的分表数量

sharding-jdbc分表查询优化:maxConnectionsSizePerQuery_临地的博客-CSDN博客_max.connections.size.per.query

ShardingSphere-Proxy分库分表以及多租户安装使用相关推荐

  1. Shardingsphere的分库分表+读写分离+分页条件查询

    Shardingsphere的分库分表与读写分离 导入依赖 <dependencies><dependency><groupId>org.springframewo ...

  2. server sql 水平分表_springboot集成Shardingsphere进行分库分表

    当公司业务量上去之后,单表支撑不了的时候,分库分表就是一个绕不开的话题,小弟最近新入职一家公司,发现这边公司在用ShardingSphere来进行分库分表,之前没接触过这方面,所以就写了个demo学习 ...

  3. ShardingSphere(八) 分库分表的多种分片策略

    在之前文章<ShardingSphere(二) 水平分表配置搭建,实现分表写入读取>中,我们介绍了数据库的水平分表配置,在文章中只介绍了最简单的行表达式分表配置方式,但往往在实际中我们的业 ...

  4. ShardingSphere JDBC 分库分表 读写分离 数据加密

    简介 在上篇文章中,在本地搭建了运行环境,本地来体验下ShardingSphere JDBC的三个功能:分库分表.读写分离.数据加密 示例运行 首先把概念先捋一捋,参考下面的文档: 数据分片 读写分离 ...

  5. mysql proxy 分库分表_OneProxy实现MySQL分库分表

    简介 Part1:写在最前 随着网站的壮大,MySQL数据库架构一般会经历一个过程: 当我们数据量比较小的时候,一台单实例数据库足矣.等我们数据量增大的时候,我们会采用一主多从的数据库架构来降低我们的 ...

  6. 【分库分表】ShardingSphere分库分表实战

    一.参考资料 概览 :: ShardingSphere ShardingSphere之分库&分表_JustryDeng-CSDN博客_shardingsphere 分表 利用ShardingS ...

  7. ShardingSphere分库分表(SpringBoot+mybatis+mysql)配置

    一.什么是ShardingSphere 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务. 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增 ...

  8. 分库分表:Sharding-JDBC,mycat

    1.关于分表(这里指的肯定是水平分表) 在我的思路中 如果要实现分表,首先要考虑每条记录以什么样的规则来区分放到哪一张表中.最直接的方式就是以某个字段或者某些字段通过某种算法来得出一个结果,对应到一张 ...

  9. mysql多字段分库分表基因码_mysql数据库优化方案之分库分表,轻松解决亿级数据问题...

    今天介绍下sharding-sphere,主要介绍他的特性,分库分表的技术的详解. (一)下载源码官网地址获取源码https://shardingsphere.apache.org/index_zh. ...

最新文章

  1. 我们死去后,宇宙还能记住我们吗?
  2. BGP建立邻居的详细过程
  3. 【Linux】一步一步学Linux——builtin命令(215)
  4. 什么是 ecommerce 的 distributor 概念以及如何实现 website redirect
  5. JSON格式数据与数据组件
  6. 测试基础【第七篇】测试报告
  7. 杭电oj首字母变大写
  8. 4、Python-列表
  9. node.js 资料
  10. opencv3.4.0在ubuntu16.04上的安装
  11. #ifdef 的使用
  12. JavaScript文档对象模型document对象查找Html元素(2)
  13. javascript探秘-检测浏览器和操作系统
  14. 12.MongoDB之固定集合(Capped Collections)
  15. 【转】周鸿祎:网络业的柔道搏击术
  16. 机器学习实战(Machine Learning in Action)学习笔记————09.利用PCA简化数据
  17. 【前端微服务化】使用飞冰搭建前端微服务化框架
  18. standard、singleTop、singleTask和singleInstance原理分析
  19. AjaxPro2 方法未定义,对象不支持此方法或属性,解决办法
  20. react项目如何运行

热门文章

  1. ajax 加载 提示 锁屏,js锁屏解屏通过对$.ajax进行封装实现
  2. python wait_window_pywinauto客户端自动化---窗口等待方法
  3. jquery发送put请求_浅谈GET,POST,PUT发送请求
  4. eplan文本怎么换行_EPLAN几个使用的小技巧,非常有用
  5. 设备初始化缩水篇(一)
  6. 多重继承_多重继承和菱形问题
  7. 鲲鹏服务器拦截系统调用,鲲鹏服务器unicfg工具适配OpenEuler 20.03问题
  8. c++ resizereserve
  9. 强化学习(三) - Gym库介绍和使用,Markov决策程序实例,动态规划决策实例
  10. Node.js开发WEB项目后端接口API,基于mysql5.7数据库(小试牛刀)